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 <behlendorf1@llnl.gov>
Closes #3124
This commit is contained in:
Brian Behlendorf 2015-02-20 10:28:25 -08:00
parent 1d966336f5
commit 1efdc45ea8

View File

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