mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-23 07:12:09 +00:00
xfs: add xfs_ilock_attr_map_shared
Equivalent to xfs_ilock_data_map_shared, except for the attribute fork. Make xfs_getbmap use it if called for the attribute fork instead of xfs_ilock_data_map_shared. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Ben Myers <bpm@sgi.com> Signed-off-by: Ben Myers <bpm@sgi.com>
This commit is contained in:
parent
309ecac8e7
commit
efa70be165
3 changed files with 42 additions and 22 deletions
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue