summaryrefslogtreecommitdiffstats
path: root/fs/ceph/caps.c
diff options
context:
space:
mode:
authorYan, Zheng <zyan@redhat.com>2016-12-22 03:05:43 -0500
committerIlya Dryomov <idryomov@gmail.com>2017-01-18 11:58:45 -0500
commit6e09d0fb64402cec579f029ca4c7f39f5c48fc60 (patch)
tree76681717ce0021c7e37f4554592671c2c4d3c585 /fs/ceph/caps.c
parent49def1853334396f948dcb4cedb9347abb318df5 (diff)
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>
Diffstat (limited to 'fs/ceph/caps.c')
-rw-r--r--fs/ceph/caps.c7
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,
2591 add_wait_queue(&ci->i_cap_wq, &wait); 2591 add_wait_queue(&ci->i_cap_wq, &wait);
2592 2592
2593 while (!try_get_cap_refs(ci, need, want, endoff, 2593 while (!try_get_cap_refs(ci, need, want, endoff,
2594 true, &_got, &err)) 2594 true, &_got, &err)) {
2595 if (signal_pending(current)) {
2596 ret = -ERESTARTSYS;
2597 break;
2598 }
2595 wait_woken(&wait, TASK_INTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT); 2599 wait_woken(&wait, TASK_INTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT);
2600 }
2596 2601
2597 remove_wait_queue(&ci->i_cap_wq, &wait); 2602 remove_wait_queue(&ci->i_cap_wq, &wait);
2598 2603