mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-03-16 12:14:06 +00:00
xfs: don't take the MMAPLOCK when scrubbing file metadata
The MMAPLOCK stabilizes mappings in a file's pagecache. Therefore, we do not need it to check directories, symlinks, extended attributes, or file-based metadata. Reduce its usage to the one case that requires it, which is when we want to scrub the data fork of a regular file. Signed-off-by: Darrick J. Wong <djwong@kernel.org> Reviewed-by: Dave Chinner <dchinner@redhat.com>
This commit is contained in:
parent
38bb131084
commit
1fc7a0597d
3 changed files with 14 additions and 6 deletions
|
@ -38,8 +38,8 @@ xchk_setup_inode_bmap(
|
|||
if (error)
|
||||
goto out;
|
||||
|
||||
sc->ilock_flags = XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL;
|
||||
xfs_ilock(sc->ip, sc->ilock_flags);
|
||||
sc->ilock_flags = XFS_IOLOCK_EXCL;
|
||||
xfs_ilock(sc->ip, XFS_IOLOCK_EXCL);
|
||||
|
||||
/*
|
||||
* We don't want any ephemeral data fork updates sitting around
|
||||
|
@ -50,6 +50,9 @@ xchk_setup_inode_bmap(
|
|||
sc->sm->sm_type == XFS_SCRUB_TYPE_BMBTD) {
|
||||
struct address_space *mapping = VFS_I(sc->ip)->i_mapping;
|
||||
|
||||
sc->ilock_flags |= XFS_MMAPLOCK_EXCL;
|
||||
xfs_ilock(sc->ip, XFS_MMAPLOCK_EXCL);
|
||||
|
||||
inode_dio_wait(VFS_I(sc->ip));
|
||||
|
||||
/*
|
||||
|
|
|
@ -988,7 +988,11 @@ xchk_irele(
|
|||
xfs_irele(ip);
|
||||
}
|
||||
|
||||
/* Set us up to scrub a file's contents. */
|
||||
/*
|
||||
* Set us up to scrub metadata mapped by a file's fork. Callers must not use
|
||||
* this to operate on user-accessible regular file data because the MMAPLOCK is
|
||||
* not taken.
|
||||
*/
|
||||
int
|
||||
xchk_setup_inode_contents(
|
||||
struct xfs_scrub *sc,
|
||||
|
@ -1000,9 +1004,10 @@ xchk_setup_inode_contents(
|
|||
if (error)
|
||||
return error;
|
||||
|
||||
/* Got the inode, lock it and we're ready to go. */
|
||||
sc->ilock_flags = XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL;
|
||||
/* Lock the inode so the VFS cannot touch this file. */
|
||||
sc->ilock_flags = XFS_IOLOCK_EXCL;
|
||||
xfs_ilock(sc->ip, sc->ilock_flags);
|
||||
|
||||
error = xchk_trans_alloc(sc, resblks);
|
||||
if (error)
|
||||
goto out;
|
||||
|
|
|
@ -32,7 +32,7 @@ xchk_prepare_iscrub(
|
|||
{
|
||||
int error;
|
||||
|
||||
sc->ilock_flags = XFS_IOLOCK_EXCL | XFS_MMAPLOCK_EXCL;
|
||||
sc->ilock_flags = XFS_IOLOCK_EXCL;
|
||||
xfs_ilock(sc->ip, sc->ilock_flags);
|
||||
|
||||
error = xchk_trans_alloc(sc, 0);
|
||||
|
|
Loading…
Add table
Reference in a new issue