summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2015-02-20 10:28:25 -0800
committerBrian Behlendorf <[email protected]>2015-02-24 11:21:54 -0800
commit1efdc45ea805e61de2c54736cd1b2a4a5f48a913 (patch)
tree864346e155a41ce191030482021f8545db1a877c
parent1d966336f5095c7e0345360c3862577642670d2d (diff)
Fix O_APPEND open(2) flag
As described in flags section of open(2): O_APPEND: The file is opened in append mode. Before each write(2), the file offset is positioned at the end of the file, as if with lseek(2). O_APPEND may lead to corrupted files on NFS filesys- tems if more than one process appends data to a file at once. This is because NFS does not support appending to a file, so the client kernel has to simulate it, which can't be done without a race condition. This issue was originally overlooked because normally the generic VFS code handles this for a filesystem. However, because ZFS explictly registers a zpl_write() function it's responsible for the seek. Signed-off-by: Brian Behlendorf <[email protected]> Closes #3124
-rw-r--r--module/zfs/zpl_file.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/module/zfs/zpl_file.c b/module/zfs/zpl_file.c
index 5f5bbba3d..571e04315 100644
--- a/module/zfs/zpl_file.c
+++ b/module/zfs/zpl_file.c
@@ -272,6 +272,9 @@ zpl_write_common_iovec(struct inode *ip, const struct iovec *iovp, size_t count,
uio_t uio;
int error;
+ if (flags & O_APPEND)
+ *ppos = i_size_read(ip);
+
uio.uio_iov = (struct iovec *)iovp;
uio.uio_resid = count;
uio.uio_iovcnt = nr_segs;