01 Oct, 2020

1 commit

  • [ Upstream commit add66fcbd3fbe5aa0dd4dddfa23e119c12989a27 ]

    On architectures where loff_t is wider than pgoff_t, the expression
    ((page->index + 1) << PAGE_SHIFT) can overflow. Rewrite to use the page
    offset, which we already compute here anyway.

    Signed-off-by: Andreas Gruenbacher
    Reviewed-by: Christoph Hellwig
    Reviewed-by: Darrick J. Wong
    Signed-off-by: Darrick J. Wong
    Signed-off-by: Sasha Levin

    Andreas Gruenbacher
     

05 Jan, 2020

1 commit

  • [ Upstream commit e9f930ac88a8936ccc2d021110c98810cf5aa810 ]

    Naresh reported LTP diotest4 failing for 32bit x86 and arm -next
    kernels on ext4. Same problem exists in 5.4-rc7 on xfs.

    The failure comes down to:
    openat(AT_FDCWD, "testdata-4.5918", O_RDWR|O_DIRECT) = 4
    mmap2(NULL, 4096, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f7b000
    read(4, 0xb7f7b000, 4096) = 0 // expects -EFAULT

    Problem is conversion at iomap_dio_bio_actor() return. Ternary
    operator has a return type and an attempt is made to convert each
    of operands to the type of the other. In this case "ret" (int)
    is converted to type of "copied" (unsigned long). Both have size
    of 4 bytes:
    size_t copied = 0;
    int ret = -14;
    long long actor_ret = copied ? copied : ret;

    On x86_64: actor_ret == -14;
    On x86 : actor_ret == 4294967282

    Replace ternary operator with 2 return statements to avoid this
    unwanted conversion.

    Fixes: 4721a6010990 ("iomap: dio data corruption and spurious errors when pipes fill")
    Reported-by: Naresh Kamboju
    Signed-off-by: Jan Stancek
    Reviewed-by: Christoph Hellwig
    Reviewed-by: Darrick J. Wong
    Signed-off-by: Darrick J. Wong
    Signed-off-by: Sasha Levin

    Jan Stancek
     

13 Dec, 2019

1 commit

  • commit 419e9c38aa075ed0cd3c13d47e15954b686bcdb6 upstream.

    When splicing using iomap_dio_rw() to a pipe, we may leak pipe pages
    because bio_iov_iter_get_pages() records that the pipe will have full
    extent worth of data however if file size is not block size aligned
    iomap_dio_rw() returns less than what bio_iov_iter_get_pages() set up
    and splice code gets confused leaking a pipe page with the file tail.

    Handle the situation similarly to the old direct IO implementation and
    revert iter to actually returned read amount which makes iter consistent
    with value returned from iomap_dio_rw() and thus the splice code is
    happy.

    Fixes: ff6a9292e6f6 ("iomap: implement direct I/O")
    CC: stable@vger.kernel.org
    Reported-by: syzbot+991400e8eba7e00a26e1@syzkaller.appspotmail.com
    Signed-off-by: Jan Kara
    Reviewed-by: Darrick J. Wong
    Signed-off-by: Darrick J. Wong
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Greg Kroah-Hartman

    Jan Kara
     

20 Sep, 2019

2 commits

  • Add a new iomap_dio_ops structure that for now just contains the end_io
    handler. This avoid storing the function pointer in a mutable structure,
    which is a possible exploit vector for kernel code execution, and prepares
    for adding a submit_io handler that btrfs needs.

    Signed-off-by: Christoph Hellwig
    Reviewed-by: Darrick J. Wong
    Signed-off-by: Darrick J. Wong

    Christoph Hellwig
     
  • Modify the calling convention for the iomap_dio_rw ->end_io() callback.
    Rather than passing either dio->error or dio->size as the 'size' argument,
    instead pass both the dio->error and the dio->size value separately.

    In the instance that an error occurred during a write, we currently cannot
    determine whether any blocks have been allocated beyond the current EOF and
    data has subsequently been written to these blocks within the ->end_io()
    callback. As a result, we cannot judge whether we should take the truncate
    failed write path. Having both dio->error and dio->size will allow us to
    perform such checks within this callback.

    Signed-off-by: Matthew Bobrowski
    [hch: minor cleanups]
    Signed-off-by: Christoph Hellwig
    Reviewed-by: Darrick J. Wong
    Signed-off-by: Darrick J. Wong
    Reviewed-by: Matthew Wilcox (Oracle)

    Matthew Bobrowski
     

25 Jul, 2019

1 commit

  • Detected by:

    $ ./scripts/spdxcheck.py
    fs/iomap/Makefile: 1:27 Invalid License ID: GPL-2.0-or-newer

    Fixes: 1c230208f53d ("iomap: start moving code to fs/iomap/")
    Signed-off-by: Masahiro Yamada
    Reviewed-by: Thomas Gleixner
    Signed-off-by: Greg Kroah-Hartman

    Masahiro Yamada
     

20 Jul, 2019

1 commit

  • Pull iomap split/cleanup from Darrick Wong:
    "As promised, here's the second part of the iomap merge for 5.3, in
    which we break up iomap.c into smaller files grouped by functional
    area so that it'll be easier in the long run to maintain cohesiveness
    of code units and to review incoming patches. There are no functional
    changes and fs/iomap.c split cleanly.

    Summary:

    - Regroup the fs/iomap.c code by major functional area so that we can
    start development for 5.4 from a more stable base"

    * tag 'iomap-5.3-merge-4' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux:
    iomap: move internal declarations into fs/iomap/
    iomap: move the main iteration code into a separate file
    iomap: move the buffered IO code into a separate file
    iomap: move the direct IO code into a separate file
    iomap: move the SEEK_HOLE code into a separate file
    iomap: move the file mapping reporting code into a separate file
    iomap: move the swapfile code into a separate file
    iomap: start moving code to fs/iomap/

    Linus Torvalds
     

17 Jul, 2019

7 commits


15 Jul, 2019

1 commit