12 Feb, 2020

1 commit

  • Pull dax fixes from Dan Williams:
    "A fix for an xfstest failure and some and an update that removes an
    fsdax dependency on block devices.

    Summary:

    - Fix RWF_NOWAIT writes to properly return -EAGAIN

    - Clean up an unused helper

    - Update dax_writeback_mapping_range to not need a block_device
    argument"

    * tag 'dax-fixes-5.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm:
    dax: pass NOWAIT flag to iomap_apply
    dax: Get rid of fs_dax_get_by_host() helper
    dax: Pass dax_dev instead of bdev to dax_writeback_mapping_range()

    Linus Torvalds
     

09 Feb, 2020

1 commit

  • Pull vfs file system parameter updates from Al Viro:
    "Saner fs_parser.c guts and data structures. The system-wide registry
    of syntax types (string/enum/int32/oct32/.../etc.) is gone and so is
    the horror switch() in fs_parse() that would have to grow another case
    every time something got added to that system-wide registry.

    New syntax types can be added by filesystems easily now, and their
    namespace is that of functions - not of system-wide enum members. IOW,
    they can be shared or kept private and if some turn out to be widely
    useful, we can make them common library helpers, etc., without having
    to do anything whatsoever to fs_parse() itself.

    And we already get that kind of requests - the thing that finally
    pushed me into doing that was "oh, and let's add one for timeouts -
    things like 15s or 2h". If some filesystem really wants that, let them
    do it. Without somebody having to play gatekeeper for the variants
    blessed by direct support in fs_parse(), TYVM.

    Quite a bit of boilerplate is gone. And IMO the data structures make a
    lot more sense now. -200LoC, while we are at it"

    * 'merge.nfs-fs_parse.1' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (25 commits)
    tmpfs: switch to use of invalfc()
    cgroup1: switch to use of errorfc() et.al.
    procfs: switch to use of invalfc()
    hugetlbfs: switch to use of invalfc()
    cramfs: switch to use of errofc() et.al.
    gfs2: switch to use of errorfc() et.al.
    fuse: switch to use errorfc() et.al.
    ceph: use errorfc() and friends instead of spelling the prefix out
    prefix-handling analogues of errorf() and friends
    turn fs_param_is_... into functions
    fs_parse: handle optional arguments sanely
    fs_parse: fold fs_parameter_desc/fs_parameter_spec
    fs_parser: remove fs_parameter_description name field
    add prefix to fs_context->log
    ceph_parse_param(), ceph_parse_mon_ips(): switch to passing fc_log
    new primitive: __fs_parse()
    switch rbd and libceph to p_log-based primitives
    struct p_log, variants of warnf() et.al. taking that one instead
    teach logfc() to handle prefices, give it saner calling conventions
    get rid of cg_invalf()
    ...

    Linus Torvalds
     

08 Feb, 2020

2 commits


06 Feb, 2020

1 commit

  • Pull moar xfs updates from Darrick Wong:
    "This contains the buffer error code refactoring I mentioned last week,
    now that it has had extra time to complete the full xfs fuzz testing
    suite to make sure there aren't any obvious new bugs"

    * tag 'xfs-5.6-merge-8' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux:
    xfs: fix xfs_buf_ioerror_alert location reporting
    xfs: remove unnecessary null pointer checks from _read_agf callers
    xfs: make xfs_*read_agf return EAGAIN to ALLOC_FLAG_TRYLOCK callers
    xfs: remove the xfs_btree_get_buf[ls] functions
    xfs: make xfs_trans_get_buf return an error code
    xfs: make xfs_trans_get_buf_map return an error code
    xfs: make xfs_buf_read return an error code
    xfs: make xfs_buf_get_uncached return an error code
    xfs: make xfs_buf_get return an error code
    xfs: make xfs_buf_read_map return an error code
    xfs: make xfs_buf_get_map return an error code
    xfs: make xfs_buf_alloc return an error code

    Linus Torvalds
     

31 Jan, 2020

1 commit

  • Pull xfs updates from Darrick Wong:
    "In this release we clean out the last of the old 32-bit timestamp
    code, fix a number of bugs and memory corruptions on 32-bit platforms,
    and a refactoring of some of the extended attribute code.

    I think I'll be back next week with some refactoring of how the XFS
    buffer code returns error codes, however I prefer to hold onto that
    for another week to let it soak a while longer

    Summary:

    - Get rid of compat_time_t

    - Convert time_t to time64_t in quota code

    - Remove shadow variables

    - Prevent ATTR_ flag misuse in the attrmulti ioctls

    - Clean out strlen in the attr code

    - Remove some bogus asserts

    - Fix various file size limit calculation errors with 32-bit kernels

    - Pack xfs_dir2_sf_entry_t to fix build errors on arm oabi

    - Fix nowait inode locking calls for directio aio reads

    - Fix memory corruption bugs when invalidating remote xattr value
    buffers

    - Streamline remote attr value removal

    - Make the buffer log format size consistent across platforms

    - Strengthen buffer log format size checking

    - Fix messed up return types of xfs_inode_need_cow

    - Fix some unused variable warnings"

    * tag 'xfs-5.6-merge-6' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux: (24 commits)
    xfs: remove unused variable 'done'
    xfs: fix uninitialized variable in xfs_attr3_leaf_inactive
    xfs: change return value of xfs_inode_need_cow to int
    xfs: check log iovec size to make sure it's plausibly a buffer log format
    xfs: make struct xfs_buf_log_format have a consistent size
    xfs: complain if anyone tries to create a too-large buffer log item
    xfs: clean up xfs_buf_item_get_format return value
    xfs: streamline xfs_attr3_leaf_inactive
    xfs: fix memory corruption during remote attr value buffer invalidation
    xfs: refactor remote attr value buffer invalidation
    xfs: fix IOCB_NOWAIT handling in xfs_file_dio_aio_read
    xfs: Add __packed to xfs_dir2_sf_entry_t definition
    xfs: fix s_maxbytes computation on 32-bit kernels
    xfs: truncate should remove all blocks, not just to the end of the page cache
    xfs: introduce XFS_MAX_FILEOFF
    xfs: remove bogus assertion when online repair isn't enabled
    xfs: Remove all strlen in all xfs_attr_* functions for attr names.
    xfs: fix misuse of the XFS_ATTR_INCOMPLETE flag
    xfs: also remove cached ACLs when removing the underlying attr
    xfs: reject invalid flags combinations in XFS_IOC_ATTRMULTI_BY_HANDLE
    ...

    Linus Torvalds
     

27 Jan, 2020

12 commits


24 Jan, 2020

2 commits

  • fs/xfs/xfs_inode.c: In function 'xfs_itruncate_extents_flags':
    fs/xfs/xfs_inode.c:1523:8: warning: unused variable 'done' [-Wunused-variable]

    commit 4bbb04abb4ee ("xfs: truncate should remove
    all blocks, not just to the end of the page cache")
    left behind this, so remove it.

    Fixes: 4bbb04abb4ee ("xfs: truncate should remove all blocks, not just to the end of the page cache")
    Reported-by: Hulk Robot
    Reported-by: Stephen Rothwell
    Signed-off-by: YueHaibing
    Reviewed-by: Darrick J. Wong
    Signed-off-by: Darrick J. Wong

    YueHaibing
     
  • Dan Carpenter pointed out that error is uninitialized. While there
    never should be an attr leaf block with zero entries, let's not leave
    that logic bomb there.

    Fixes: 0bb9d159bd01 ("xfs: streamline xfs_attr3_leaf_inactive")
    Reported-by: Dan Carpenter
    Signed-off-by: Darrick J. Wong
    Reviewed-by: Allison Collins
    Reviewed-by: Eric Sandeen

    Darrick J. Wong
     

21 Jan, 2020

1 commit

  • Fixes coccicheck warning:

    fs/xfs/xfs_reflink.c:236:9-10: WARNING: return of 0/1 in function 'xfs_inode_need_cow' with return type bool

    Reported-by: Hulk Robot
    Signed-off-by: zhengbin
    [darrick: rename the function so it doesn't sound like a predicate]
    Reviewed-by: Darrick J. Wong
    Signed-off-by: Darrick J. Wong

    zhengbin
     

17 Jan, 2020

7 commits

  • When log recovery is processing buffer log items, we should check that
    the incoming iovec actually describes a region of memory large enough to
    contain the log format and the dirty map.

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

    Darrick J. Wong
     
  • Increase XFS_BLF_DATAMAP_SIZE by 1 to fill in the implied padding at the
    end of struct xfs_buf_log_format. This makes the size consistent so
    that we can check it in xfs_ondisk.h, and will be needed once we start
    logging attribute values.

    On amd64 we get the following pahole:

    struct xfs_buf_log_format {
    short unsigned int blf_type; /* 0 2 */
    short unsigned int blf_size; /* 2 2 */
    short unsigned int blf_flags; /* 4 2 */
    short unsigned int blf_len; /* 6 2 */
    long long int blf_blkno; /* 8 8 */
    unsigned int blf_map_size; /* 16 4 */
    unsigned int blf_data_map[16]; /* 20 64 */
    /* --- cacheline 1 boundary (64 bytes) was 20 bytes ago --- */

    /* size: 88, cachelines: 2, members: 7 */
    /* padding: 4 */
    /* last cacheline: 24 bytes */
    };

    But on i386 we get the following:

    struct xfs_buf_log_format {
    short unsigned int blf_type; /* 0 2 */
    short unsigned int blf_size; /* 2 2 */
    short unsigned int blf_flags; /* 4 2 */
    short unsigned int blf_len; /* 6 2 */
    long long int blf_blkno; /* 8 8 */
    unsigned int blf_map_size; /* 16 4 */
    unsigned int blf_data_map[16]; /* 20 64 */
    /* --- cacheline 1 boundary (64 bytes) was 20 bytes ago --- */

    /* size: 84, cachelines: 2, members: 7 */
    /* last cacheline: 20 bytes */
    };

    Notice how the amd64 compiler inserts 4 bytes of padding to the end of
    the structure to ensure 8-byte alignment. Prior to "xfs: fix memory
    corruption during remote attr value buffer invalidation" we would try to
    write to blf_data_map[17], which is harmless on amd64 but really bad on
    i386.

    This shouldn't cause any changes in the ondisk logging formats because
    the log code writes out the log vectors with the appropriate size for
    the log item's map_size, and log recovery treats the data_map array as a
    VLA.

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

    Darrick J. Wong
     
  • Complain if someone calls xfs_buf_item_init on a buffer that is larger
    than the dirty bitmap can handle, or tries to log a region that's past
    the end of the dirty bitmap.

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

    Darrick J. Wong
     
  • The only thing that can cause a nonzero return from
    xfs_buf_item_get_format is if the kmem_alloc fails, which it can't.
    Get rid of all the unnecessary error handling.

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

    Darrick J. Wong
     
  • Now that we know we don't have to take a transaction to stale the incore
    buffers for a remote value, get rid of the unnecessary memory allocation
    in the leaf walker and call the rmt_stale function directly. Flatten
    the loop while we're at it.

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

    Darrick J. Wong
     
  • While running generic/103, I observed what looks like memory corruption
    and (with slub debugging turned on) a slub redzone warning on i386 when
    inactivating an inode with a 64k remote attr value.

    On a v5 filesystem, maximally sized remote attr values require one block
    more than 64k worth of space to hold both the remote attribute value
    header (64 bytes). On a 4k block filesystem this results in a 68k
    buffer; on a 64k block filesystem, this would be a 128k buffer. Note
    that even though we'll never use more than 65,600 bytes of this buffer,
    XFS_MAX_BLOCKSIZE is 64k.

    This is a problem because the definition of struct xfs_buf_log_format
    allows for XFS_MAX_BLOCKSIZE worth of dirty bitmap (64k). On i386 when we
    invalidate a remote attribute, xfs_trans_binval zeroes all 68k worth of
    the dirty map, writing right off the end of the log item and corrupting
    memory. We've gotten away with this on x86_64 for years because the
    compiler inserts a u32 padding on the end of struct xfs_buf_log_format.

    Fortunately for us, remote attribute values are written to disk with
    xfs_bwrite(), which is to say that they are not logged. Fix the problem
    by removing all places where we could end up creating a buffer log item
    for a remote attribute value and leave a note explaining why. Next,
    replace the open-coded buffer invalidation with a call to the helper we
    created in the previous patch that does better checking for bad metadata
    before marking the buffer stale.

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

    Darrick J. Wong
     
  • Hoist the code that invalidates remote extended attribute value buffers
    into a separate helper function. This prepares us for a memory
    corruption fix in the next patch.

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

    Darrick J. Wong
     

16 Jan, 2020

2 commits

  • Direct I/O reads can also be used with RWF_NOWAIT & co. Fix the inode
    locking in xfs_file_dio_aio_read to take IOCB_NOWAIT into account.

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

    Christoph Hellwig
     
  • xfs_check_ondisk_structs() verifies that the sizes of the data types
    used by xfs are correct via the XFS_CHECK_STRUCT_SIZE() macro.

    Since the structures padding can vary depending on the ABI (e.g. on
    ARM OABI structures are padded to multiple of 32 bits), it may happen
    that xfs_dir2_sf_entry_t size check breaks the compilation with the
    assertion below:

    In file included from linux/include/linux/string.h:6,
    from linux/include/linux/uuid.h:12,
    from linux/fs/xfs/xfs_linux.h:10,
    from linux/fs/xfs/xfs.h:22,
    from linux/fs/xfs/xfs_super.c:7:
    In function ‘xfs_check_ondisk_structs’,
    inlined from ‘init_xfs_fs’ at linux/fs/xfs/xfs_super.c:2025:2:
    linux/include/linux/compiler.h:350:38:
    error: call to ‘__compiletime_assert_107’ declared with attribute
    error: XFS: sizeof(xfs_dir2_sf_entry_t) is wrong, expected 3
    _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)

    Restore the correct behavior adding __packed to the structure definition.

    Cc: Darrick J. Wong
    Suggested-by: Christoph Hellwig
    Signed-off-by: Vincenzo Frascino
    Reviewed-by: Darrick J. Wong
    Signed-off-by: Darrick J. Wong

    Vincenzo Frascino
     

15 Jan, 2020

3 commits

  • I observed a hang in generic/308 while running fstests on a i686 kernel.
    The hang occurred when trying to purge the pagecache on a large sparse
    file that had a page created past MAX_LFS_FILESIZE, which caused an
    integer overflow in the pagecache xarray and resulted in an infinite
    loop.

    I then noticed that Linus changed the definition of MAX_LFS_FILESIZE in
    commit 0cc3b0ec23ce ("Clarify (and fix) MAX_LFS_FILESIZE macros") so
    that it is now one page short of the maximum page index on 32-bit
    kernels. Because the XFS function to compute max offset open-codes the
    2005-era MAX_LFS_FILESIZE computation and neither the vfs nor mm perform
    any sanity checking of s_maxbytes, the code in generic/308 can create a
    page above the pagecache's limit and kaboom.

    Fix all this by setting s_maxbytes to MAX_LFS_FILESIZE directly and
    aborting the mount with a warning if our assumptions ever break. I have
    no answer for why this seems to have been broken for years and nobody
    noticed.

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

    Darrick J. Wong
     
  • xfs_itruncate_extents_flags() is supposed to unmap every block in a file
    from EOF onwards. Oddly, it uses s_maxbytes as the upper limit to the
    bunmapi range, even though s_maxbytes reflects the highest offset the
    pagecache can support, not the highest offset that XFS supports.

    The result of this confusion is that if you create a 20T file on a
    64-bit machine, mount the filesystem on a 32-bit machine, and remove the
    file, we leak everything above 16T. Fix this by capping the bunmapi
    request at the maximum possible block offset, not s_maxbytes.

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

    Darrick J. Wong
     
  • Introduce a new #define for the maximum supported file block offset.
    We'll use this in the next patch to make it more obvious that we're
    doing some operation for all possible inode fork mappings after a given
    offset. We can't use ULLONG_MAX here because bunmapi uses that to
    detect when it's done.

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

    Darrick J. Wong
     

10 Jan, 2020

6 commits

  • We don't need to assert on !REPAIR in the stub version of
    xrep_calc_ag_resblks that is called when online repair hasn't been
    compiled into the kernel because none of the repair code will ever run.

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

    Darrick J. Wong
     
  • This helps to pre-simplify the extra handling of the null terminator in
    delayed operations which use memcpy rather than strlen. Later
    when we introduce parent pointers, attribute names will become binary,
    so strlen will not work at all. Removing uses of strlen now will
    help reduce complexities later

    Signed-off-by: Allison Collins
    Reviewed-by: Darrick J. Wong
    Reviewed-by: Brian Foster
    Reviewed-by: Christoph Hellwig
    Signed-off-by: Darrick J. Wong

    Allison Henderson
     
  • XFS_ATTR_INCOMPLETE is a flag in the on-disk attribute format, and thus
    in a different namespace as the ATTR_* flags in xfs_da_args.flags.
    Switch to using a XFS_DA_OP_INCOMPLETE flag in op_flags instead. Without
    this users might be able to inject this flag into operations using the
    attr by handle ioctl.

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

    Christoph Hellwig
     
  • We should not just invalidate the ACL when setting the underlying
    attribute, but also when removing it. The ioctl interface gets that
    right, but the normal xattr inteface skipped the xfs_forget_acl due
    to an early return.

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

    Christoph Hellwig
     
  • While the flags field in the ABI and the on-disk format allows for
    multiple namespace flags, that is a logically invalid combination that
    scrub complains about. Reject it at the ioctl level, as all other
    interface already get this right at higher levels.

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

    Christoph Hellwig
     
  • Don't allow passing arbitrary flags as they change behavior including
    memory allocation that the call stack is not prepared for.

    Fixes: ddbca70cc45c ("xfs: allocate xattr buffer on demand")
    Signed-off-by: Christoph Hellwig
    Reviewed-by: Darrick J. Wong
    Signed-off-by: Darrick J. Wong

    Christoph Hellwig
     

08 Jan, 2020

1 commit

  • Sparse warns about a shadow variable in this function after the
    Fixed: commit added another int i; with larger scope. It's safe
    to remove the one with the smaller scope to fix this shadow,
    although the shadow itself is harmless.

    Fixes: 2c813ad66a72 ("xfs: support btrees with overlapping intervals for keys")
    Signed-off-by: Eric Sandeen
    Reviewed-by: Darrick J. Wong
    Signed-off-by: Darrick J. Wong

    Eric Sandeen