Created
April 2, 2023 23:38
-
-
Save ammarfaizi2/22245759bad6de4aebf6d737274e96f8 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *device_path) | |
{ | |
struct btrfs_root *root = fs_info->dev_root; | |
struct btrfs_trans_handle *trans; | |
struct btrfs_device *device; | |
struct block_device *bdev; | |
struct super_block *sb = fs_info->sb; | |
struct btrfs_fs_devices *fs_devices = fs_info->fs_devices; | |
struct btrfs_fs_devices *seed_devices; | |
u64 orig_super_total_bytes; | |
u64 orig_super_num_devices; | |
int ret = 0; | |
bool seeding_dev = false; | |
bool locked = false; | |
if (sb_rdonly(sb) && !fs_devices->seeding) | |
return -EROFS; | |
bdev = blkdev_get_by_path(device_path, FMODE_WRITE | FMODE_EXCL, | |
fs_info->bdev_holder); | |
if (IS_ERR(bdev)) | |
return PTR_ERR(bdev); | |
if (!btrfs_check_device_zone_type(fs_info, bdev)) { | |
ret = -EINVAL; | |
goto error; | |
} | |
if (fs_devices->seeding) { | |
seeding_dev = true; | |
down_write(&sb->s_umount); | |
mutex_lock(&uuid_mutex); | |
locked = true; | |
} | |
sync_blockdev(bdev); | |
rcu_read_lock(); | |
list_for_each_entry_rcu(device, &fs_devices->devices, dev_list) { | |
if (device->bdev == bdev) { | |
ret = -EEXIST; | |
rcu_read_unlock(); | |
goto error; | |
} | |
} | |
rcu_read_unlock(); | |
device = btrfs_alloc_device(fs_info, NULL, NULL, device_path); | |
if (IS_ERR(device)) { | |
/* we can safely leave the fs_devices entry around */ | |
ret = PTR_ERR(device); | |
goto error; | |
} | |
device->fs_info = fs_info; | |
device->bdev = bdev; | |
ret = lookup_bdev(device_path, &device->devt); | |
if (ret) | |
goto error_free_device; | |
ret = btrfs_get_dev_zone_info(device, false); | |
if (ret) | |
goto error_free_device; | |
trans = btrfs_start_transaction(root, 0); | |
if (IS_ERR(trans)) { | |
ret = PTR_ERR(trans); | |
goto error_free_zone; | |
} | |
set_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state); | |
device->generation = trans->transid; | |
device->io_width = fs_info->sectorsize; | |
device->io_align = fs_info->sectorsize; | |
device->sector_size = fs_info->sectorsize; | |
device->total_bytes = | |
round_down(bdev_nr_bytes(bdev), fs_info->sectorsize); | |
device->disk_total_bytes = device->total_bytes; | |
device->commit_total_bytes = device->total_bytes; | |
set_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state); | |
clear_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state); | |
device->mode = FMODE_EXCL; | |
device->dev_stats_valid = 1; | |
set_blocksize(device->bdev, BTRFS_BDEV_BLOCKSIZE); | |
if (seeding_dev) { | |
btrfs_clear_sb_rdonly(sb); | |
/* GFP_KERNEL allocation must not be under device_list_mutex */ | |
seed_devices = btrfs_init_sprout(fs_info); | |
if (IS_ERR(seed_devices)) { | |
ret = PTR_ERR(seed_devices); | |
btrfs_abort_transaction(trans, ret); | |
goto error_trans; | |
} | |
} | |
mutex_lock(&fs_devices->device_list_mutex); | |
if (seeding_dev) { | |
btrfs_setup_sprout(fs_info, seed_devices); | |
btrfs_assign_next_active_device(fs_info->fs_devices->latest_dev, | |
device); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment