Commit 7c5d1875 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Trond Myklebust

pnfs: force a layout commit when encountering busy segments during recall

Expedite layout recall processing by forcing a layout commit when
we see busy segments.  Without it the layout recall might have to wait
until the VM decided to start writeback for the file, which can introduce
long delays.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
parent 3a3908c8
...@@ -171,6 +171,13 @@ static u32 initiate_file_draining(struct nfs_client *clp, ...@@ -171,6 +171,13 @@ static u32 initiate_file_draining(struct nfs_client *clp,
goto out; goto out;
ino = lo->plh_inode; ino = lo->plh_inode;
spin_lock(&ino->i_lock);
pnfs_set_layout_stateid(lo, &args->cbl_stateid, true);
spin_unlock(&ino->i_lock);
pnfs_layoutcommit_inode(ino, false);
spin_lock(&ino->i_lock); spin_lock(&ino->i_lock);
if (test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags) || if (test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags) ||
pnfs_mark_matching_lsegs_invalid(lo, &free_me_list, pnfs_mark_matching_lsegs_invalid(lo, &free_me_list,
...@@ -178,7 +185,6 @@ static u32 initiate_file_draining(struct nfs_client *clp, ...@@ -178,7 +185,6 @@ static u32 initiate_file_draining(struct nfs_client *clp,
rv = NFS4ERR_DELAY; rv = NFS4ERR_DELAY;
else else
rv = NFS4ERR_NOMATCHING_LAYOUT; rv = NFS4ERR_NOMATCHING_LAYOUT;
pnfs_set_layout_stateid(lo, &args->cbl_stateid, true);
spin_unlock(&ino->i_lock); spin_unlock(&ino->i_lock);
pnfs_free_lseg_list(&free_me_list); pnfs_free_lseg_list(&free_me_list);
pnfs_put_layout_hdr(lo); pnfs_put_layout_hdr(lo);
......
...@@ -594,6 +594,9 @@ pnfs_layout_free_bulk_destroy_list(struct list_head *layout_list, ...@@ -594,6 +594,9 @@ pnfs_layout_free_bulk_destroy_list(struct list_head *layout_list,
dprintk("%s freeing layout for inode %lu\n", __func__, dprintk("%s freeing layout for inode %lu\n", __func__,
lo->plh_inode->i_ino); lo->plh_inode->i_ino);
inode = lo->plh_inode; inode = lo->plh_inode;
pnfs_layoutcommit_inode(inode, false);
spin_lock(&inode->i_lock); spin_lock(&inode->i_lock);
list_del_init(&lo->plh_bulk_destroy); list_del_init(&lo->plh_bulk_destroy);
lo->plh_block_lgets++; /* permanently block new LAYOUTGETs */ lo->plh_block_lgets++; /* permanently block new LAYOUTGETs */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment