diff options
author | Miklos Szeredi <mszeredi@suse.cz> | 2009-01-26 15:00:59 +0100 |
---|---|---|
committer | Miklos Szeredi <mszeredi@suse.de> | 2009-01-26 15:00:59 +0100 |
commit | f6d47a1761896dcd89e3184399a8962dff17267d (patch) | |
tree | 60a7f1eee203f07db6f2a9d890b8ec78f190ea57 /fs/fuse/dev.c | |
parent | 26c3679101dbccc054dcf370143941844ba70531 (diff) | |
download | op-kernel-dev-f6d47a1761896dcd89e3184399a8962dff17267d.zip op-kernel-dev-f6d47a1761896dcd89e3184399a8962dff17267d.tar.gz |
fuse: fix poll notify
Move fuse_copy_finish() to before calling fuse_notify_poll_wakeup().
This is not a big issue because fuse_notify_poll_wakeup() should be
atomic, but it's cleaner this way, and later uses of notification will
need to be able to finish the copying before performing some actions.
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Diffstat (limited to 'fs/fuse/dev.c')
-rw-r--r-- | fs/fuse/dev.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c index c4a3d9b..ba76b68 100644 --- a/fs/fuse/dev.c +++ b/fs/fuse/dev.c @@ -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; } |