ceph: fix error handling in ceph_get_caps()
authorYan, Zheng <zyan@redhat.com>
Mon, 20 May 2019 01:50:09 +0000 (09:50 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Wed, 5 Jun 2019 18:34:39 +0000 (20:34 +0200)
The function return 0 even when interrupted or try_get_cap_refs()
return error.

Fixes: 1199d7da2d ("ceph: simplify arguments and return semantics of try_get_cap_refs")
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/caps.c

index 52a2b90621cdb79fac25714ef29cb0437158af69..0176241eaea7ef5f4ce4a1b01a19c91c5815dafe 100644 (file)
@@ -2738,15 +2738,13 @@ int ceph_get_caps(struct ceph_inode_info *ci, int need, int want,
                _got = 0;
                ret = try_get_cap_refs(ci, need, want, endoff,
                                       false, &_got);
-               if (ret == -EAGAIN) {
+               if (ret == -EAGAIN)
                        continue;
-               } else if (!ret) {
-                       int err;
-
+               if (!ret) {
                        DEFINE_WAIT_FUNC(wait, woken_wake_function);
                        add_wait_queue(&ci->i_cap_wq, &wait);
 
-                       while (!(err = try_get_cap_refs(ci, need, want, endoff,
+                       while (!(ret = try_get_cap_refs(ci, need, want, endoff,
                                                        true, &_got))) {
                                if (signal_pending(current)) {
                                        ret = -ERESTARTSYS;
@@ -2756,14 +2754,16 @@ int ceph_get_caps(struct ceph_inode_info *ci, int need, int want,
                        }
 
                        remove_wait_queue(&ci->i_cap_wq, &wait);
-                       if (err == -EAGAIN)
+                       if (ret == -EAGAIN)
                                continue;
                }
-               if (ret == -ESTALE) {
-                       /* session was killed, try renew caps */
-                       ret = ceph_renew_caps(&ci->vfs_inode);
-                       if (ret == 0)
-                               continue;
+               if (ret < 0) {
+                       if (ret == -ESTALE) {
+                               /* session was killed, try renew caps */
+                               ret = ceph_renew_caps(&ci->vfs_inode);
+                               if (ret == 0)
+                                       continue;
+                       }
                        return ret;
                }