diff options
| -rw-r--r-- | fs/xfs/xfs_filestream.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/fs/xfs/xfs_filestream.c b/fs/xfs/xfs_filestream.c index 9b715dce5699..9124425b7f2f 100644 --- a/fs/xfs/xfs_filestream.c +++ b/fs/xfs/xfs_filestream.c | |||
| @@ -744,9 +744,15 @@ xfs_filestream_new_ag( | |||
| 744 | * If the file's parent directory is known, take its iolock in exclusive | 744 | * If the file's parent directory is known, take its iolock in exclusive |
| 745 | * mode to prevent two sibling files from racing each other to migrate | 745 | * mode to prevent two sibling files from racing each other to migrate |
| 746 | * themselves and their parent to different AGs. | 746 | * themselves and their parent to different AGs. |
| 747 | * | ||
| 748 | * Note that we lock the parent directory iolock inside the child | ||
| 749 | * iolock here. That's fine as we never hold both parent and child | ||
| 750 | * iolock in any other place. This is different from the ilock, | ||
| 751 | * which requires locking of the child after the parent for namespace | ||
| 752 | * operations. | ||
| 747 | */ | 753 | */ |
| 748 | if (pip) | 754 | if (pip) |
| 749 | xfs_ilock(pip, XFS_IOLOCK_EXCL); | 755 | xfs_ilock(pip, XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT); |
| 750 | 756 | ||
| 751 | /* | 757 | /* |
| 752 | * A new AG needs to be found for the file. If the file's parent | 758 | * A new AG needs to be found for the file. If the file's parent |
