summaryrefslogtreecommitdiff
path: root/fs/orangefs/devorangefs-req.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2016-02-12 07:07:19 +0300
committerMike Marshall <hubcap@omnibond.com>2016-02-19 21:45:53 +0300
commit78699e29fd784a4613d254a22627f336c55c4a76 (patch)
treec3a8d93a89dd7abed775cdd27a9349cbbd0e539c /fs/orangefs/devorangefs-req.c
parent1357d06d49d1f87af48ab768d34af55bff18b0c3 (diff)
downloadlinux-78699e29fd784a4613d254a22627f336c55c4a76.tar.xz
orangefs: delay freeing slot until cancel completes
Make cancels reuse the aborted read/write op, to make sure they do not fail on lack of memory. Don't issue a cancel unless the daemon has seen our read/write, has not replied and isn't being shut down. If cancel *is* issued, don't wait for it to complete; stash the slot in there and just have it freed when cancel is finally replied to or purged (and delay dropping the reference until then, obviously). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Mike Marshall <hubcap@omnibond.com>
Diffstat (limited to 'fs/orangefs/devorangefs-req.c')
-rw-r--r--fs/orangefs/devorangefs-req.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/fs/orangefs/devorangefs-req.c b/fs/orangefs/devorangefs-req.c
index 37278f5878b3..6a7df1204bfc 100644
--- a/fs/orangefs/devorangefs-req.c
+++ b/fs/orangefs/devorangefs-req.c
@@ -438,6 +438,8 @@ wakeup:
}
}
out:
+ if (unlikely(op_is_cancel(op)))
+ put_cancel(op);
op_release(op);
return ret;
@@ -546,6 +548,11 @@ int is_daemon_in_service(void)
return in_service;
}
+bool __is_daemon_in_service(void)
+{
+ return open_access_count == 1;
+}
+
static inline long check_ioctl_command(unsigned int command)
{
/* Check for valid ioctl codes */