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: Christoph Hellwig <hch@lst.de> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
Родитель
3a3908c8b0
Коммит
7c5d187581
|
@ -171,6 +171,13 @@ static u32 initiate_file_draining(struct nfs_client *clp,
|
|||
goto out;
|
||||
|
||||
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);
|
||||
if (test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags) ||
|
||||
pnfs_mark_matching_lsegs_invalid(lo, &free_me_list,
|
||||
|
@ -178,7 +185,6 @@ static u32 initiate_file_draining(struct nfs_client *clp,
|
|||
rv = NFS4ERR_DELAY;
|
||||
else
|
||||
rv = NFS4ERR_NOMATCHING_LAYOUT;
|
||||
pnfs_set_layout_stateid(lo, &args->cbl_stateid, true);
|
||||
spin_unlock(&ino->i_lock);
|
||||
pnfs_free_lseg_list(&free_me_list);
|
||||
pnfs_put_layout_hdr(lo);
|
||||
|
|
|
@ -594,6 +594,9 @@ pnfs_layout_free_bulk_destroy_list(struct list_head *layout_list,
|
|||
dprintk("%s freeing layout for inode %lu\n", __func__,
|
||||
lo->plh_inode->i_ino);
|
||||
inode = lo->plh_inode;
|
||||
|
||||
pnfs_layoutcommit_inode(inode, false);
|
||||
|
||||
spin_lock(&inode->i_lock);
|
||||
list_del_init(&lo->plh_bulk_destroy);
|
||||
lo->plh_block_lgets++; /* permanently block new LAYOUTGETs */
|
||||
|
|
Загрузка…
Ссылка в новой задаче