Skip to content

Commit

Permalink
xfs: add scan owner field to xfs_eofblocks
Browse files Browse the repository at this point in the history
From: Brian Foster <bfoster@redhat.com>

The scan owner field represents an optional inode number that is
responsible for the current scan. The purpose is to identify that an
inode is under iolock and as such, the iolock shouldn't be attempted
when trimming eofblocks. This is an internal only field.

Signed-off-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
  • Loading branch information
Brian Foster authored and Dave Chinner committed Jul 24, 2014
1 parent 2451337 commit 5400da7
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 1 deletion.
13 changes: 12 additions & 1 deletion fs/xfs/xfs_icache.c
Original file line number Diff line number Diff line change
Expand Up @@ -1211,6 +1211,9 @@ xfs_inode_free_eofblocks(
{
int ret;
struct xfs_eofblocks *eofb = args;
bool need_iolock = true;

ASSERT(!eofb || (eofb && eofb->eof_scan_owner != 0));

if (!xfs_can_free_eofblocks(ip, false)) {
/* inode could be preallocated or append-only */
Expand All @@ -1235,9 +1238,17 @@ xfs_inode_free_eofblocks(
if (eofb->eof_flags & XFS_EOF_FLAGS_MINFILESIZE &&
XFS_ISIZE(ip) < eofb->eof_min_file_size)
return 0;

/*
* A scan owner implies we already hold the iolock. Skip it in
* xfs_free_eofblocks() to avoid deadlock. This also eliminates
* the possibility of EAGAIN being returned.
*/
if (eofb->eof_scan_owner == ip->i_ino)
need_iolock = false;
}

ret = xfs_free_eofblocks(ip->i_mount, ip, true);
ret = xfs_free_eofblocks(ip->i_mount, ip, need_iolock);

/* don't revisit the inode if we're not waiting */
if (ret == -EAGAIN && !(flags & SYNC_WAIT))
Expand Down
2 changes: 2 additions & 0 deletions fs/xfs/xfs_icache.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ struct xfs_eofblocks {
kgid_t eof_gid;
prid_t eof_prid;
__u64 eof_min_file_size;
xfs_ino_t eof_scan_owner;
};

#define SYNC_WAIT 0x0001 /* wait for i/o to complete */
Expand Down Expand Up @@ -84,6 +85,7 @@ xfs_fs_eofblocks_from_user(
dst->eof_flags = src->eof_flags;
dst->eof_prid = src->eof_prid;
dst->eof_min_file_size = src->eof_min_file_size;
dst->eof_scan_owner = NULLFSINO;

dst->eof_uid = INVALID_UID;
if (src->eof_flags & XFS_EOF_FLAGS_UID) {
Expand Down

0 comments on commit 5400da7

Please sign in to comment.