Message ID | 20181015154600.13251-2-lhenriques@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | copy_file_range in cephfs kernel client | expand |
On Mon, Oct 15, 2018 at 11:47 PM Luis Henriques <lhenriques@suse.com> 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@suse.com> > --- > 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
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);
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@suse.com> --- fs/ceph/addr.c | 2 +- fs/ceph/caps.c | 7 ++++--- fs/ceph/super.h | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-)