]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
Merge tag 'for-6.9-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave...
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 27 Mar 2024 20:56:41 +0000 (13:56 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 27 Mar 2024 20:56:41 +0000 (13:56 -0700)
Pull btrfs fixes from David Sterba:

 - fix race when reading extent buffer and 'uptodate' status is missed
   by one thread (introduced in 6.5)

 - do additional validation of devices using major:minor numbers

 - zoned mode fixes:
     - use zone-aware super block access during scrub
     - fix use-after-free during device replace (found by KASAN)
     - also delete zones that are 100% unusable to reclaim space

 - extent unpinning fixes:
     - fix extent map leak after error handling
     - print correct range in error message

 - error code and message updates

* tag 'for-6.9-rc1-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux:
  btrfs: fix race in read_extent_buffer_pages()
  btrfs: return accurate error code on open failure in open_fs_devices()
  btrfs: zoned: don't skip block groups with 100% zone unusable
  btrfs: use btrfs_warn() to log message at btrfs_add_extent_mapping()
  btrfs: fix message not properly printing interval when adding extent map
  btrfs: fix warning messages not printing interval at unpin_extent_range()
  btrfs: fix extent map leak in unexpected scenario at unpin_extent_cache()
  btrfs: validate device maj:min during open
  btrfs: zoned: fix use-after-free in do_zone_finish()
  btrfs: zoned: use zone aware sb location for scrub

1  2 
fs/btrfs/volumes.c
fs/btrfs/zoned.c

index 1dc1f1946ae0eb3158a38b2d214746e7cc4a09ee,dedec3d9b1117d9fcca42c9d301bfef86e5782ff..f15591f3e54fa4cd7e92103e17b0ae74eb1a54f9
@@@ -682,16 -682,26 +682,26 @@@ static int btrfs_open_one_device(struc
                        set_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state);
        }
  
 -      if (!bdev_nonrot(bdev_handle->bdev))
 +      if (!bdev_nonrot(file_bdev(bdev_file)))
                fs_devices->rotating = true;
  
 -      if (bdev_max_discard_sectors(bdev_handle->bdev))
 +      if (bdev_max_discard_sectors(file_bdev(bdev_file)))
                fs_devices->discardable = true;
  
 -      device->bdev_handle = bdev_handle;
 -      device->bdev = bdev_handle->bdev;
 +      device->bdev_file = bdev_file;
 +      device->bdev = file_bdev(bdev_file);
        clear_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state);
  
+       if (device->devt != device->bdev->bd_dev) {
+               btrfs_warn(NULL,
+                          "device %s maj:min changed from %d:%d to %d:%d",
+                          device->name->str, MAJOR(device->devt),
+                          MINOR(device->devt), MAJOR(device->bdev->bd_dev),
+                          MINOR(device->bdev->bd_dev));
+               device->devt = device->bdev->bd_dev;
+       }
        fs_devices->open_devices++;
        if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state) &&
            device->devid != BTRFS_DEV_REPLACE_DEVID) {
index 5a3d5ec75c5a94262c2431fce61c84d1e95f7512,459d1af02c3ce0d667ff854f13a31d2ad9260e7f..4cba80b34387c102a15299a69f1bd11fc0caff2f
@@@ -2260,14 -2243,15 +2257,16 @@@ static int do_zone_finish(struct btrfs_
                if (zinfo->max_active_zones == 0)
                        continue;
  
 +              nofs_flags = memalloc_nofs_save();
                ret = blkdev_zone_mgmt(device->bdev, REQ_OP_ZONE_FINISH,
                                       physical >> SECTOR_SHIFT,
 -                                     zinfo->zone_size >> SECTOR_SHIFT,
 -                                     GFP_NOFS);
 +                                     zinfo->zone_size >> SECTOR_SHIFT);
 +              memalloc_nofs_restore(nofs_flags);
  
-               if (ret)
+               if (ret) {
+                       up_read(&dev_replace->rwsem);
                        return ret;
+               }
  
                if (!(block_group->flags & BTRFS_BLOCK_GROUP_DATA))
                        zinfo->reserved_active_zones++;