Commit 50ba5b2d authored by Max Reitz's avatar Max Reitz Committed by Kevin Wolf
Browse files

block/file-posix: Truncate in xfs_write_zeroes()



XFS_IOC_ZERO_RANGE does not increase the file length:
$ touch foo
$ xfs_io -c 'zero 0 65536' foo
$ stat -c "size=%s, blocks=%b" foo
size=0, blocks=128

We do want writes beyond the EOF to automatically increase the file
length, however.  This is evidenced by the fact that iotest 061 is
broken on XFS since qcow2's check implementation checks for blocks
beyond the EOF.

Reported-by: default avatarKevin Wolf <kwolf@redhat.com>
Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 6d8e75d4
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -1444,9 +1444,22 @@ out:
#ifdef CONFIG_XFS
static int xfs_write_zeroes(BDRVRawState *s, int64_t offset, uint64_t bytes)
{
    int64_t len;
    struct xfs_flock64 fl;
    int err;

    len = lseek(s->fd, 0, SEEK_END);
    if (len < 0) {
        return -errno;
    }

    if (offset + bytes > len) {
        /* XFS_IOC_ZERO_RANGE does not increase the file length */
        if (ftruncate(s->fd, offset + bytes) < 0) {
            return -errno;
        }
    }

    memset(&fl, 0, sizeof(fl));
    fl.l_whence = SEEK_SET;
    fl.l_start = offset;