• Qu Wenruo's avatar
    btrfs: more graceful errors/warnings on 32bit systems when reaching limits · e9306ad4
    Qu Wenruo authored
    Btrfs uses internally mapped u64 address space for all its metadata.
    Due to the page cache limit on 32bit systems, btrfs can't access
    metadata at or beyond (ULONG_MAX + 1) << PAGE_SHIFT. See
    how MAX_LFS_FILESIZE and page::index are defined.  This is 16T for 4K
    page size while 256T for 64K page size.
    
    Users can have a filesystem which doesn't have metadata beyond the
    boundary at mount time, but later balance can cause it to create
    metadata beyond the boundary.
    
    And modification to MM layer is unrealistic just for such minor use
    case. We can't do more than to prevent mounting such filesystem or warn
    early when the numbers are still within the limits.
    
    To address such problem, this patch will introduce the following checks:
    
    - Mount time rejection
      This will reject any fs which has metadata chunk at or beyond the
      boundary.
    
    - Mount time early warning
      If there is any metadata chunk beyond 5/8th of the boundary, we do an
      early warning and hope the end user will see it.
    
    - Runtime extent buffer rejection
      If we're going to allocate an extent buffer at or beyond the boundary,
      reject such request with EOVERFLOW.
      This is definitely going to cause problems like transaction abort, but
      we have no better ways.
    
    - Runtime extent buffer early warning
      If an extent buffer beyond 5/8th of the max file size is allocated, do
      an early warning.
    
    Above error/warning message will only be printed once for each fs to
    reduce dmesg flood.
    
    If the mount is rejected, the filesystem will be mountable only on a
    64bit host.
    
    Link: https://lore.kernel.org/linux-btrfs/1783f16d-7a28-80e6-4c32-fdf19b705ed0@gmx.com/Reported-by: default avatarErik Jensen <erikjensen@rkjnsn.net>
    Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Signed-off-by: default avatarQu Wenruo <wqu@suse.com>
    Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    e9306ad4
extent_io.c 185 KB