* [PATCH 1/3] btrfs: warn for num_devices below 0
@ 2018-07-10 18:22 Anand Jain
2018-07-10 18:22 ` [PATCH 2/3] btrfs: add helper btrfs_num_devices() to deduce num_devices Anand Jain
` (2 more replies)
0 siblings, 3 replies; 13+ messages in thread
From: Anand Jain @ 2018-07-10 18:22 UTC (permalink / raw)
To: linux-btrfs
In preparation to de-duplicate a section of code where we deduce the
num_devices, use warn instead of bug.
Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
fs/btrfs/volumes.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index eb78bb8d1108..ce6faeb8bcf8 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -3813,7 +3813,7 @@ int btrfs_balance(struct btrfs_fs_info *fs_info,
num_devices = fs_info->fs_devices->num_devices;
btrfs_dev_replace_read_lock(&fs_info->dev_replace);
if (btrfs_dev_replace_is_ongoing(&fs_info->dev_replace)) {
- BUG_ON(num_devices < 1);
+ WARN_ON(num_devices < 1);
num_devices--;
}
btrfs_dev_replace_read_unlock(&fs_info->dev_replace);
--
2.7.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 2/3] btrfs: add helper btrfs_num_devices() to deduce num_devices
2018-07-10 18:22 [PATCH 1/3] btrfs: warn for num_devices below 0 Anand Jain
@ 2018-07-10 18:22 ` Anand Jain
2018-07-12 7:31 ` Nikolay Borisov
2018-07-10 18:22 ` [PATCH 3/3] btrfs: add helper function check device delete able Anand Jain
2018-07-12 7:13 ` [PATCH 1/3] btrfs: warn for num_devices below 0 Nikolay Borisov
2 siblings, 1 reply; 13+ messages in thread
From: Anand Jain @ 2018-07-10 18:22 UTC (permalink / raw)
To: linux-btrfs
When the replace is running the fs_devices::num_devices also includes
the replace device, however in some operations like device delete and
balance it needs the actual num_devices without the repalce devices, so
now the function btrfs_num_devices() just provides that.
Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
fs/btrfs/volumes.c | 31 +++++++++++++++++--------------
1 file changed, 17 insertions(+), 14 deletions(-)
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index ce6faeb8bcf8..59a6d8f42c98 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -1931,6 +1931,20 @@ void btrfs_assign_next_active_device(struct btrfs_fs_info *fs_info,
fs_info->fs_devices->latest_bdev = next_device->bdev;
}
+static inline u64 btrfs_num_devices(struct btrfs_fs_info *fs_info)
+{
+ u64 num_devices = fs_info->fs_devices->num_devices;
+
+ btrfs_dev_replace_read_lock(&fs_info->dev_replace);
+ if (btrfs_dev_replace_is_ongoing(&fs_info->dev_replace)) {
+ WARN_ON(num_devices < 1);
+ num_devices--;
+ }
+ btrfs_dev_replace_read_unlock(&fs_info->dev_replace);
+
+ return num_devices;
+}
+
int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
u64 devid)
{
@@ -1944,13 +1958,7 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
mutex_lock(&uuid_mutex);
- num_devices = fs_devices->num_devices;
- btrfs_dev_replace_read_lock(&fs_info->dev_replace);
- if (btrfs_dev_replace_is_ongoing(&fs_info->dev_replace)) {
- WARN_ON(num_devices < 1);
- num_devices--;
- }
- btrfs_dev_replace_read_unlock(&fs_info->dev_replace);
+ num_devices = btrfs_num_devices(fs_info);
ret = btrfs_check_raid_min_devices(fs_info, num_devices - 1);
if (ret)
@@ -3810,13 +3818,8 @@ int btrfs_balance(struct btrfs_fs_info *fs_info,
}
}
- num_devices = fs_info->fs_devices->num_devices;
- btrfs_dev_replace_read_lock(&fs_info->dev_replace);
- if (btrfs_dev_replace_is_ongoing(&fs_info->dev_replace)) {
- WARN_ON(num_devices < 1);
- num_devices--;
- }
- btrfs_dev_replace_read_unlock(&fs_info->dev_replace);
+ num_devices = btrfs_num_devices(fs_info);
+
allowed = BTRFS_AVAIL_ALLOC_BIT_SINGLE | BTRFS_BLOCK_GROUP_DUP;
if (num_devices > 1)
allowed |= (BTRFS_BLOCK_GROUP_RAID0 | BTRFS_BLOCK_GROUP_RAID1);
--
2.7.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 3/3] btrfs: add helper function check device delete able
2018-07-10 18:22 [PATCH 1/3] btrfs: warn for num_devices below 0 Anand Jain
2018-07-10 18:22 ` [PATCH 2/3] btrfs: add helper btrfs_num_devices() to deduce num_devices Anand Jain
@ 2018-07-10 18:22 ` Anand Jain
2018-07-12 7:43 ` Nikolay Borisov
2018-07-12 7:13 ` [PATCH 1/3] btrfs: warn for num_devices below 0 Nikolay Borisov
2 siblings, 1 reply; 13+ messages in thread
From: Anand Jain @ 2018-07-10 18:22 UTC (permalink / raw)
To: linux-btrfs
Move the section of the code which performs the check if the device is
indelible, move that into a helper function.
Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
fs/btrfs/volumes.c | 49 ++++++++++++++++++++++++++++++-------------------
1 file changed, 30 insertions(+), 19 deletions(-)
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 59a6d8f42c98..feb29c5b44f6 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -1945,6 +1945,33 @@ static inline u64 btrfs_num_devices(struct btrfs_fs_info *fs_info)
return num_devices;
}
+static struct btrfs_device *btrfs_device_delete_able(
+ struct btrfs_fs_info *fs_info,
+ const char *device_path, u64 devid)
+{
+ int ret;
+ struct btrfs_device *device;
+
+ ret = btrfs_check_raid_min_devices(fs_info,
+ btrfs_num_devices(fs_info) - 1);
+ if (ret)
+ return ERR_PTR(ret);
+
+ ret = btrfs_find_device_by_devspec(fs_info, devid, device_path,
+ &device);
+ if (ret)
+ return ERR_PTR(ret);
+
+ if (test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state))
+ return ERR_PTR(BTRFS_ERROR_DEV_TGT_REPLACE);
+
+ if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state) &&
+ fs_info->fs_devices->rw_devices == 1)
+ return ERR_PTR(BTRFS_ERROR_DEV_ONLY_WRITABLE);
+
+ return device;
+}
+
int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
u64 devid)
{
@@ -1958,25 +1985,9 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
mutex_lock(&uuid_mutex);
- num_devices = btrfs_num_devices(fs_info);
-
- ret = btrfs_check_raid_min_devices(fs_info, num_devices - 1);
- if (ret)
- goto out;
-
- ret = btrfs_find_device_by_devspec(fs_info, devid, device_path,
- &device);
- if (ret)
- goto out;
-
- if (test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state)) {
- ret = BTRFS_ERROR_DEV_TGT_REPLACE;
- goto out;
- }
-
- if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state) &&
- fs_info->fs_devices->rw_devices == 1) {
- ret = BTRFS_ERROR_DEV_ONLY_WRITABLE;
+ device = btrfs_device_delete_able(fs_info, device_path, devid);
+ if (IS_ERR(device)) {
+ ret = PTR_ERR(device);
goto out;
}
--
2.7.0
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 1/3] btrfs: warn for num_devices below 0
2018-07-10 18:22 [PATCH 1/3] btrfs: warn for num_devices below 0 Anand Jain
2018-07-10 18:22 ` [PATCH 2/3] btrfs: add helper btrfs_num_devices() to deduce num_devices Anand Jain
2018-07-10 18:22 ` [PATCH 3/3] btrfs: add helper function check device delete able Anand Jain
@ 2018-07-12 7:13 ` Nikolay Borisov
2018-07-13 11:05 ` Anand Jain
2 siblings, 1 reply; 13+ messages in thread
From: Nikolay Borisov @ 2018-07-12 7:13 UTC (permalink / raw)
To: Anand Jain, linux-btrfs
On 10.07.2018 21:22, Anand Jain wrote:
> In preparation to de-duplicate a section of code where we deduce the
> num_devices, use warn instead of bug.
>
> Signed-off-by: Anand Jain <anand.jain@oracle.com>
> ---
> fs/btrfs/volumes.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> index eb78bb8d1108..ce6faeb8bcf8 100644
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -3813,7 +3813,7 @@ int btrfs_balance(struct btrfs_fs_info *fs_info,
> num_devices = fs_info->fs_devices->num_devices;
> btrfs_dev_replace_read_lock(&fs_info->dev_replace);
> if (btrfs_dev_replace_is_ongoing(&fs_info->dev_replace)) {
> - BUG_ON(num_devices < 1);
> + WARN_ON(num_devices < 1);
Isn't dev_replace_is_ongoing && num_devices < 1 indeed a logical bug
situation? Under what condition can it happen that you deem "non
critical" ?
> num_devices--;
> }
> btrfs_dev_replace_read_unlock(&fs_info->dev_replace);
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/3] btrfs: add helper btrfs_num_devices() to deduce num_devices
2018-07-10 18:22 ` [PATCH 2/3] btrfs: add helper btrfs_num_devices() to deduce num_devices Anand Jain
@ 2018-07-12 7:31 ` Nikolay Borisov
2018-07-13 11:17 ` Anand Jain
0 siblings, 1 reply; 13+ messages in thread
From: Nikolay Borisov @ 2018-07-12 7:31 UTC (permalink / raw)
To: Anand Jain, linux-btrfs
On 10.07.2018 21:22, Anand Jain wrote:
> When the replace is running the fs_devices::num_devices also includes
> the replace device, however in some operations like device delete and
> balance it needs the actual num_devices without the repalce devices, so
> now the function btrfs_num_devices() just provides that.
>
> Signed-off-by: Anand Jain <anand.jain@oracle.com>
> ---
> fs/btrfs/volumes.c | 31 +++++++++++++++++--------------
> 1 file changed, 17 insertions(+), 14 deletions(-)
>
> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> index ce6faeb8bcf8..59a6d8f42c98 100644
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -1931,6 +1931,20 @@ void btrfs_assign_next_active_device(struct btrfs_fs_info *fs_info,
> fs_info->fs_devices->latest_bdev = next_device->bdev;
> }
>
Put a comment above the function saying it returns the number of devices
minus the replace device (in case replace is working) otherwise one have
to go and 'git blame' it
> +static inline u64 btrfs_num_devices(struct btrfs_fs_info *fs_info)
> +{
> + u64 num_devices = fs_info->fs_devices->num_devices;
> +
> + btrfs_dev_replace_read_lock(&fs_info->dev_replace);
> + if (btrfs_dev_replace_is_ongoing(&fs_info->dev_replace)) {
> + WARN_ON(num_devices < 1);
> + num_devices--;
> + }
> + btrfs_dev_replace_read_unlock(&fs_info->dev_replace);
> +
> + return num_devices;
> +}
> +
> int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
> u64 devid)
> {
> @@ -1944,13 +1958,7 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
>
> mutex_lock(&uuid_mutex);
>
> - num_devices = fs_devices->num_devices;
> - btrfs_dev_replace_read_lock(&fs_info->dev_replace);
> - if (btrfs_dev_replace_is_ongoing(&fs_info->dev_replace)) {
> - WARN_ON(num_devices < 1);
> - num_devices--;
> - }
> - btrfs_dev_replace_read_unlock(&fs_info->dev_replace);
> + num_devices = btrfs_num_devices(fs_info);
>
> ret = btrfs_check_raid_min_devices(fs_info, num_devices - 1);
> if (ret)
> @@ -3810,13 +3818,8 @@ int btrfs_balance(struct btrfs_fs_info *fs_info,
> }
> }
>
> - num_devices = fs_info->fs_devices->num_devices;
> - btrfs_dev_replace_read_lock(&fs_info->dev_replace);
> - if (btrfs_dev_replace_is_ongoing(&fs_info->dev_replace)) {
> - WARN_ON(num_devices < 1);
> - num_devices--;
> - }
> - btrfs_dev_replace_read_unlock(&fs_info->dev_replace);
> + num_devices = btrfs_num_devices(fs_info);
> +
> allowed = BTRFS_AVAIL_ALLOC_BIT_SINGLE | BTRFS_BLOCK_GROUP_DUP;
> if (num_devices > 1)
> allowed |= (BTRFS_BLOCK_GROUP_RAID0 | BTRFS_BLOCK_GROUP_RAID1);
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 3/3] btrfs: add helper function check device delete able
2018-07-10 18:22 ` [PATCH 3/3] btrfs: add helper function check device delete able Anand Jain
@ 2018-07-12 7:43 ` Nikolay Borisov
2018-07-13 11:27 ` Anand Jain
0 siblings, 1 reply; 13+ messages in thread
From: Nikolay Borisov @ 2018-07-12 7:43 UTC (permalink / raw)
To: Anand Jain, linux-btrfs
On 10.07.2018 21:22, Anand Jain wrote:
> Move the section of the code which performs the check if the device is
> indelible, move that into a helper function.
>
> Signed-off-by: Anand Jain <anand.jain@oracle.com>
> ---
> fs/btrfs/volumes.c | 49 ++++++++++++++++++++++++++++++-------------------
> 1 file changed, 30 insertions(+), 19 deletions(-)
>
> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> index 59a6d8f42c98..feb29c5b44f6 100644
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -1945,6 +1945,33 @@ static inline u64 btrfs_num_devices(struct btrfs_fs_info *fs_info)
> return num_devices;
> }
>
> +static struct btrfs_device *btrfs_device_delete_able(
Ugliest name ever! So this function is not really a predicate, rather
it's used to fetch the struct btrfs_device * to delete. So a more
becoming name would be:
btrfs_get_device_for_delete - though this a bit verbose.
I guess btrfs_can_delete_device is more suitable if you want to follow
this predicate style. At the very least, though, the correct form of the
adjective is deletable so it should be btrfs_device_deletable. But as I
said this function is not really used as a predicate.
> + struct btrfs_fs_info *fs_info,
> + const char *device_path, u64 devid)
> +{
> + int ret;
> + struct btrfs_device *device;
> +
> + ret = btrfs_check_raid_min_devices(fs_info,
> + btrfs_num_devices(fs_info) - 1);
> + if (ret)
> + return ERR_PTR(ret);
> +
> + ret = btrfs_find_device_by_devspec(fs_info, devid, device_path,
> + &device);
Not really related to this patchset, but I think the whole
btrfs_find_device_by_devspec -> btrfs_find_device_missing_or_by_path
could be simplified by making those functions return a pointer to
btrfs_device rather than an int error value. That way you eliminate the
ugly "argument as return value" convention.
> + if (ret)
> + return ERR_PTR(ret);
> +
> + if (test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state))
> + return ERR_PTR(BTRFS_ERROR_DEV_TGT_REPLACE);
> +
> + if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state) &&
> + fs_info->fs_devices->rw_devices == 1)
> + return ERR_PTR(BTRFS_ERROR_DEV_ONLY_WRITABLE);
> +
> + return device;
> +}
> +
> int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
> u64 devid)
> {
> @@ -1958,25 +1985,9 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
>
> mutex_lock(&uuid_mutex);
>
> - num_devices = btrfs_num_devices(fs_info);
> -
> - ret = btrfs_check_raid_min_devices(fs_info, num_devices - 1);
> - if (ret)
> - goto out;
> -
> - ret = btrfs_find_device_by_devspec(fs_info, devid, device_path,
> - &device);
> - if (ret)
> - goto out;
> -
> - if (test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state)) {
> - ret = BTRFS_ERROR_DEV_TGT_REPLACE;
> - goto out;
> - }
> -
> - if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state) &&
> - fs_info->fs_devices->rw_devices == 1) {
> - ret = BTRFS_ERROR_DEV_ONLY_WRITABLE;
> + device = btrfs_device_delete_able(fs_info, device_path, devid);
> + if (IS_ERR(device)) {
> + ret = PTR_ERR(device);
> goto out;
> }
>
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/3] btrfs: warn for num_devices below 0
2018-07-12 7:13 ` [PATCH 1/3] btrfs: warn for num_devices below 0 Nikolay Borisov
@ 2018-07-13 11:05 ` Anand Jain
0 siblings, 0 replies; 13+ messages in thread
From: Anand Jain @ 2018-07-13 11:05 UTC (permalink / raw)
To: Nikolay Borisov, linux-btrfs
On 07/12/2018 03:13 PM, Nikolay Borisov wrote:
>
>
> On 10.07.2018 21:22, Anand Jain wrote:
>> In preparation to de-duplicate a section of code where we deduce the
>> num_devices, use warn instead of bug.
>>
>> Signed-off-by: Anand Jain <anand.jain@oracle.com>
>> ---
>> fs/btrfs/volumes.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
>> index eb78bb8d1108..ce6faeb8bcf8 100644
>> --- a/fs/btrfs/volumes.c
>> +++ b/fs/btrfs/volumes.c
>> @@ -3813,7 +3813,7 @@ int btrfs_balance(struct btrfs_fs_info *fs_info,
>> num_devices = fs_info->fs_devices->num_devices;
>> btrfs_dev_replace_read_lock(&fs_info->dev_replace);
>> if (btrfs_dev_replace_is_ongoing(&fs_info->dev_replace)) {
>> - BUG_ON(num_devices < 1);
>> + WARN_ON(num_devices < 1);
> Isn't dev_replace_is_ongoing && num_devices < 1 indeed a logical bug
> situation? Under what condition can it happen that you deem "non
> critical" ?
In all conditions needs least one device for the FS to be mounted.
In fact we can just remove it.
Thanks, Anand
>> num_devices--;
>> }
>> btrfs_dev_replace_read_unlock(&fs_info->dev_replace);
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/3] btrfs: add helper btrfs_num_devices() to deduce num_devices
2018-07-12 7:31 ` Nikolay Borisov
@ 2018-07-13 11:17 ` Anand Jain
2018-07-13 11:17 ` Nikolay Borisov
0 siblings, 1 reply; 13+ messages in thread
From: Anand Jain @ 2018-07-13 11:17 UTC (permalink / raw)
To: Nikolay Borisov, linux-btrfs
On 07/12/2018 03:31 PM, Nikolay Borisov wrote:
>
>
> On 10.07.2018 21:22, Anand Jain wrote:
>> When the replace is running the fs_devices::num_devices also includes
>> the replace device, however in some operations like device delete and
>> balance it needs the actual num_devices without the repalce devices, so
>> now the function btrfs_num_devices() just provides that.
>> Signed-off-by: Anand Jain <anand.jain@oracle.com>
>> ---
>> fs/btrfs/volumes.c | 31 +++++++++++++++++--------------
>> 1 file changed, 17 insertions(+), 14 deletions(-)
>>
>> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
>> index ce6faeb8bcf8..59a6d8f42c98 100644
>> --- a/fs/btrfs/volumes.c
>> +++ b/fs/btrfs/volumes.c
>> @@ -1931,6 +1931,20 @@ void btrfs_assign_next_active_device(struct btrfs_fs_info *fs_info,
>> fs_info->fs_devices->latest_bdev = next_device->bdev;
>> }
>>
>
> Put a comment above the function saying it returns the number of devices
> minus the replace device (in case replace is working) otherwise one have
> to go and 'git blame' it
good idea will rename it to btrfs_num_devices_minus_replace(), (will
wait to see if there is any better suggested).
Thanks, Anand
>> +static inline u64 btrfs_num_devices(struct btrfs_fs_info *fs_info)
>> +{
>> + u64 num_devices = fs_info->fs_devices->num_devices;
>> +
>> + btrfs_dev_replace_read_lock(&fs_info->dev_replace);
>> + if (btrfs_dev_replace_is_ongoing(&fs_info->dev_replace)) {
>> + WARN_ON(num_devices < 1);
>> + num_devices--;
>> + }
>> + btrfs_dev_replace_read_unlock(&fs_info->dev_replace);
>> +
>> + return num_devices;
>> +}
>> +
>> int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
>> u64 devid)
>> {
>> @@ -1944,13 +1958,7 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
>>
>> mutex_lock(&uuid_mutex);
>>
>> - num_devices = fs_devices->num_devices;
>> - btrfs_dev_replace_read_lock(&fs_info->dev_replace);
>> - if (btrfs_dev_replace_is_ongoing(&fs_info->dev_replace)) {
>> - WARN_ON(num_devices < 1);
>> - num_devices--;
>> - }
>> - btrfs_dev_replace_read_unlock(&fs_info->dev_replace);
>> + num_devices = btrfs_num_devices(fs_info);
>>
>> ret = btrfs_check_raid_min_devices(fs_info, num_devices - 1);
>> if (ret)
>> @@ -3810,13 +3818,8 @@ int btrfs_balance(struct btrfs_fs_info *fs_info,
>> }
>> }
>>
>> - num_devices = fs_info->fs_devices->num_devices;
>> - btrfs_dev_replace_read_lock(&fs_info->dev_replace);
>> - if (btrfs_dev_replace_is_ongoing(&fs_info->dev_replace)) {
>> - WARN_ON(num_devices < 1);
>> - num_devices--;
>> - }
>> - btrfs_dev_replace_read_unlock(&fs_info->dev_replace);
>> + num_devices = btrfs_num_devices(fs_info);
>> +
>> allowed = BTRFS_AVAIL_ALLOC_BIT_SINGLE | BTRFS_BLOCK_GROUP_DUP;
>> if (num_devices > 1)
>> allowed |= (BTRFS_BLOCK_GROUP_RAID0 | BTRFS_BLOCK_GROUP_RAID1);
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/3] btrfs: add helper btrfs_num_devices() to deduce num_devices
2018-07-13 11:17 ` Anand Jain
@ 2018-07-13 11:17 ` Nikolay Borisov
2018-07-16 5:17 ` Anand Jain
0 siblings, 1 reply; 13+ messages in thread
From: Nikolay Borisov @ 2018-07-13 11:17 UTC (permalink / raw)
To: Anand Jain, linux-btrfs
On 13.07.2018 14:17, Anand Jain wrote:
>
>
> On 07/12/2018 03:31 PM, Nikolay Borisov wrote:
>>
>>
>> On 10.07.2018 21:22, Anand Jain wrote:
>>> When the replace is running the fs_devices::num_devices also includes
>>> the replace device, however in some operations like device delete and
>>> balance it needs the actual num_devices without the repalce devices, so
>>> now the function btrfs_num_devices() just provides that.
>
>>> Signed-off-by: Anand Jain <anand.jain@oracle.com>
>>> ---
>>> fs/btrfs/volumes.c | 31 +++++++++++++++++--------------
>>> 1 file changed, 17 insertions(+), 14 deletions(-)
>>>
>>> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
>>> index ce6faeb8bcf8..59a6d8f42c98 100644
>>> --- a/fs/btrfs/volumes.c
>>> +++ b/fs/btrfs/volumes.c
>>> @@ -1931,6 +1931,20 @@ void btrfs_assign_next_active_device(struct
>>> btrfs_fs_info *fs_info,
>>> fs_info->fs_devices->latest_bdev = next_device->bdev;
>>> }
>>>
>>
>> Put a comment above the function saying it returns the number of devices
>> minus the replace device (in case replace is working) otherwise one have
>> to go and 'git blame' it
>
> good idea will rename it to btrfs_num_devices_minus_replace(), (will
> wait to see if there is any better suggested).
Unfortunately I don't have a better name yet but
num_devices_minus_replace is way too verbose so don't use that...
>
> Thanks, Anand
>
>
>
>>> +static inline u64 btrfs_num_devices(struct btrfs_fs_info *fs_info)
>>> +{
>>> + u64 num_devices = fs_info->fs_devices->num_devices;
>>> +
>>> + btrfs_dev_replace_read_lock(&fs_info->dev_replace);
>>> + if (btrfs_dev_replace_is_ongoing(&fs_info->dev_replace)) {
>>> + WARN_ON(num_devices < 1);
>>> + num_devices--;
>>> + }
>>> + btrfs_dev_replace_read_unlock(&fs_info->dev_replace);
>>> +
>>> + return num_devices;
>>> +}
>>> +
>>> int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char
>>> *device_path,
>>> u64 devid)
>>> {
>>> @@ -1944,13 +1958,7 @@ int btrfs_rm_device(struct btrfs_fs_info
>>> *fs_info, const char *device_path,
>>> mutex_lock(&uuid_mutex);
>>> - num_devices = fs_devices->num_devices;
>>> - btrfs_dev_replace_read_lock(&fs_info->dev_replace);
>>> - if (btrfs_dev_replace_is_ongoing(&fs_info->dev_replace)) {
>>> - WARN_ON(num_devices < 1);
>>> - num_devices--;
>>> - }
>>> - btrfs_dev_replace_read_unlock(&fs_info->dev_replace);
>>> + num_devices = btrfs_num_devices(fs_info);
>>> ret = btrfs_check_raid_min_devices(fs_info, num_devices - 1);
>>> if (ret)
>>> @@ -3810,13 +3818,8 @@ int btrfs_balance(struct btrfs_fs_info *fs_info,
>>> }
>>> }
>>> - num_devices = fs_info->fs_devices->num_devices;
>>> - btrfs_dev_replace_read_lock(&fs_info->dev_replace);
>>> - if (btrfs_dev_replace_is_ongoing(&fs_info->dev_replace)) {
>>> - WARN_ON(num_devices < 1);
>>> - num_devices--;
>>> - }
>>> - btrfs_dev_replace_read_unlock(&fs_info->dev_replace);
>>> + num_devices = btrfs_num_devices(fs_info);
>>> +
>>> allowed = BTRFS_AVAIL_ALLOC_BIT_SINGLE | BTRFS_BLOCK_GROUP_DUP;
>>> if (num_devices > 1)
>>> allowed |= (BTRFS_BLOCK_GROUP_RAID0 |
>>> BTRFS_BLOCK_GROUP_RAID1);
>>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 3/3] btrfs: add helper function check device delete able
2018-07-12 7:43 ` Nikolay Borisov
@ 2018-07-13 11:27 ` Anand Jain
2018-07-13 11:28 ` Nikolay Borisov
0 siblings, 1 reply; 13+ messages in thread
From: Anand Jain @ 2018-07-13 11:27 UTC (permalink / raw)
To: Nikolay Borisov, linux-btrfs
On 07/12/2018 03:43 PM, Nikolay Borisov wrote:
>
>
> On 10.07.2018 21:22, Anand Jain wrote:
>> Move the section of the code which performs the check if the device is
>> indelible, move that into a helper function.
>>
>> Signed-off-by: Anand Jain <anand.jain@oracle.com>
>> ---
>> fs/btrfs/volumes.c | 49 ++++++++++++++++++++++++++++++-------------------
>> 1 file changed, 30 insertions(+), 19 deletions(-)
>>
>> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
>> index 59a6d8f42c98..feb29c5b44f6 100644
>> --- a/fs/btrfs/volumes.c
>> +++ b/fs/btrfs/volumes.c
>> @@ -1945,6 +1945,33 @@ static inline u64 btrfs_num_devices(struct btrfs_fs_info *fs_info)
>> return num_devices;
>> }
>>
>> +static struct btrfs_device *btrfs_device_delete_able(
>
> Ugliest name ever! So this function is not really a predicate, rather
> it's used to fetch the struct btrfs_device * to delete. So a more
> becoming name would be:
>
> btrfs_get_device_for_delete - though this a bit verbose.
>
> I guess btrfs_can_delete_device is more suitable if you want to follow
> this predicate style. At the very least, though, the correct form of the
> adjective is deletable so it should be btrfs_device_deletable. But as I
> said this function is not really used as a predicate.
Its a predicate, return of the device pointer is just a by-product.
Will use btrfs_device_deletable().
>> + struct btrfs_fs_info *fs_info,
>> + const char *device_path, u64 devid)
>> +{
>> + int ret;
>> + struct btrfs_device *device;
>> +
>> + ret = btrfs_check_raid_min_devices(fs_info,
>> + btrfs_num_devices(fs_info) - 1);
>> + if (ret)
>> + return ERR_PTR(ret);
>> +
>> + ret = btrfs_find_device_by_devspec(fs_info, devid, device_path,
>> + &device);
>
> Not really related to this patchset, but I think the whole
> btrfs_find_device_by_devspec -> btrfs_find_device_missing_or_by_path
> could be simplified by making those functions return a pointer to
> btrfs_device rather than an int error value. That way you eliminate the
> ugly "argument as return value" convention.
I agree with you. This is just a fist set of cleanup.
Thanks, Anand
>> + if (ret)
>> + return ERR_PTR(ret);
>> +
>> + if (test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state))
>> + return ERR_PTR(BTRFS_ERROR_DEV_TGT_REPLACE);
>> +
>> + if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state) &&
>> + fs_info->fs_devices->rw_devices == 1)
>> + return ERR_PTR(BTRFS_ERROR_DEV_ONLY_WRITABLE);
>> +
>> + return device;
>> +}
>> +
>> int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
>> u64 devid)
>> {
>> @@ -1958,25 +1985,9 @@ int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char *device_path,
>>
>> mutex_lock(&uuid_mutex);
>>
>> - num_devices = btrfs_num_devices(fs_info);
>> -
>> - ret = btrfs_check_raid_min_devices(fs_info, num_devices - 1);
>> - if (ret)
>> - goto out;
>> -
>> - ret = btrfs_find_device_by_devspec(fs_info, devid, device_path,
>> - &device);
>> - if (ret)
>> - goto out;
>> -
>> - if (test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state)) {
>> - ret = BTRFS_ERROR_DEV_TGT_REPLACE;
>> - goto out;
>> - }
>> -
>> - if (test_bit(BTRFS_DEV_STATE_WRITEABLE, &device->dev_state) &&
>> - fs_info->fs_devices->rw_devices == 1) {
>> - ret = BTRFS_ERROR_DEV_ONLY_WRITABLE;
>> + device = btrfs_device_delete_able(fs_info, device_path, devid);
>> + if (IS_ERR(device)) {
>> + ret = PTR_ERR(device);
>> goto out;
>> }
>>
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 3/3] btrfs: add helper function check device delete able
2018-07-13 11:27 ` Anand Jain
@ 2018-07-13 11:28 ` Nikolay Borisov
2018-07-16 5:14 ` Anand Jain
0 siblings, 1 reply; 13+ messages in thread
From: Nikolay Borisov @ 2018-07-13 11:28 UTC (permalink / raw)
To: Anand Jain, linux-btrfs
On 13.07.2018 14:27, Anand Jain wrote:
>
>
> On 07/12/2018 03:43 PM, Nikolay Borisov wrote:
>>
>>
>> On 10.07.2018 21:22, Anand Jain wrote:
>>> Move the section of the code which performs the check if the device is
>>> indelible, move that into a helper function.
>>>
>>> Signed-off-by: Anand Jain <anand.jain@oracle.com>
>>> ---
>>> fs/btrfs/volumes.c | 49
>>> ++++++++++++++++++++++++++++++-------------------
>>> 1 file changed, 30 insertions(+), 19 deletions(-)
>>>
>>> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
>>> index 59a6d8f42c98..feb29c5b44f6 100644
>>> --- a/fs/btrfs/volumes.c
>>> +++ b/fs/btrfs/volumes.c
>>> @@ -1945,6 +1945,33 @@ static inline u64 btrfs_num_devices(struct
>>> btrfs_fs_info *fs_info)
>>> return num_devices;
>>> }
>>> +static struct btrfs_device *btrfs_device_delete_able(
>>
>> Ugliest name ever! So this function is not really a predicate, rather
>> it's used to fetch the struct btrfs_device * to delete. So a more
>> becoming name would be:
>>
>> btrfs_get_device_for_delete - though this a bit verbose.
>>
>> I guess btrfs_can_delete_device is more suitable if you want to follow
>> this predicate style. At the very least, though, the correct form of the
>> adjective is deletable so it should be btrfs_device_deletable. But as I
>> said this function is not really used as a predicate.
>
> Its a predicate, return of the device pointer is just a by-product.
> Will use btrfs_device_deletable().
Then it's fundamentally wrong, a predicate should really return true or
false. This function actually tries to acquire a device which will only
happen if it meets certain criterion, so I'm inclined to say it's not
really a predicate but rather tries to acquire a reference to a device
which meets certain criteria.
<snip>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 3/3] btrfs: add helper function check device delete able
2018-07-13 11:28 ` Nikolay Borisov
@ 2018-07-16 5:14 ` Anand Jain
0 siblings, 0 replies; 13+ messages in thread
From: Anand Jain @ 2018-07-16 5:14 UTC (permalink / raw)
To: Nikolay Borisov, linux-btrfs
On 07/13/2018 07:28 PM, Nikolay Borisov wrote:
>
>
> On 13.07.2018 14:27, Anand Jain wrote:
>>
>>
>> On 07/12/2018 03:43 PM, Nikolay Borisov wrote:
>>>
>>>
>>> On 10.07.2018 21:22, Anand Jain wrote:
>>>> Move the section of the code which performs the check if the device is
>>>> indelible, move that into a helper function.
>>>>
>>>> Signed-off-by: Anand Jain <anand.jain@oracle.com>
>>>> ---
>>>> fs/btrfs/volumes.c | 49
>>>> ++++++++++++++++++++++++++++++-------------------
>>>> 1 file changed, 30 insertions(+), 19 deletions(-)
>>>>
>>>> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
>>>> index 59a6d8f42c98..feb29c5b44f6 100644
>>>> --- a/fs/btrfs/volumes.c
>>>> +++ b/fs/btrfs/volumes.c
>>>> @@ -1945,6 +1945,33 @@ static inline u64 btrfs_num_devices(struct
>>>> btrfs_fs_info *fs_info)
>>>> return num_devices;
>>>> }
>>>> +static struct btrfs_device *btrfs_device_delete_able(
>>>
>>> Ugliest name ever! So this function is not really a predicate, rather
>>> it's used to fetch the struct btrfs_device * to delete. So a more
>>> becoming name would be:
>>>
>>> btrfs_get_device_for_delete - though this a bit verbose.
>>>
>>> I guess btrfs_can_delete_device is more suitable if you want to follow
>>> this predicate style. At the very least, though, the correct form of the
>>> adjective is deletable so it should be btrfs_device_deletable. But as I
>>> said this function is not really used as a predicate.
>>
>> Its a predicate, return of the device pointer is just a by-product.
>> Will use btrfs_device_deletable().
> Then it's fundamentally wrong, a predicate should really return true or
> false. This function actually tries to acquire a device which will only
> happen if it meets certain criterion, so I'm inclined to say it's not
> really a predicate but rather tries to acquire a reference to a device
> which meets certain criteria.
Ok. Will rename it, so that it won't look like predicate. However as
btrfs_device.. should come fist based on the other functions, will
use, btrfs_device_get_for_delete()
Thanks, Anand
>
> <snip>
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 2/3] btrfs: add helper btrfs_num_devices() to deduce num_devices
2018-07-13 11:17 ` Nikolay Borisov
@ 2018-07-16 5:17 ` Anand Jain
0 siblings, 0 replies; 13+ messages in thread
From: Anand Jain @ 2018-07-16 5:17 UTC (permalink / raw)
To: Nikolay Borisov, linux-btrfs
On 07/13/2018 07:17 PM, Nikolay Borisov wrote:
>
>
> On 13.07.2018 14:17, Anand Jain wrote:
>>
>>
>> On 07/12/2018 03:31 PM, Nikolay Borisov wrote:
>>>
>>>
>>> On 10.07.2018 21:22, Anand Jain wrote:
>>>> When the replace is running the fs_devices::num_devices also includes
>>>> the replace device, however in some operations like device delete and
>>>> balance it needs the actual num_devices without the repalce devices, so
>>>> now the function btrfs_num_devices() just provides that.
>>
>>>> Signed-off-by: Anand Jain <anand.jain@oracle.com>
>>>> ---
>>>> fs/btrfs/volumes.c | 31 +++++++++++++++++--------------
>>>> 1 file changed, 17 insertions(+), 14 deletions(-)
>>>>
>>>> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
>>>> index ce6faeb8bcf8..59a6d8f42c98 100644
>>>> --- a/fs/btrfs/volumes.c
>>>> +++ b/fs/btrfs/volumes.c
>>>> @@ -1931,6 +1931,20 @@ void btrfs_assign_next_active_device(struct
>>>> btrfs_fs_info *fs_info,
>>>> fs_info->fs_devices->latest_bdev = next_device->bdev;
>>>> }
>>>>
>>>
>>> Put a comment above the function saying it returns the number of devices
>>> minus the replace device (in case replace is working) otherwise one have
>>> to go and 'git blame' it
>>
>> good idea will rename it to btrfs_num_devices_minus_replace(), (will
>> wait to see if there is any better suggested).
>
> Unfortunately I don't have a better name yet but
> num_devices_minus_replace is way too verbose so don't use that...
Ok will just add comment. The function name will remain as
btrfs_num_devices()
Thanks, Anand
>>
>> Thanks, Anand
>>
>>
>>
>>>> +static inline u64 btrfs_num_devices(struct btrfs_fs_info *fs_info)
>>>> +{
>>>> + u64 num_devices = fs_info->fs_devices->num_devices;
>>>> +
>>>> + btrfs_dev_replace_read_lock(&fs_info->dev_replace);
>>>> + if (btrfs_dev_replace_is_ongoing(&fs_info->dev_replace)) {
>>>> + WARN_ON(num_devices < 1);
>>>> + num_devices--;
>>>> + }
>>>> + btrfs_dev_replace_read_unlock(&fs_info->dev_replace);
>>>> +
>>>> + return num_devices;
>>>> +}
>>>> +
>>>> int btrfs_rm_device(struct btrfs_fs_info *fs_info, const char
>>>> *device_path,
>>>> u64 devid)
>>>> {
>>>> @@ -1944,13 +1958,7 @@ int btrfs_rm_device(struct btrfs_fs_info
>>>> *fs_info, const char *device_path,
>>>> mutex_lock(&uuid_mutex);
>>>> - num_devices = fs_devices->num_devices;
>>>> - btrfs_dev_replace_read_lock(&fs_info->dev_replace);
>>>> - if (btrfs_dev_replace_is_ongoing(&fs_info->dev_replace)) {
>>>> - WARN_ON(num_devices < 1);
>>>> - num_devices--;
>>>> - }
>>>> - btrfs_dev_replace_read_unlock(&fs_info->dev_replace);
>>>> + num_devices = btrfs_num_devices(fs_info);
>>>> ret = btrfs_check_raid_min_devices(fs_info, num_devices - 1);
>>>> if (ret)
>>>> @@ -3810,13 +3818,8 @@ int btrfs_balance(struct btrfs_fs_info *fs_info,
>>>> }
>>>> }
>>>> - num_devices = fs_info->fs_devices->num_devices;
>>>> - btrfs_dev_replace_read_lock(&fs_info->dev_replace);
>>>> - if (btrfs_dev_replace_is_ongoing(&fs_info->dev_replace)) {
>>>> - WARN_ON(num_devices < 1);
>>>> - num_devices--;
>>>> - }
>>>> - btrfs_dev_replace_read_unlock(&fs_info->dev_replace);
>>>> + num_devices = btrfs_num_devices(fs_info);
>>>> +
>>>> allowed = BTRFS_AVAIL_ALLOC_BIT_SINGLE | BTRFS_BLOCK_GROUP_DUP;
>>>> if (num_devices > 1)
>>>> allowed |= (BTRFS_BLOCK_GROUP_RAID0 |
>>>> BTRFS_BLOCK_GROUP_RAID1);
>>>>
>>> --
>>> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
>>> the body of a message to majordomo@vger.kernel.org
>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>>
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2018-07-16 5:39 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-07-10 18:22 [PATCH 1/3] btrfs: warn for num_devices below 0 Anand Jain
2018-07-10 18:22 ` [PATCH 2/3] btrfs: add helper btrfs_num_devices() to deduce num_devices Anand Jain
2018-07-12 7:31 ` Nikolay Borisov
2018-07-13 11:17 ` Anand Jain
2018-07-13 11:17 ` Nikolay Borisov
2018-07-16 5:17 ` Anand Jain
2018-07-10 18:22 ` [PATCH 3/3] btrfs: add helper function check device delete able Anand Jain
2018-07-12 7:43 ` Nikolay Borisov
2018-07-13 11:27 ` Anand Jain
2018-07-13 11:28 ` Nikolay Borisov
2018-07-16 5:14 ` Anand Jain
2018-07-12 7:13 ` [PATCH 1/3] btrfs: warn for num_devices below 0 Nikolay Borisov
2018-07-13 11:05 ` Anand Jain
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).