Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7b2f936f authored by Yan, Zheng's avatar Yan, Zheng Committed by Ilya Dryomov
Browse files

ceph: fix error handling in ceph_get_caps()



The function return 0 even when interrupted or try_get_cap_refs()
return error.

Fixes: 1199d7da ("ceph: simplify arguments and return semantics of try_get_cap_refs")
Signed-off-by: default avatar"Yan, Zheng" <zyan@redhat.com>
Reviewed-by: default avatarJeff Layton <jlayton@redhat.com>
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent 3e1d0452
Loading
Loading
Loading
Loading
+11 −11
Original line number Diff line number Diff line
@@ -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 < 0) {
			if (ret == -ESTALE) {
				/* session was killed, try renew caps */
				ret = ceph_renew_caps(&ci->vfs_inode);
				if (ret == 0)
					continue;
			}
			return ret;
		}