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>
This commit is contained in:
parent
26c3679101
commit
f6d47a1761
1 changed files with 9 additions and 4 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue