Re: [PATCH v7 1/4] ceph: add non-blocking parameter to ceph_try_get_caps()

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

 



On Mon, Oct 15, 2018 at 11:47 PM Luis Henriques <lhenriques@xxxxxxxx> wrote:
>
> ceph_try_get_caps currently calls try_get_cap_refs with the nonblock
> parameter always set to 'true'.  This change adds a new parameter that
> allows to set it's value.  This will be useful for a follow-up patch that
> will need to get two sets of capabilities for two different inodes without
> risking a deadlock.
>
> Signed-off-by: Luis Henriques <lhenriques@xxxxxxxx>
> ---
>  fs/ceph/addr.c  | 2 +-
>  fs/ceph/caps.c  | 7 ++++---
>  fs/ceph/super.h | 2 +-
>  3 files changed, 6 insertions(+), 5 deletions(-)
>
> diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
> index 9c332a6f6667..8eade7a993c1 100644
> --- a/fs/ceph/addr.c
> +++ b/fs/ceph/addr.c
> @@ -322,7 +322,7 @@ static int start_read(struct inode *inode, struct ceph_rw_context *rw_ctx,
>                 /* caller of readpages does not hold buffer and read caps
>                  * (fadvise, madvise and readahead cases) */
>                 int want = CEPH_CAP_FILE_CACHE;
> -               ret = ceph_try_get_caps(ci, CEPH_CAP_FILE_RD, want, &got);
> +               ret = ceph_try_get_caps(ci, CEPH_CAP_FILE_RD, want, true, &got);
>                 if (ret < 0) {
>                         dout("start_read %p, error getting cap\n", inode);
>                 } else if (!(got & want)) {
> diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
> index dd7dfdd2ba13..b1697d2837f0 100644
> --- a/fs/ceph/caps.c
> +++ b/fs/ceph/caps.c
> @@ -2671,17 +2671,18 @@ static void check_max_size(struct inode *inode, loff_t endoff)
>                 ceph_check_caps(ci, CHECK_CAPS_AUTHONLY, NULL);
>  }
>
> -int ceph_try_get_caps(struct ceph_inode_info *ci, int need, int want, int *got)
> +int ceph_try_get_caps(struct ceph_inode_info *ci, int need, int want,
> +                     bool nonblock, int *got)
>  {
>         int ret, err = 0;
>
>         BUG_ON(need & ~CEPH_CAP_FILE_RD);
> -       BUG_ON(want & ~(CEPH_CAP_FILE_CACHE|CEPH_CAP_FILE_LAZYIO));
> +       BUG_ON(want & ~(CEPH_CAP_FILE_CACHE|CEPH_CAP_FILE_LAZYIO|CEPH_CAP_FILE_SHARED));
>         ret = ceph_pool_perm_check(ci, need);
>         if (ret < 0)
>                 return ret;
>
> -       ret = try_get_cap_refs(ci, need, want, 0, true, got, &err);
> +       ret = try_get_cap_refs(ci, need, want, 0, nonblock, got, &err);
>         if (ret) {
>                 if (err == -EAGAIN) {
>                         ret = 0;
> diff --git a/fs/ceph/super.h b/fs/ceph/super.h
> index 582e28fd1b7b..91b13400badd 100644
> --- a/fs/ceph/super.h
> +++ b/fs/ceph/super.h
> @@ -1008,7 +1008,7 @@ extern int ceph_encode_dentry_release(void **p, struct dentry *dn,
>  extern int ceph_get_caps(struct ceph_inode_info *ci, int need, int want,
>                          loff_t endoff, int *got, struct page **pinned_page);
>  extern int ceph_try_get_caps(struct ceph_inode_info *ci,
> -                            int need, int want, int *got);
> +                            int need, int want, bool nonblock, int *got);
>
>  /* for counting open files by mode */
>  extern void __ceph_get_fmode(struct ceph_inode_info *ci, int mode);

Looks good to me

Regards
Yan, Zheng



[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux