diff options
author | Yan, Zheng <zyan@redhat.com> | 2020-03-10 14:34:18 +0300 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2020-03-30 13:42:42 +0300 |
commit | 546d402085d6ea3c13bdea62a98b48a53c18eed4 (patch) | |
tree | 56bff7936da196a5364adf58c8641276394b936a /fs/ceph | |
parent | c6d50296032f0b97473eb2e274dc7cc5d0173847 (diff) | |
download | linux-546d402085d6ea3c13bdea62a98b48a53c18eed4.tar.xz |
ceph: cleanup return error of try_get_cap_refs()
Returns 0 if caps were not able to be acquired (yet), 1 if cap
acquisition succeeded, or a negative error code. There are 3 special
error codes:
-EAGAIN: need to sleep but non-blocking is specified
-EFBIG: ask caller to call check_max_size() and try again.
-ESTALE: ask caller to call ceph_renew_caps() and try again.
[ jlayton: add WARN_ON_ONCE check for -EAGAIN ]
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Diffstat (limited to 'fs/ceph')
-rw-r--r-- | fs/ceph/caps.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index 342a32c74c64..78a305068cac 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c @@ -2530,10 +2530,11 @@ void ceph_take_cap_refs(struct ceph_inode_info *ci, int got, * Note that caller is responsible for ensuring max_size increases are * requested from the MDS. * - * Returns 0 if caps were not able to be acquired (yet), a 1 if they were, - * or a negative error code. - * - * FIXME: how does a 0 return differ from -EAGAIN? + * Returns 0 if caps were not able to be acquired (yet), 1 if succeed, + * or a negative error code. There are 3 speical error codes: + * -EAGAIN: need to sleep but non-blocking is specified + * -EFBIG: ask caller to call check_max_size() and try again. + * -ESTALE: ask caller to call ceph_renew_caps() and try again. */ enum { /* first 8 bits are reserved for CEPH_FILE_MODE_FOO */ @@ -2581,7 +2582,7 @@ again: dout("get_cap_refs %p endoff %llu > maxsize %llu\n", inode, endoff, ci->i_max_size); if (endoff > ci->i_requested_max_size) - ret = -EAGAIN; + ret = -EFBIG; goto out_unlock; } /* @@ -2743,7 +2744,10 @@ int ceph_try_get_caps(struct inode *inode, int need, int want, flags |= NON_BLOCKING; ret = try_get_cap_refs(inode, need, want, 0, flags, got); - return ret == -EAGAIN ? 0 : ret; + /* three special error codes */ + if (ret == -EAGAIN || ret == -EFBIG || ret == -EAGAIN) + ret = 0; + return ret; } /* @@ -2771,17 +2775,13 @@ int ceph_get_caps(struct file *filp, int need, int want, flags = get_used_fmode(need | want); while (true) { - if (endoff > 0) - check_max_size(inode, endoff); - flags &= CEPH_FILE_MODE_MASK; if (atomic_read(&fi->num_locks)) flags |= CHECK_FILELOCK; _got = 0; ret = try_get_cap_refs(inode, need, want, endoff, flags, &_got); - if (ret == -EAGAIN) - continue; + WARN_ON_ONCE(ret == -EAGAIN); if (!ret) { struct ceph_mds_client *mdsc = fsc->mdsc; struct cap_wait cw; @@ -2829,6 +2829,10 @@ int ceph_get_caps(struct file *filp, int need, int want, } if (ret < 0) { + if (ret == -EFBIG) { + check_max_size(inode, endoff); + continue; + } if (ret == -ESTALE) { /* session was killed, try renew caps */ ret = ceph_renew_caps(inode, flags); |