diff mbox series

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

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

Commit Message

Luis Henriques Oct. 15, 2018, 3:45 p.m. UTC
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(-)

Comments

Yan, Zheng Oct. 16, 2018, 2:35 p.m. UTC | #1
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 mbox series

Patch

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);