The filestreams code may take the iolock on the parent inode while holding it
on a child. This is the only place in XFS where we take both the child and
parent iolock, so just telling lockdep about it is enough. The lock flag
required for that was already added as part of the ilock lockdep annotations
and unused so far.
Signed-off-by: Christoph Hellwig <hch@xxxxxx>
--- xfs.orig/fs/xfs/xfs_filestream.c 2010-11-02 14:28:57.888491016 -0400
+++ xfs/fs/xfs/xfs_filestream.c 2010-11-02 14:30:42.591824351 -0400
@@ -744,9 +744,15 @@ xfs_filestream_new_ag(
* If the file's parent directory is known, take its iolock in exclusive
* mode to prevent two sibling files from racing each other to migrate
* themselves and their parent to different AGs.
+ * Note that we lock the parent directory iolock inside the child
+ * iolock here. That's fine as we never hold both parent and child
+ * iolock in any other place. This is different from the ilock,
+ * which requires locking of the child after the parent for namespace
+ * operations.
- xfs_ilock(pip, XFS_IOLOCK_EXCL);
+ xfs_ilock(pip, XFS_IOLOCK_EXCL | XFS_IOLOCK_PARENT);
* A new AG needs to be found for the file. If the file's parent