diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2015-04-06 20:50:38 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2015-04-11 22:29:46 -0400 |
commit | f765b134c0d3f294f6084d3e0a11de184059a387 (patch) | |
tree | c4492b1ee9661d40f1e2e2b0e88c9ba369a1162f | |
parent | 22c6186ecea0be9eff1c399298ad36e94a59995f (diff) |
new_sync_write(): discard ->ki_pos unless the return value is positive
That allows ->write_iter() instances much more convenient life wrt
iocb->ki_pos (and fixes several filesystems with borderline POSIX
violations when zero-length write succeeds and changes the current
position).
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | fs/read_write.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/read_write.c b/fs/read_write.c index 45d583c33879..819ef3faf1bb 100644 --- a/fs/read_write.c +++ b/fs/read_write.c | |||
@@ -477,7 +477,8 @@ static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t | |||
477 | 477 | ||
478 | ret = filp->f_op->write_iter(&kiocb, &iter); | 478 | ret = filp->f_op->write_iter(&kiocb, &iter); |
479 | BUG_ON(ret == -EIOCBQUEUED); | 479 | BUG_ON(ret == -EIOCBQUEUED); |
480 | *ppos = kiocb.ki_pos; | 480 | if (ret > 0) |
481 | *ppos = kiocb.ki_pos; | ||
481 | return ret; | 482 | return ret; |
482 | } | 483 | } |
483 | 484 | ||