mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
btrfs: move btrfs_init_dev_replace_tgtdev to dev-replace.c and make static
The function logically belongs there and there's only a single caller, no need to export it. No code changes. Reviewed-by: Anand Jain <anand.jain@oracle.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
a425f9d475
commit
d48f39d5a5
3 changed files with 99 additions and 103 deletions
|
@ -176,6 +176,105 @@ out:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize a new device for device replace target from a given source dev
|
||||||
|
* and path.
|
||||||
|
*
|
||||||
|
* Return 0 and new device in @device_out, otherwise return < 0
|
||||||
|
*/
|
||||||
|
static int btrfs_init_dev_replace_tgtdev(struct btrfs_fs_info *fs_info,
|
||||||
|
const char *device_path,
|
||||||
|
struct btrfs_device *srcdev,
|
||||||
|
struct btrfs_device **device_out)
|
||||||
|
{
|
||||||
|
struct btrfs_device *device;
|
||||||
|
struct block_device *bdev;
|
||||||
|
struct list_head *devices;
|
||||||
|
struct rcu_string *name;
|
||||||
|
u64 devid = BTRFS_DEV_REPLACE_DEVID;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
*device_out = NULL;
|
||||||
|
if (fs_info->fs_devices->seeding) {
|
||||||
|
btrfs_err(fs_info, "the filesystem is a seed filesystem!");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bdev = blkdev_get_by_path(device_path, FMODE_WRITE | FMODE_EXCL,
|
||||||
|
fs_info->bdev_holder);
|
||||||
|
if (IS_ERR(bdev)) {
|
||||||
|
btrfs_err(fs_info, "target device %s is invalid!", device_path);
|
||||||
|
return PTR_ERR(bdev);
|
||||||
|
}
|
||||||
|
|
||||||
|
filemap_write_and_wait(bdev->bd_inode->i_mapping);
|
||||||
|
|
||||||
|
devices = &fs_info->fs_devices->devices;
|
||||||
|
list_for_each_entry(device, devices, dev_list) {
|
||||||
|
if (device->bdev == bdev) {
|
||||||
|
btrfs_err(fs_info,
|
||||||
|
"target device is in the filesystem!");
|
||||||
|
ret = -EEXIST;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (i_size_read(bdev->bd_inode) <
|
||||||
|
btrfs_device_get_total_bytes(srcdev)) {
|
||||||
|
btrfs_err(fs_info,
|
||||||
|
"target device is smaller than source device!");
|
||||||
|
ret = -EINVAL;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
device = btrfs_alloc_device(NULL, &devid, NULL);
|
||||||
|
if (IS_ERR(device)) {
|
||||||
|
ret = PTR_ERR(device);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
name = rcu_string_strdup(device_path, GFP_KERNEL);
|
||||||
|
if (!name) {
|
||||||
|
btrfs_free_device(device);
|
||||||
|
ret = -ENOMEM;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
rcu_assign_pointer(device->name, name);
|
||||||
|
|
||||||
|
mutex_lock(&fs_info->fs_devices->device_list_mutex);
|
||||||
|
set_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state);
|
||||||
|
device->generation = 0;
|
||||||
|
device->io_width = fs_info->sectorsize;
|
||||||
|
device->io_align = fs_info->sectorsize;
|
||||||
|
device->sector_size = fs_info->sectorsize;
|
||||||
|
device->total_bytes = btrfs_device_get_total_bytes(srcdev);
|
||||||
|
device->disk_total_bytes = btrfs_device_get_disk_total_bytes(srcdev);
|
||||||
|
device->bytes_used = btrfs_device_get_bytes_used(srcdev);
|
||||||
|
device->commit_total_bytes = srcdev->commit_total_bytes;
|
||||||
|
device->commit_bytes_used = device->bytes_used;
|
||||||
|
device->fs_info = fs_info;
|
||||||
|
device->bdev = bdev;
|
||||||
|
set_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state);
|
||||||
|
set_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);
|
||||||
|
device->fs_devices = fs_info->fs_devices;
|
||||||
|
list_add(&device->dev_list, &fs_info->fs_devices->devices);
|
||||||
|
fs_info->fs_devices->num_devices++;
|
||||||
|
fs_info->fs_devices->open_devices++;
|
||||||
|
mutex_unlock(&fs_info->fs_devices->device_list_mutex);
|
||||||
|
|
||||||
|
*device_out = device;
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
error:
|
||||||
|
blkdev_put(bdev, FMODE_EXCL);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* called from commit_transaction. Writes changed device replace state to
|
* called from commit_transaction. Writes changed device replace state to
|
||||||
* disk.
|
* disk.
|
||||||
|
|
|
@ -2612,105 +2612,6 @@ error:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize a new device for device replace target from a given source dev
|
|
||||||
* and path.
|
|
||||||
*
|
|
||||||
* Return 0 and new device in @device_out, otherwise return < 0
|
|
||||||
*/
|
|
||||||
int btrfs_init_dev_replace_tgtdev(struct btrfs_fs_info *fs_info,
|
|
||||||
const char *device_path,
|
|
||||||
struct btrfs_device *srcdev,
|
|
||||||
struct btrfs_device **device_out)
|
|
||||||
{
|
|
||||||
struct btrfs_device *device;
|
|
||||||
struct block_device *bdev;
|
|
||||||
struct list_head *devices;
|
|
||||||
struct rcu_string *name;
|
|
||||||
u64 devid = BTRFS_DEV_REPLACE_DEVID;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
*device_out = NULL;
|
|
||||||
if (fs_info->fs_devices->seeding) {
|
|
||||||
btrfs_err(fs_info, "the filesystem is a seed filesystem!");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
bdev = blkdev_get_by_path(device_path, FMODE_WRITE | FMODE_EXCL,
|
|
||||||
fs_info->bdev_holder);
|
|
||||||
if (IS_ERR(bdev)) {
|
|
||||||
btrfs_err(fs_info, "target device %s is invalid!", device_path);
|
|
||||||
return PTR_ERR(bdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
filemap_write_and_wait(bdev->bd_inode->i_mapping);
|
|
||||||
|
|
||||||
devices = &fs_info->fs_devices->devices;
|
|
||||||
list_for_each_entry(device, devices, dev_list) {
|
|
||||||
if (device->bdev == bdev) {
|
|
||||||
btrfs_err(fs_info,
|
|
||||||
"target device is in the filesystem!");
|
|
||||||
ret = -EEXIST;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (i_size_read(bdev->bd_inode) <
|
|
||||||
btrfs_device_get_total_bytes(srcdev)) {
|
|
||||||
btrfs_err(fs_info,
|
|
||||||
"target device is smaller than source device!");
|
|
||||||
ret = -EINVAL;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
device = btrfs_alloc_device(NULL, &devid, NULL);
|
|
||||||
if (IS_ERR(device)) {
|
|
||||||
ret = PTR_ERR(device);
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
name = rcu_string_strdup(device_path, GFP_KERNEL);
|
|
||||||
if (!name) {
|
|
||||||
btrfs_free_device(device);
|
|
||||||
ret = -ENOMEM;
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
rcu_assign_pointer(device->name, name);
|
|
||||||
|
|
||||||
mutex_lock(&fs_info->fs_devices->device_list_mutex);
|
|
||||||
set_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state);
|
|
||||||
device->generation = 0;
|
|
||||||
device->io_width = fs_info->sectorsize;
|
|
||||||
device->io_align = fs_info->sectorsize;
|
|
||||||
device->sector_size = fs_info->sectorsize;
|
|
||||||
device->total_bytes = btrfs_device_get_total_bytes(srcdev);
|
|
||||||
device->disk_total_bytes = btrfs_device_get_disk_total_bytes(srcdev);
|
|
||||||
device->bytes_used = btrfs_device_get_bytes_used(srcdev);
|
|
||||||
device->commit_total_bytes = srcdev->commit_total_bytes;
|
|
||||||
device->commit_bytes_used = device->bytes_used;
|
|
||||||
device->fs_info = fs_info;
|
|
||||||
device->bdev = bdev;
|
|
||||||
set_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state);
|
|
||||||
set_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);
|
|
||||||
device->fs_devices = fs_info->fs_devices;
|
|
||||||
list_add(&device->dev_list, &fs_info->fs_devices->devices);
|
|
||||||
fs_info->fs_devices->num_devices++;
|
|
||||||
fs_info->fs_devices->open_devices++;
|
|
||||||
mutex_unlock(&fs_info->fs_devices->device_list_mutex);
|
|
||||||
|
|
||||||
*device_out = device;
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
error:
|
|
||||||
blkdev_put(bdev, FMODE_EXCL);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static noinline int btrfs_update_device(struct btrfs_trans_handle *trans,
|
static noinline int btrfs_update_device(struct btrfs_trans_handle *trans,
|
||||||
struct btrfs_device *device)
|
struct btrfs_device *device)
|
||||||
{
|
{
|
||||||
|
|
|
@ -432,10 +432,6 @@ struct btrfs_device *btrfs_find_device(struct btrfs_fs_info *fs_info, u64 devid,
|
||||||
u8 *uuid, u8 *fsid);
|
u8 *uuid, u8 *fsid);
|
||||||
int btrfs_shrink_device(struct btrfs_device *device, u64 new_size);
|
int btrfs_shrink_device(struct btrfs_device *device, u64 new_size);
|
||||||
int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *path);
|
int btrfs_init_new_device(struct btrfs_fs_info *fs_info, const char *path);
|
||||||
int btrfs_init_dev_replace_tgtdev(struct btrfs_fs_info *fs_info,
|
|
||||||
const char *device_path,
|
|
||||||
struct btrfs_device *srcdev,
|
|
||||||
struct btrfs_device **device_out);
|
|
||||||
int btrfs_balance(struct btrfs_balance_control *bctl,
|
int btrfs_balance(struct btrfs_balance_control *bctl,
|
||||||
struct btrfs_ioctl_balance_args *bargs);
|
struct btrfs_ioctl_balance_args *bargs);
|
||||||
int btrfs_resume_balance_async(struct btrfs_fs_info *fs_info);
|
int btrfs_resume_balance_async(struct btrfs_fs_info *fs_info);
|
||||||
|
|
Loading…
Add table
Reference in a new issue