Re: [PATCH 03/19] pnfs: force a layout commit when encountering busy segments during recall

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Aug 21, 2014 at 9:09 AM, Christoph Hellwig <hch@xxxxxx> wrote:
> 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@xxxxxx>
> ---
>  fs/nfs/callback_proc.c | 16 +++++++++++-----
>  fs/nfs/pnfs.c          |  3 +++
>  2 files changed, 14 insertions(+), 5 deletions(-)
>
> diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c
> index 41db525..bf017b0 100644
> --- a/fs/nfs/callback_proc.c
> +++ b/fs/nfs/callback_proc.c
> @@ -164,6 +164,7 @@ static u32 initiate_file_draining(struct nfs_client *clp,
>         struct inode *ino;
>         struct pnfs_layout_hdr *lo;
>         u32 rv = NFS4ERR_NOMATCHING_LAYOUT;
> +       bool need_commit = false;
>         LIST_HEAD(free_me_list);
>
>         lo = get_layout_by_fh(clp, &args->cbl_fh, &args->cbl_stateid);
> @@ -172,16 +173,21 @@ static u32 initiate_file_draining(struct nfs_client *clp,
>
>         ino = lo->plh_inode;
>         spin_lock(&ino->i_lock);
> -       if (test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags) ||
> -           pnfs_mark_matching_lsegs_invalid(lo, &free_me_list,
> -                                       &args->cbl_range))
> +       if (test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags)) {
>                 rv = NFS4ERR_DELAY;
> -       else
> -               rv = NFS4ERR_NOMATCHING_LAYOUT;
> +       } else if (pnfs_mark_matching_lsegs_invalid(lo, &free_me_list,
> +                       &args->cbl_range)) {
> +               need_commit = true;
> +               rv = NFS4ERR_DELAY;
> +       }
> +
>         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);
> +
> +       if (need_commit)
> +               pnfs_layoutcommit_inode(ino, false);

Why wouldn't it make more sense to call pnfs_layoutcommit_inode()
unconditionally before the call to pnfs_mark_matching_lsegs_invalid()?

>         iput(ino);
>  out:
>         return rv;
> diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
> index 6e0fa71..242e73f 100644
> --- a/fs/nfs/pnfs.c
> +++ b/fs/nfs/pnfs.c
> @@ -604,6 +604,9 @@ pnfs_layout_free_bulk_destroy_list(struct list_head *layout_list,
>                 spin_unlock(&inode->i_lock);
>                 pnfs_free_lseg_list(&lseg_list);
>                 pnfs_put_layout_hdr(lo);
> +
> +               if (ret)
> +                       pnfs_layoutcommit_inode(inode, false);

Ditto. The test for 'ret' here is particularly confusing given that it
can get set in a previous iteration of the loop.

>                 iput(inode);
>         }
>         return ret;
> --
> 1.9.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
Trond Myklebust

Linux NFS client maintainer, PrimaryData

trond.myklebust@xxxxxxxxxxxxxxx
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux