fix fuse_2_2_merge3
authorMiklos Szeredi <miklos@szeredi.hu>
Thu, 31 Mar 2005 19:07:15 +0000 (19:07 +0000)
committerMiklos Szeredi <miklos@szeredi.hu>
Thu, 31 Mar 2005 19:07:15 +0000 (19:07 +0000)
ChangeLog
kernel/dev.c
kernel/fuse_i.h

index 489cbf894ecef02c563a0dd9426357b61c779268..e1643668d1cccf5ec8f07c5305bf40d98b616718 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -10,6 +10,8 @@
 
        * kernel: fix warnings on 64bit archs
 
+       * kernel: in case of API version mismatch, return ECONNREFUSED
+
 2005-03-24  Miklos Szeredi <miklos@szeredi.hu>
 
        * kernel: trivial cleanups
index 0c80aa071891acac13b657f84fa35ad41186d32b..29a9b6366139295df36c648a9eb9c84c570e5e90 100644 (file)
@@ -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() */
index d8770718f7b66ab8212d1e6214fbf5e3e760dacc..759278d4af5130b13901c1d05c269534ddbab698 100644 (file)
@@ -325,6 +325,9 @@ struct fuse_conn {
        /** Is removexattr not implemented by fs? */
        unsigned no_removexattr : 1;
 
+       /** Connection failed (version mismatch) */
+       unsigned conn_error : 1;
+
 #ifdef KERNEL_2_6
        /** Backing dev info */
        struct backing_dev_info bdi;