08 Jul, 2020

1 commit

  • So far, gfs2 has taken the inode glocks inside the ->readpage and
    ->readahead address space operations. Since commit d4388340ae0b ("fs:
    convert mpage_readpages to mpage_readahead"), gfs2_readahead is passed
    the pages to read ahead locked. With that, the current holder of the
    inode glock may be trying to lock one of those pages while
    gfs2_readahead is trying to take the inode glock, resulting in a
    deadlock.

    Fix that by moving the lock taking to the higher-level ->read_iter file
    and ->fault vm operations. This also gets rid of an ugly lock inversion
    workaround in gfs2_readpage.

    The cache consistency model of filesystems like gfs2 is such that if
    data is found in the page cache, the data is up to date and can be used
    without taking any filesystem locks. If a page is not cached,
    filesystem locks must be taken before populating the page cache.

    To avoid taking the inode glock when the data is already cached,
    gfs2_file_read_iter first tries to read the data with the IOCB_NOIO flag
    set. If that fails, the inode glock is taken and the operation is
    retried with the IOCB_NOIO flag cleared.

    Signed-off-by: Andreas Gruenbacher

    Andreas Gruenbacher
     

28 Mar, 2020

4 commits

  • We now get the quota data structure when opening a file writable and put it
    when closing that writable file descriptor, so there no longer is a need for
    gfs2_qa_{get,put} while we're holding a writable file descriptor.

    Signed-off-by: Andreas Gruenbacher
    Signed-off-by: Bob Peterson

    Andreas Gruenbacher
     
  • Keeping reservations and quotas separate helps reviewing the code.

    Signed-off-by: Andreas Gruenbacher
    Signed-off-by: Bob Peterson

    Andreas Gruenbacher
     
  • Before this patch, multiple users called gfs2_qa_alloc which allocated
    a qadata structure to the inode, if quotas are turned on. Later, in
    file close or evict, the structure was deleted with gfs2_qa_delete.
    But there can be several competing processes who need access to the
    structure. There were races between file close (release) and the others.
    Thus, a release could delete the structure out from under a process
    that relied upon its existence. For example, chown.

    This patch changes the management of the qadata structures to be
    a get/put scheme. Function gfs2_qa_alloc has been changed to gfs2_qa_get
    and if the structure is allocated, the count essentially starts out at
    1. Function gfs2_qa_delete has been renamed to gfs2_qa_put, and the
    last guy to decrement the count to 0 frees the memory.

    Signed-off-by: Bob Peterson

    Bob Peterson
     
  • Before this patch, multiple callers called gfs2_rsqa_alloc to force
    the existence of a reservations structure and a quota data structure
    if needed. However, now the reservations are handled separately, so
    the quota data is only the quota data. So we eliminate the one in
    favor of just calling gfs2_qa_alloc directly.

    Signed-off-by: Bob Peterson

    Bob Peterson
     

07 Feb, 2020

2 commits

  • In gfs2_file_write_iter, for direct writes, the error checking in the buffered
    write fallback case is incomplete. This can cause inode write errors to go
    undetected. Fix and clean up gfs2_file_write_iter along the way.

    Based on a proposed fix by Christoph Hellwig .

    Fixes: 967bcc91b044 ("gfs2: iomap direct I/O support")
    Cc: stable@vger.kernel.org # v4.19+
    Signed-off-by: Andreas Gruenbacher

    Andreas Gruenbacher
     
  • Set current->backing_dev_info just around the buffered write calls to
    prepare for the next fix.

    Fixes: 967bcc91b044 ("gfs2: iomap direct I/O support")
    Cc: stable@vger.kernel.org # v4.19+
    Signed-off-by: Christoph Hellwig
    Signed-off-by: Andreas Gruenbacher

    Christoph Hellwig
     

06 Dec, 2019

1 commit

  • Pull GFS2 updates from Andreas Gruenbacher:
    "Bob's extensive filesystem withdrawal and recovery testing:
    - don't write log headers after file system withdraw
    - clean up iopen glock mess in gfs2_create_inode
    - close timing window with GLF_INVALIDATE_IN_PROGRESS
    - abort gfs2_freeze if io error is seen
    - don't loop forever in gfs2_freeze if withdrawn
    - fix infinite loop in gfs2_ail1_flush on io error
    - introduce function gfs2_withdrawn
    - fix glock reference problem in gfs2_trans_remove_revoke

    Filesystems with a block size smaller than the page size:
    - fix end-of-file handling in gfs2_page_mkwrite
    - improve mmap write vs. punch_hole consistency

    Other:
    - remove active journal side effect from gfs2_write_log_header
    - multi-block allocations in gfs2_page_mkwrite

    Minor cleanups and coding style fixes:
    - remove duplicate call from gfs2_create_inode
    - make gfs2_log_shutdown static
    - make gfs2_fs_parameters static
    - some whitespace cleanups
    - removed unnecessary semicolon"

    * tag 'gfs2-for-5.5' of git://git.kernel.org/pub/scm/linux/kernel/git/gfs2/linux-gfs2:
    gfs2: Don't write log headers after file system withdraw
    gfs2: Remove duplicate call from gfs2_create_inode
    gfs2: clean up iopen glock mess in gfs2_create_inode
    gfs2: Close timing window with GLF_INVALIDATE_IN_PROGRESS
    gfs2: Abort gfs2_freeze if io error is seen
    gfs2: Don't loop forever in gfs2_freeze if withdrawn
    gfs2: fix infinite loop in gfs2_ail1_flush on io error
    gfs2: Introduce function gfs2_withdrawn
    gfs2: fix glock reference problem in gfs2_trans_remove_revoke
    gfs2: make gfs2_log_shutdown static
    gfs2: Remove active journal side effect from gfs2_write_log_header
    gfs2: Fix end-of-file handling in gfs2_page_mkwrite
    gfs2: Multi-block allocations in gfs2_page_mkwrite
    gfs2: Improve mmap write vs. punch_hole consistency
    gfs2: make gfs2_fs_parameters static
    gfs2: Some whitespace cleanups
    gfs2: removed unnecessary semicolon

    Linus Torvalds
     

02 Dec, 2019

1 commit

  • Pull removal of most of fs/compat_ioctl.c from Arnd Bergmann:
    "As part of the cleanup of some remaining y2038 issues, I came to
    fs/compat_ioctl.c, which still has a couple of commands that need
    support for time64_t.

    In completely unrelated work, I spent time on cleaning up parts of
    this file in the past, moving things out into drivers instead.

    After Al Viro reviewed an earlier version of this series and did a lot
    more of that cleanup, I decided to try to completely eliminate the
    rest of it and move it all into drivers.

    This series incorporates some of Al's work and many patches of my own,
    but in the end stops short of actually removing the last part, which
    is the scsi ioctl handlers. I have patches for those as well, but they
    need more testing or possibly a rewrite"

    * tag 'compat-ioctl-5.5' of git://git.kernel.org:/pub/scm/linux/kernel/git/arnd/playground: (42 commits)
    scsi: sd: enable compat ioctls for sed-opal
    pktcdvd: add compat_ioctl handler
    compat_ioctl: move SG_GET_REQUEST_TABLE handling
    compat_ioctl: ppp: move simple commands into ppp_generic.c
    compat_ioctl: handle PPPIOCGIDLE for 64-bit time_t
    compat_ioctl: move PPPIOCSCOMPRESS to ppp_generic
    compat_ioctl: unify copy-in of ppp filters
    tty: handle compat PPP ioctls
    compat_ioctl: move SIOCOUTQ out of compat_ioctl.c
    compat_ioctl: handle SIOCOUTQNSD
    af_unix: add compat_ioctl support
    compat_ioctl: reimplement SG_IO handling
    compat_ioctl: move WDIOC handling into wdt drivers
    fs: compat_ioctl: move FITRIM emulation into file systems
    gfs2: add compat_ioctl support
    compat_ioctl: remove unused convert_in_user macro
    compat_ioctl: remove last RAID handling code
    compat_ioctl: remove /dev/raw ioctl translation
    compat_ioctl: remove PCI ioctl translation
    compat_ioctl: remove joystick ioctl translation
    ...

    Linus Torvalds
     

15 Nov, 2019

1 commit

  • Add function gfs2_withdrawn and replace all checks for the SDF_WITHDRAWN
    bit to call it. This does not change the logic or function of gfs2, and
    it facilitates later improvements to the withdraw sequence.

    Signed-off-by: Bob Peterson
    Signed-off-by: Andreas Gruenbacher

    Bob Peterson
     

08 Nov, 2019

2 commits

  • When the filesystem block size is smaller than the page size, the last
    page may contain blocks that lie entirely beyond the end of the file.
    Make sure to only allocate blocks that lie at least partially in the
    file. Allocating blocks beyond that isn't useful, and what's more, they
    will not be zeroed out and may end up containing random data.

    With that change in place, make sure we'll still always unstuff stuffed
    inodes: iomap_writepage and iomap_writepages currently can't handle
    stuffed files.

    In addition, simplify and move the end-of-file check further to the top
    in gfs2_page_mkwrite to avoid weird side effects like unstuffing when
    we're not.

    Fixes xfstest generic/263.

    Signed-off-by: Andreas Gruenbacher

    Andreas Gruenbacher
     
  • In gfs2_page_mkwrite's gfs2_allocate_page_backing helper, try to
    allocate as many blocks at once as we need. Pass in the size of the
    requested allocation.

    Fixes: 35af80aef99b ("gfs2: don't use buffer_heads in gfs2_allocate_page_backing")
    Cc: stable@vger.kernel.org # v5.3+
    Signed-off-by: Andreas Gruenbacher

    Andreas Gruenbacher
     

30 Oct, 2019

1 commit


23 Oct, 2019

1 commit

  • Out of the four ioctl commands supported on gfs2, only FITRIM
    works in compat mode.

    Add a proper handler based on the ext4 implementation.

    Fixes: 6ddc5c3ddf25 ("gfs2: getlabel support")
    Reviewed-by: Bob Peterson
    Cc: Andreas Gruenbacher
    Signed-off-by: Arnd Bergmann

    Arnd Bergmann
     

15 Oct, 2019

1 commit

  • Filesystems do not support doing IO as asynchronous in some cases. For
    example in case of unaligned writes or in case file size needs to be
    extended (e.g. for ext4). Instead of forcing filesystem to wait for AIO
    in such cases, add argument to iomap_dio_rw() which makes the function
    wait for IO completion. This also results in executing
    iomap_dio_complete() inline in iomap_dio_rw() providing its return value
    to the caller as for ordinary sync IO.

    Signed-off-by: Jan Kara
    Reviewed-by: Darrick J. Wong
    Signed-off-by: Darrick J. Wong

    Jan Kara
     

05 Sep, 2019

1 commit


03 Sep, 2019

1 commit

  • When allocating space with fallocate, always update the file timestamps
    and mark the inode dirty, no matter if the FALLOC_FL_KEEP_SIZE flag is
    set or not. The inode needs to be marked dirty so that a subsequent
    fsync will pick it up and any new allocations will make it to disk.
    Filesystems like xfs and ext4 always update the timestamps, so make
    gfs2 behave the same way.

    Fixes xfstest generic/483.

    Signed-off-by: Andreas Gruenbacher

    Andreas Gruenbacher
     

13 Jul, 2019

1 commit

  • Pull common SETFLAGS/FSSETXATTR parameter checking from Darrick Wong:
    "Here's a patch series that sets up common parameter checking functions
    for the FS_IOC_SETFLAGS and FS_IOC_FSSETXATTR ioctl implementations.

    The goal here is to reduce the amount of behaviorial variance between
    the filesystems where those ioctls originated (ext2 and XFS,
    respectively) and everybody else.

    - Standardize parameter checking for the SETFLAGS and FSSETXATTR
    ioctls (which were the file attribute setters for ext4 and xfs and
    have now been hoisted to the vfs)

    - Only allow the DAX flag to be set on files and directories"

    * tag 'vfs-fix-ioctl-checking-3' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux:
    vfs: only allow FSSETXATTR to set DAX flag on files and dirs
    vfs: teach vfs_ioc_fssetxattr_check to check extent size hints
    vfs: teach vfs_ioc_fssetxattr_check to check project id info
    vfs: create a generic checking function for FS_IOC_FSSETXATTR
    vfs: create a generic checking and prep function for FS_IOC_SETFLAGS

    Linus Torvalds
     

03 Jul, 2019

2 commits


01 Jul, 2019

1 commit

  • Create a generic function to check incoming FS_IOC_SETFLAGS flag values
    and later prepare the inode for updates so that we can standardize the
    implementations that follow ext4's flag values.

    Note that the efivarfs implementation no longer fails a no-op SETFLAGS
    without CAP_LINUX_IMMUTABLE since that's the behavior in ext*.

    Signed-off-by: Darrick J. Wong
    Reviewed-by: Jan Kara
    Reviewed-by: Christoph Hellwig
    Acked-by: David Sterba
    Reviewed-by: Bob Peterson

    Darrick J. Wong
     

28 Jun, 2019

1 commit


05 Jun, 2019

1 commit

  • Based on 1 normalized pattern(s):

    this copyrighted material is made available to anyone wishing to use
    modify copy or redistribute it subject to the terms and conditions
    of the gnu general public license version 2

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-only

    has been chosen to replace the boilerplate/reference in 44 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Allison Randal
    Reviewed-by: Kate Stewart
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190531081038.653000175@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     

24 Feb, 2019

1 commit

  • Store the request queue the last bio was submitted to in the iocb
    private data in addition to the cookie so that we find the right block
    device. Also refactor the common direct I/O bio submission code into a
    nice little helper.

    Signed-off-by: Christoph Hellwig

    Modified to use bio_set_polled().

    Reviewed-by: Hannes Reinecke
    Signed-off-by: Jens Axboe

    Christoph Hellwig
     

01 Dec, 2018

1 commit

  • Rather than assuming all-zeros is sufficient, use the available API to
    initialize the file_lock structure use for unlock. VFS-level changes
    will soon make it important that the list_heads in file_lock are
    always properly initialized.

    Signed-off-by: NeilBrown
    Reviewed-by: J. Bruce Fields
    Signed-off-by: Jeff Layton

    NeilBrown
     

12 Oct, 2018

1 commit


09 Oct, 2018

1 commit


25 Jul, 2018

4 commits

  • Remove the fallback code from direct to buffered I/O for stuffed reads.

    For stuffed writes, we must keep the fallback code: the deferred glock
    we are holding under direct I/O doesn't allow to write to the inode or
    change the file size.

    Signed-off-by: Andreas Gruenbacher
    Reviewed-by: Bob Peterson

    Andreas Gruenbacher
     
  • In fallocate_chunk, always initialize the iomap before calling
    gfs2_iomap_get_alloc: future changes could otherwise cause things like
    iomap.flags to leak across calls.

    Signed-off-by: Andreas Gruenbacher
    Reviewed-by: Bob Peterson

    Andreas Gruenbacher
     
  • Pull in the gfs2 iomap-write changes: Tweak the existing code to
    properly support iomap write and eliminate an unnecessary special case
    in gfs2_block_map. Implement iomap write support for buffered and
    direct I/O. Simplify some of the existing code and eliminate code that
    is no longer used:

    gfs2: Remove gfs2_write_{begin,end}
    gfs2: iomap direct I/O support
    gfs2: gfs2_extent_length cleanup
    gfs2: iomap buffered write support
    gfs2: Further iomap cleanups

    This is based on the following changes on the xfs 'iomap-4.19-merge'
    branch:

    iomap: add private pointer to struct iomap
    iomap: add a page_done callback
    iomap: generic inline data handling
    iomap: complete partial direct I/O writes synchronously
    iomap: mark newly allocated buffer heads as new
    fs: factor out a __generic_write_end helper

    Signed-off-by: Andreas Gruenbacher

    Andreas Gruenbacher
     
  • Use new return type vm_fault_t for gfs2_page_mkwrite
    handler.

    see commit 1c8f422059ae ("mm: change return type to
    vm_fault_t") for reference.

    Signed-off-by: Souptick Joarder
    Reviewed-by: Matthew Wilcox
    Signed-off-by: Andreas Gruenbacher

    Souptick Joarder
     

02 Jul, 2018

3 commits

  • The page unmapping previously done in gfs2_direct_IO is now done
    generically in iomap_dio_rw.

    Signed-off-by: Andreas Gruenbacher
    Reviewed-by: Bob Peterson

    Andreas Gruenbacher
     
  • With the traditional page-based writes, blocks are allocated separately
    for each page written to. With iomap writes, we can allocate a lot more
    blocks at once, with a fraction of the allocation overhead for each
    page.

    Split calculating the number of blocks that can be allocated at a given
    position (gfs2_alloc_size) off from gfs2_iomap_alloc: that size
    determines the number of blocks to allocate and reserve in the journal.

    Signed-off-by: Andreas Gruenbacher
    Reviewed-by: Bob Peterson

    Andreas Gruenbacher
     
  • In gfs2_iomap_alloc, set the type of newly allocated extents to
    IOMAP_MAPPED so that iomap_to_bh will set the bh states correctly:
    otherwise, the bhs would not be marked as mapped, confusing
    __mpage_writepage. This means that we need to check for the IOMAP_F_NEW
    flag in fallocate_chunk now.

    Further clean up gfs2_iomap_get and implement gfs2_stuffed_iomap here
    directly. For reads beyond the end of the file, return holes instead of
    failing with -ENOENT so that we can get rid of that special case in
    gfs2_block_map.

    Signed-off-by: Andreas Gruenbacher
    Reviewed-by: Bob Peterson

    Andreas Gruenbacher
     

04 Jun, 2018

1 commit

  • Clean up gfs2_iomap_alloc and gfs2_iomap_get. Document how
    gfs2_iomap_alloc works: it now needs to be called separately after
    gfs2_iomap_get where necessary; this will be used later by iomap write.
    Move gfs2_iomap_ops into bmap.c.

    Introduce a new gfs2_iomap_get_alloc helper and use it in
    fallocate_chunk: gfs2_iomap_begin will become unsuitable for fallocate
    with proper iomap write support.

    In gfs2_block_map and fallocate_chunk, zero-initialize struct iomap.

    Signed-off-by: Andreas Gruenbacher
    Signed-off-by: Bob Peterson

    Andreas Gruenbacher
     

29 Mar, 2018

1 commit

  • Instead of zeroing out fallocated blocks in gfs2_iomap_alloc, zero them
    out in fallocate_chunk, much higher up the call stack. This gets rid of
    gfs2's abuse of the IOMAP_ZERO flag as well as the gfs2 specific zeronew
    buffer flag. I can't think of a reason why zeroing out the blocks in
    gfs2_iomap_alloc would have any benefits: there is no additional locking
    at that level that would add protection to the newly allocated blocks.

    While at it, change fallocate over from gs2_block_map to gfs2_iomap_begin.

    Signed-off-by: Andreas Gruenbacher
    Signed-off-by: Bob Peterson
    Acked-by: Christoph Hellwig

    Andreas Gruenbacher
     

09 Mar, 2018

1 commit

  • The chunk size of allocations in __gfs2_fallocate is calculated
    incorrectly. The size can collapse, causing __gfs2_fallocate to
    allocate one block at a time, which is very inefficient. This needs
    fixing in two places:

    In gfs2_quota_lock_check, always set ap->allowed to UINT_MAX to indicate
    that there is no quota limit. This fixes callers that rely on
    ap->allowed to be set even when quotas are off.

    In __gfs2_fallocate, reset max_blks to UINT_MAX in each iteration of the
    loop to make sure that allocation limits from one resource group won't
    spill over into another resource group.

    Signed-off-by: Andreas Gruenbacher
    Signed-off-by: Bob Peterson

    Andreas Gruenbacher
     

23 Jan, 2018

2 commits

  • This patch just adds the capability for GFS2 to track which function
    called gfs2_log_flush. This should make it easier to diagnose
    problems based on the sequence of events found in the journals.

    Signed-off-by: Bob Peterson
    Reviewed-by: Andreas Gruenbacher

    Bob Peterson
     
  • This patch adds a new structure called gfs2_log_header_v2 which is used
    to store expanded fields into previously unused areas of the log headers
    (i.e., this change is backwards compatible). Some of these are used for
    debug purposes so we can backtrack when problems occur. Others are
    reserved for future expansion.

    This patch is based on a prototype from Steve Whitehouse.

    Signed-off-by: Bob Peterson
    Signed-off-by: Andreas Gruenbacher

    Bob Peterson
     

19 Jan, 2018

1 commit