diff options
author | Yan, Zheng <zyan@redhat.com> | 2016-12-22 16:05:43 +0800 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2017-01-18 17:58:45 +0100 |
commit | 6e09d0fb64402cec579f029ca4c7f39f5c48fc60 (patch) | |
tree | 76681717ce0021c7e37f4554592671c2c4d3c585 | |
parent | 49def1853334396f948dcb4cedb9347abb318df5 (diff) | |
download | linux-6e09d0fb64402cec579f029ca4c7f39f5c48fc60.tar.bz2 |
ceph: fix ceph_get_caps() interruption
Commit 5c341ee32881 ("ceph: fix scheduler warning due to nested
blocking") causes infinite loop when process is interrupted. Fix it.
Signed-off-by: Yan, Zheng <zyan@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
-rw-r--r-- | fs/ceph/caps.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index baea866a6751..94fd76d04683 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c @@ -2591,8 +2591,13 @@ int ceph_get_caps(struct ceph_inode_info *ci, int need, int want, add_wait_queue(&ci->i_cap_wq, &wait); while (!try_get_cap_refs(ci, need, want, endoff, - true, &_got, &err)) + true, &_got, &err)) { + if (signal_pending(current)) { + ret = -ERESTARTSYS; + break; + } wait_woken(&wait, TASK_INTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT); + } remove_wait_queue(&ci->i_cap_wq, &wait); |