Merge tag 'xfs-4.13-merge-5' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux
Pull XFS updates from Darrick Wong: "Here are some changes for you for 4.13. For the most part it's fixes for bugs and deadlock problems, and preparation for online fsck in some future merge window. - Avoid quotacheck deadlocks - Fix transaction overflows when bunmapping fragmented files - Refactor directory readahead - Allow admin to configure if ASSERT is fatal - Improve transaction usage detail logging during overflows - Minor cleanups - Don't leak log items when the log shuts down - Remove double-underscore typedefs - Various preparation for online scrubbing - Introduce new error injection configuration sysfs knobs - Refactor dq_get_next to use extent map directly - Fix problems with iterating the page cache for unwritten data - Implement SEEK_{HOLE,DATA} via iomap - Refactor XFS to use iomap SEEK_HOLE and SEEK_DATA - Don't use MAXPATHLEN to check on-disk symlink target lengths" * tag 'xfs-4.13-merge-5' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux: (48 commits) xfs: don't crash on unexpected holes in dir/attr btrees xfs: rename MAXPATHLEN to XFS_SYMLINK_MAXLEN xfs: fix contiguous dquot chunk iteration livelock xfs: Switch to iomap for SEEK_HOLE / SEEK_DATA vfs: Add iomap_seek_hole and iomap_seek_data helpers vfs: Add page_cache_seek_hole_data helper xfs: remove a whitespace-only line from xfs_fs_get_nextdqblk xfs: rewrite xfs_dq_get_next_id using xfs_iext_lookup_extent xfs: Check for m_errortag initialization in xfs_errortag_test xfs: grab dquots without taking the ilock xfs: fix semicolon.cocci warnings xfs: Don't clear SGID when inheriting ACLs xfs: free cowblocks and retry on buffered write ENOSPC xfs: replace log_badcrc_factor knob with error injection tag xfs: convert drop_writes to use the errortag mechanism xfs: remove unneeded parameter from XFS_TEST_ERROR xfs: expose errortag knobs via sysfs xfs: make errortag a per-mountpoint structure xfs: free uncommitted transactions during log recovery xfs: don't allow bmap on rt files ...
This commit is contained in:
@@ -368,6 +368,11 @@ xfs_iget_cache_hit(
|
||||
if (ip->i_flags & XFS_IRECLAIMABLE) {
|
||||
trace_xfs_iget_reclaim(ip);
|
||||
|
||||
if (flags & XFS_IGET_INCORE) {
|
||||
error = -EAGAIN;
|
||||
goto out_error;
|
||||
}
|
||||
|
||||
/*
|
||||
* We need to set XFS_IRECLAIM to prevent xfs_reclaim_inode
|
||||
* from stomping over us while we recycle the inode. We can't
|
||||
@@ -432,7 +437,8 @@ xfs_iget_cache_hit(
|
||||
if (lock_flags != 0)
|
||||
xfs_ilock(ip, lock_flags);
|
||||
|
||||
xfs_iflags_clear(ip, XFS_ISTALE | XFS_IDONTCACHE);
|
||||
if (!(flags & XFS_IGET_INCORE))
|
||||
xfs_iflags_clear(ip, XFS_ISTALE | XFS_IDONTCACHE);
|
||||
XFS_STATS_INC(mp, xs_ig_found);
|
||||
|
||||
return 0;
|
||||
@@ -603,6 +609,10 @@ again:
|
||||
goto out_error_or_again;
|
||||
} else {
|
||||
rcu_read_unlock();
|
||||
if (flags & XFS_IGET_INCORE) {
|
||||
error = -ENOENT;
|
||||
goto out_error_or_again;
|
||||
}
|
||||
XFS_STATS_INC(mp, xs_ig_missed);
|
||||
|
||||
error = xfs_iget_cache_miss(mp, pag, tp, ino, &ip,
|
||||
@@ -623,7 +633,7 @@ again:
|
||||
return 0;
|
||||
|
||||
out_error_or_again:
|
||||
if (error == -EAGAIN) {
|
||||
if (!(flags & XFS_IGET_INCORE) && error == -EAGAIN) {
|
||||
delay(1);
|
||||
goto again;
|
||||
}
|
||||
@@ -631,6 +641,44 @@ out_error_or_again:
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* "Is this a cached inode that's also allocated?"
|
||||
*
|
||||
* Look up an inode by number in the given file system. If the inode is
|
||||
* in cache and isn't in purgatory, return 1 if the inode is allocated
|
||||
* and 0 if it is not. For all other cases (not in cache, being torn
|
||||
* down, etc.), return a negative error code.
|
||||
*
|
||||
* The caller has to prevent inode allocation and freeing activity,
|
||||
* presumably by locking the AGI buffer. This is to ensure that an
|
||||
* inode cannot transition from allocated to freed until the caller is
|
||||
* ready to allow that. If the inode is in an intermediate state (new,
|
||||
* reclaimable, or being reclaimed), -EAGAIN will be returned; if the
|
||||
* inode is not in the cache, -ENOENT will be returned. The caller must
|
||||
* deal with these scenarios appropriately.
|
||||
*
|
||||
* This is a specialized use case for the online scrubber; if you're
|
||||
* reading this, you probably want xfs_iget.
|
||||
*/
|
||||
int
|
||||
xfs_icache_inode_is_allocated(
|
||||
struct xfs_mount *mp,
|
||||
struct xfs_trans *tp,
|
||||
xfs_ino_t ino,
|
||||
bool *inuse)
|
||||
{
|
||||
struct xfs_inode *ip;
|
||||
int error;
|
||||
|
||||
error = xfs_iget(mp, tp, ino, XFS_IGET_INCORE, 0, &ip);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
*inuse = !!(VFS_I(ip)->i_mode);
|
||||
IRELE(ip);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* The inode lookup is done in batches to keep the amount of lock traffic and
|
||||
* radix tree lookups to a minimum. The batch size is a trade off between
|
||||
|
Reference in New Issue
Block a user