diff options
author | Sage Weil <sage@newdream.net> | 2010-05-24 14:15:51 -0400 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2010-05-29 12:12:35 -0400 |
commit | aa91647c898d62e869fcf35e977ab3c533be8fc1 (patch) | |
tree | 6a5ff908ecb2732d891baa4bac52b5690130e887 | |
parent | 0aa12fb439838a85802ab8b7fbb9bcfc3e6e05cb (diff) |
ceph: make mds requests killable, not interruptible
The underlying problem is that many mds requests can't be restarted. For
example, a restarted create() would return -EEXIST if the original request
succeeds. However, we do not want a hung MDS to hang the client too. So,
use the _killable wait_for_completion variants to abort on SIGKILL but
nothing else.
Signed-off-by: Sage Weil <sage@newdream.net>
-rw-r--r-- | fs/ceph/mds_client.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index 885aa5710cfd..08413c8a85b2 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
@@ -1768,12 +1768,12 @@ int ceph_mdsc_do_request(struct ceph_mds_client *mdsc, | |||
1768 | mutex_unlock(&mdsc->mutex); | 1768 | mutex_unlock(&mdsc->mutex); |
1769 | dout("do_request waiting\n"); | 1769 | dout("do_request waiting\n"); |
1770 | if (req->r_timeout) { | 1770 | if (req->r_timeout) { |
1771 | err = (long)wait_for_completion_interruptible_timeout( | 1771 | err = (long)wait_for_completion_killable_timeout( |
1772 | &req->r_completion, req->r_timeout); | 1772 | &req->r_completion, req->r_timeout); |
1773 | if (err == 0) | 1773 | if (err == 0) |
1774 | err = -EIO; | 1774 | err = -EIO; |
1775 | } else { | 1775 | } else { |
1776 | err = wait_for_completion_interruptible(&req->r_completion); | 1776 | err = wait_for_completion_killable(&req->r_completion); |
1777 | } | 1777 | } |
1778 | dout("do_request waited, got %d\n", err); | 1778 | dout("do_request waited, got %d\n", err); |
1779 | mutex_lock(&mdsc->mutex); | 1779 | mutex_lock(&mdsc->mutex); |