ceph: make mds requests killable, not interruptible
authorSage Weil <sage@newdream.net>
Mon, 24 May 2010 18:15:51 +0000 (11:15 -0700)
committerSage Weil <sage@newdream.net>
Sat, 29 May 2010 16:12:35 +0000 (09:12 -0700)
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>
fs/ceph/mds_client.c

index 885aa5710cfd541997fa9764dffba33b0e8ad644..08413c8a85b28655b79b556361f2aee1958f8ebd 100644 (file)
@@ -1768,12 +1768,12 @@ int ceph_mdsc_do_request(struct ceph_mds_client *mdsc,
        mutex_unlock(&mdsc->mutex);
        dout("do_request waiting\n");
        if (req->r_timeout) {
-               err = (long)wait_for_completion_interruptible_timeout(
+               err = (long)wait_for_completion_killable_timeout(
                        &req->r_completion, req->r_timeout);
                if (err == 0)
                        err = -EIO;
        } else {
-               err = wait_for_completion_interruptible(&req->r_completion);
+               err = wait_for_completion_killable(&req->r_completion);
        }
        dout("do_request waited, got %d\n", err);
        mutex_lock(&mdsc->mutex);