|
@@ -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;
|
|
|
}
|
|
|
|