ceph: don't use -ESTALE as special return code in try_get_cap_refs
authorJeff Layton <jlayton@kernel.org>
Tue, 7 Sep 2021 17:54:34 +0000 (13:54 -0400)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 8 Nov 2021 02:29:51 +0000 (03:29 +0100)
In some cases, we may want to return -ESTALE if it ends up that we're
dealing with an inode that no longer exists. Switch to using -EUCLEAN as
the "special" error return.

Signed-off-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/caps.c

index 159c7ba..ccfba5a 100644 (file)
@@ -2630,9 +2630,9 @@ void ceph_take_cap_refs(struct ceph_inode_info *ci, int got,
  *
  * 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.
+ *  -EAGAIN:  need to sleep but non-blocking is specified
+ *  -EFBIG:   ask caller to call check_max_size() and try again.
+ *  -EUCLEAN: ask caller to call ceph_renew_caps() and try again.
  */
 enum {
        /* first 8 bits are reserved for CEPH_FILE_MODE_FOO */
@@ -2680,7 +2680,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 = ci->i_auth_cap ? -EFBIG : -ESTALE;
+                               ret = ci->i_auth_cap ? -EFBIG : -EUCLEAN;
                        goto out_unlock;
                }
                /*
@@ -2760,7 +2760,7 @@ again:
                        dout("get_cap_refs %p need %s > mds_wanted %s\n",
                             inode, ceph_cap_string(need),
                             ceph_cap_string(mds_wanted));
-                       ret = -ESTALE;
+                       ret = -EUCLEAN;
                        goto out_unlock;
                }
 
@@ -2844,7 +2844,7 @@ int ceph_try_get_caps(struct inode *inode, int need, int want,
 
        ret = try_get_cap_refs(inode, need, want, 0, flags, got);
        /* three special error codes */
-       if (ret == -EAGAIN || ret == -EFBIG || ret == -ESTALE)
+       if (ret == -EAGAIN || ret == -EFBIG || ret == -EUCLEAN)
                ret = 0;
        return ret;
 }
@@ -2927,7 +2927,7 @@ int ceph_get_caps(struct file *filp, int need, int want, loff_t endoff, int *got
                }
 
                if (ret < 0) {
-                       if (ret == -EFBIG || ret == -ESTALE) {
+                       if (ret == -EFBIG || ret == -EUCLEAN) {
                                int ret2 = ceph_wait_on_async_create(inode);
                                if (ret2 < 0)
                                        return ret2;
@@ -2936,7 +2936,7 @@ int ceph_get_caps(struct file *filp, int need, int want, loff_t endoff, int *got
                                check_max_size(inode, endoff);
                                continue;
                        }
-                       if (ret == -ESTALE) {
+                       if (ret == -EUCLEAN) {
                                /* session was killed, try renew caps */
                                ret = ceph_renew_caps(inode, flags);
                                if (ret == 0)