fuse: fix poll notify
[deliverable/linux.git] / fs / fuse / dev.c
index c4a3d9bbdaa877f2a817045abddb3b94317124eb..ba76b68c52ffe2d127178d71ca5b5ab2ecc6a353 100644 (file)
@@ -826,16 +826,21 @@ static int fuse_notify_poll(struct fuse_conn *fc, unsigned int size,
                            struct fuse_copy_state *cs)
 {
        struct fuse_notify_poll_wakeup_out outarg;
-       int err;
+       int err = -EINVAL;
 
        if (size != sizeof(outarg))
-               return -EINVAL;
+               goto err;
 
        err = fuse_copy_one(cs, &outarg, sizeof(outarg));
        if (err)
-               return err;
+               goto err;
 
+       fuse_copy_finish(cs);
        return fuse_notify_poll_wakeup(fc, &outarg);
+
+err:
+       fuse_copy_finish(cs);
+       return err;
 }
 
 static int fuse_notify(struct fuse_conn *fc, enum fuse_notify_code code,
@@ -846,6 +851,7 @@ static int fuse_notify(struct fuse_conn *fc, enum fuse_notify_code code,
                return fuse_notify_poll(fc, size, cs);
 
        default:
+               fuse_copy_finish(cs);
                return -EINVAL;
        }
 }
@@ -924,7 +930,6 @@ static ssize_t fuse_dev_write(struct kiocb *iocb, const struct iovec *iov,
         */
        if (!oh.unique) {
                err = fuse_notify(fc, oh.error, nbytes - sizeof(oh), &cs);
-               fuse_copy_finish(&cs);
                return err ? err : nbytes;
        }
 
This page took 0.036033 seconds and 5 git commands to generate.