diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2005-03-31 19:59:12 +0000 |
---|---|---|
committer | Miklos Szeredi <miklos@szeredi.hu> | 2005-03-31 19:59:12 +0000 |
commit | eab72ef27a0ff2376a409ce40390b5c8c1e8727a (patch) | |
tree | e187c04157a6c8d6106bd48ff7c36cae7a94e163 /kernel/dev.c | |
parent | 407e6a7297a7e126182934c53946eac44fe6b54b (diff) | |
download | libfuse-eab72ef27a0ff2376a409ce40390b5c8c1e8727a.tar.gz |
fix
Diffstat (limited to 'kernel/dev.c')
-rw-r--r-- | kernel/dev.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/kernel/dev.c b/kernel/dev.c index b17296a..29a9b63 100644 --- a/kernel/dev.c +++ b/kernel/dev.c @@ -221,6 +221,10 @@ static void request_end(struct fuse_conn *fc, struct fuse_req *req) wake_up(&req->waitq); if (req->in.h.opcode == FUSE_INIT) { int i; + + if (req->misc.init_in_out.major != FUSE_KERNEL_VERSION) + fc->conn_error = 1; + /* After INIT reply is received other requests can go out. So do (FUSE_MAX_OUTSTANDING - 1) number of up()s on outstanding_sem. The last up() is done in @@ -367,8 +371,11 @@ static void request_send_wait(struct fuse_conn *fc, struct fuse_req *req, { req->isreply = 1; spin_lock(&fuse_lock); - req->out.h.error = -ENOTCONN; - if (fc->file) { + if (!fc->file) + req->out.h.error = -ENOTCONN; + else if (fc->conn_error) + req->out.h.error = -ECONNREFUSED; + else { queue_request(fc, req); /* acquire extra reference, since request is still needed after request_end() */ @@ -665,6 +672,17 @@ static void request_wait(struct fuse_conn *fc) remove_wait_queue(&fc->waitq, &wait); } +#ifndef KERNEL_2_6 +static inline size_t iov_length(const struct iovec *iov, unsigned long nr_segs) +{ + unsigned long seg; + size_t ret = 0; + + for (seg = 0; seg < nr_segs; seg++) + ret += iov[seg].iov_len; + return ret; +} +#endif /* * Read a single request into the userspace filesystem's buffer. This * function waits until a request is available, then removes it from |