]> err.no Git - linux-2.6/blobdiff - fs/fuse/dev.c
[PATCH] fuse: handle error INIT reply
[linux-2.6] / fs / fuse / dev.c
index 9af88953db692495654f48969bf23d5164fa82f0..8244e89a8dd6e3fe1379b1c002ccd351c8a7c770 100644 (file)
@@ -153,7 +153,7 @@ static void process_init_reply(struct fuse_conn *fc, struct fuse_req *req)
        int i;
        struct fuse_init_out *arg = &req->misc.init_out;
 
-       if (arg->major != FUSE_KERNEL_VERSION)
+       if (req->out.h.error || arg->major != FUSE_KERNEL_VERSION)
                fc->conn_error = 1;
        else {
                fc->minor = arg->minor;
@@ -171,19 +171,17 @@ static void process_init_reply(struct fuse_conn *fc, struct fuse_req *req)
 /*
  * This function is called when a request is finished.  Either a reply
  * has arrived or it was interrupted (and not yet sent) or some error
- * occurred during communication with userspace, or the device file was
- * closed.  It decreases the reference count for the request.  In case
- * of a background request the reference to the stored objects are
- * released.  The requester thread is woken up (if still waiting), and
- * finally the request is either freed or put on the unused_list
+ * occurred during communication with userspace, or the device file
+ * was closed.  In case of a background request the reference to the
+ * stored objects are released.  The requester thread is woken up (if
+ * still waiting), and finally the reference to the request is
+ * released
  *
  * Called with fuse_lock, unlocks it
  */
 static void request_end(struct fuse_conn *fc, struct fuse_req *req)
 {
-       int putback;
        req->finished = 1;
-       putback = atomic_dec_and_test(&req->count);
        spin_unlock(&fuse_lock);
        if (req->background) {
                down_read(&fc->sbput_sem);
@@ -197,13 +195,11 @@ static void request_end(struct fuse_conn *fc, struct fuse_req *req)
        else if (req->in.h.opcode == FUSE_RELEASE && req->inode == NULL) {
                /* Special case for failed iget in CREATE */
                u64 nodeid = req->in.h.nodeid;
-               __fuse_get_request(req);
                fuse_reset_request(req);
                fuse_send_forget(fc, req, nodeid, 1);
-               putback = 0;
+               return;
        }
-       if (putback)
-               fuse_putback_request(fc, req);
+       fuse_put_request(fc, req);
 }
 
 /*