|
@@ -77,17 +77,18 @@ xfs_get_extsz_hint(
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * This is a wrapper routine around the xfs_ilock() routine used to centralize
|
|
|
- * some grungy code. It is used in places that wish to lock the inode solely
|
|
|
- * for reading the extents. The reason these places can't just call
|
|
|
- * xfs_ilock(SHARED) is that the inode lock also guards to bringing in of the
|
|
|
- * extents from disk for a file in b-tree format. If the inode is in b-tree
|
|
|
- * format, then we need to lock the inode exclusively until the extents are read
|
|
|
- * in. Locking it exclusively all the time would limit our parallelism
|
|
|
- * unnecessarily, though. What we do instead is check to see if the extents
|
|
|
- * have been read in yet, and only lock the inode exclusively if they have not.
|
|
|
+ * These two are wrapper routines around the xfs_ilock() routine used to
|
|
|
+ * centralize some grungy code. They are used in places that wish to lock the
|
|
|
+ * inode solely for reading the extents. The reason these places can't just
|
|
|
+ * call xfs_ilock(ip, XFS_ILOCK_SHARED) is that the inode lock also guards to
|
|
|
+ * bringing in of the extents from disk for a file in b-tree format. If the
|
|
|
+ * inode is in b-tree format, then we need to lock the inode exclusively until
|
|
|
+ * the extents are read in. Locking it exclusively all the time would limit
|
|
|
+ * our parallelism unnecessarily, though. What we do instead is check to see
|
|
|
+ * if the extents have been read in yet, and only lock the inode exclusively
|
|
|
+ * if they have not.
|
|
|
*
|
|
|
- * The function returns a value which should be given to the corresponding
|
|
|
+ * The functions return a value which should be given to the corresponding
|
|
|
* xfs_iunlock() call.
|
|
|
*/
|
|
|
uint
|
|
@@ -103,6 +104,19 @@ xfs_ilock_data_map_shared(
|
|
|
return lock_mode;
|
|
|
}
|
|
|
|
|
|
+uint
|
|
|
+xfs_ilock_attr_map_shared(
|
|
|
+ struct xfs_inode *ip)
|
|
|
+{
|
|
|
+ uint lock_mode = XFS_ILOCK_SHARED;
|
|
|
+
|
|
|
+ if (ip->i_d.di_aformat == XFS_DINODE_FMT_BTREE &&
|
|
|
+ (ip->i_afp->if_flags & XFS_IFEXTENTS) == 0)
|
|
|
+ lock_mode = XFS_ILOCK_EXCL;
|
|
|
+ xfs_ilock(ip, lock_mode);
|
|
|
+ return lock_mode;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* The xfs inode contains 2 locks: a multi-reader lock called the
|
|
|
* i_iolock and a multi-reader lock called the i_lock. This routine
|