summaryrefslogtreecommitdiffstats
path: root/fs/read_write.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2015-04-07 02:50:38 +0200
committerAl Viro <viro@zeniv.linux.org.uk>2015-04-12 04:29:46 +0200
commitf765b134c0d3f294f6084d3e0a11de184059a387 (patch)
treec4492b1ee9661d40f1e2e2b0e88c9ba369a1162f /fs/read_write.c
parentdirect_IO: remove rw from a_ops->direct_IO() (diff)
downloadlinux-f765b134c0d3f294f6084d3e0a11de184059a387.tar.xz
linux-f765b134c0d3f294f6084d3e0a11de184059a387.zip
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>
Diffstat (limited to 'fs/read_write.c')
-rw-r--r--fs/read_write.c3
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
ret = filp->f_op->write_iter(&kiocb, &iter);
BUG_ON(ret == -EIOCBQUEUED);
- *ppos = kiocb.ki_pos;
+ if (ret > 0)
+ *ppos = kiocb.ki_pos;
return ret;
}