You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable
* git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable: Btrfs: prevent RAID level downgrades when space is low Btrfs: account for missing devices in RAID allocation profiles Btrfs: EIO when we fail to read tree roots Btrfs: fix compiler warnings Btrfs: Make async snapshot ioctl more generic Btrfs: pwrite blocked when writing from the mmaped buffer of the same page Btrfs: Fix a crash when mounting a subvolume Btrfs: fix sync subvol/snapshot creation Btrfs: Fix page leak in compressed writeback path Btrfs: do not BUG if we fail to remove the orphan item for dead snapshots Btrfs: fixup return code for btrfs_del_orphan_item Btrfs: do not do fast caching if we are allocating blocks for tree_root Btrfs: deal with space cache errors better Btrfs: fix use after free in O_DIRECT
This commit is contained in:
+19
-1
@@ -412,12 +412,16 @@ static noinline int device_list_add(const char *path,
|
||||
|
||||
device->fs_devices = fs_devices;
|
||||
fs_devices->num_devices++;
|
||||
} else if (strcmp(device->name, path)) {
|
||||
} else if (!device->name || strcmp(device->name, path)) {
|
||||
name = kstrdup(path, GFP_NOFS);
|
||||
if (!name)
|
||||
return -ENOMEM;
|
||||
kfree(device->name);
|
||||
device->name = name;
|
||||
if (device->missing) {
|
||||
fs_devices->missing_devices--;
|
||||
device->missing = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (found_transid > fs_devices->latest_trans) {
|
||||
@@ -1236,6 +1240,9 @@ int btrfs_rm_device(struct btrfs_root *root, char *device_path)
|
||||
|
||||
device->fs_devices->num_devices--;
|
||||
|
||||
if (device->missing)
|
||||
root->fs_info->fs_devices->missing_devices--;
|
||||
|
||||
next_device = list_entry(root->fs_info->fs_devices->devices.next,
|
||||
struct btrfs_device, dev_list);
|
||||
if (device->bdev == root->fs_info->sb->s_bdev)
|
||||
@@ -3080,7 +3087,9 @@ static struct btrfs_device *add_missing_dev(struct btrfs_root *root,
|
||||
device->devid = devid;
|
||||
device->work.func = pending_bios_fn;
|
||||
device->fs_devices = fs_devices;
|
||||
device->missing = 1;
|
||||
fs_devices->num_devices++;
|
||||
fs_devices->missing_devices++;
|
||||
spin_lock_init(&device->io_lock);
|
||||
INIT_LIST_HEAD(&device->dev_alloc_list);
|
||||
memcpy(device->uuid, dev_uuid, BTRFS_UUID_SIZE);
|
||||
@@ -3278,6 +3287,15 @@ static int read_one_dev(struct btrfs_root *root,
|
||||
device = add_missing_dev(root, devid, dev_uuid);
|
||||
if (!device)
|
||||
return -ENOMEM;
|
||||
} else if (!device->missing) {
|
||||
/*
|
||||
* this happens when a device that was properly setup
|
||||
* in the device info lists suddenly goes bad.
|
||||
* device->bdev is NULL, and so we have to set
|
||||
* device->missing to one here
|
||||
*/
|
||||
root->fs_info->fs_devices->missing_devices++;
|
||||
device->missing = 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user