78 lines
2.6 KiB
Diff
78 lines
2.6 KiB
Diff
diff --git a/fs/btrfs/tree-checker.c b/fs/btrfs/tree-checker.c
|
|
--- a/fs/btrfs/tree-checker.c
|
|
+++ b/fs/btrfs/tree-checker.c
|
|
@@ -2306,7 +2306,7 @@ static int check_free_space_extent(struct extent_buffer *leaf, struct btrfs_key
|
|
|
|
if (unlikely(btrfs_item_size(leaf, slot) != 0)) {
|
|
generic_err(leaf, slot,
|
|
- "invalid item size for free space info, has %u expect 0",
|
|
+ "invalid item size for free space extent, has %u expect 0",
|
|
btrfs_item_size(leaf, slot));
|
|
return -EUCLEAN;
|
|
}
|
|
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
|
|
--- a/fs/btrfs/volumes.c
|
|
+++ b/fs/btrfs/volumes.c
|
|
@@ -740,6 +740,36 @@ const u8 *btrfs_sb_fsid_ptr(const struct btrfs_super_block *sb)
|
|
return has_metadata_uuid ? sb->metadata_uuid : sb->fsid;
|
|
}
|
|
|
|
+static bool should_rename_device(const struct btrfs_device *dev)
|
|
+{
|
|
+ bool ret;
|
|
+ const char *old_name;
|
|
+
|
|
+ rcu_read_lock();
|
|
+ old_name = rcu_dereference(dev->name);
|
|
+ /*
|
|
+ * For systems booted without an initramfs, the rootfs has the device
|
|
+ * name "/dev/root".
|
|
+ *
|
|
+ * Although using btrfs without an initramfs is not recommended (if a
|
|
+ * new device is added to the rootfs, the system can no longer boot, as
|
|
+ * there is no way to register all devices), there is still a minority
|
|
+ * of users doing this.
|
|
+ *
|
|
+ * And after the system is up, a later device scan on the real block
|
|
+ * device file will never get this device's name updated, as the
|
|
+ * device->devt is still the same.
|
|
+ *
|
|
+ * Here we add one and only one exception for "/dev/root", to allow the
|
|
+ * device name to be updated even if the new path points to the same
|
|
+ * block device.
|
|
+ */
|
|
+ ret = (strcmp(old_name, "/dev/root") == 0);
|
|
+ rcu_read_unlock();
|
|
+
|
|
+ return ret;
|
|
+}
|
|
+
|
|
/*
|
|
* Add new device to list of registered devices
|
|
*
|
|
@@ -860,7 +890,8 @@ static noinline struct btrfs_device *device_list_add(const char *path,
|
|
MAJOR(path_devt), MINOR(path_devt),
|
|
current->comm, task_pid_nr(current));
|
|
|
|
- } else if (!device->name || device->devt != path_devt) {
|
|
+ } else if (!device->name || device->devt != path_devt ||
|
|
+ should_rename_device(device)) {
|
|
const char *old_name;
|
|
|
|
/*
|
|
diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c
|
|
--- a/fs/btrfs/zoned.c
|
|
+++ b/fs/btrfs/zoned.c
|
|
@@ -2688,6 +2688,11 @@ bool btrfs_can_activate_zone(struct btrfs_fs_devices *fs_devices, u64 flags)
|
|
|
|
switch (flags & BTRFS_BLOCK_GROUP_PROFILE_MASK) {
|
|
case 0: /* single */
|
|
+ case BTRFS_BLOCK_GROUP_RAID0:
|
|
+ case BTRFS_BLOCK_GROUP_RAID1:
|
|
+ case BTRFS_BLOCK_GROUP_RAID1C3:
|
|
+ case BTRFS_BLOCK_GROUP_RAID1C4:
|
|
+ case BTRFS_BLOCK_GROUP_RAID10:
|
|
ret = (atomic_read(&zinfo->active_zones_left) >= (1 + reserved));
|
|
break;
|
|
case BTRFS_BLOCK_GROUP_DUP:
|