diff mbox

[3/4] btrfs: dev replace should replace the sysfs entry

Message ID 1401096626-13210-4-git-send-email-anand.jain@oracle.com (mailing list archive)
State Superseded
Headers show

Commit Message

Anand Jain May 26, 2014, 9:30 a.m. UTC
when we replace the device its corresponding sysfs
entry has to be replaced as well

Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
 fs/btrfs/dev-replace.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

Comments

David Sterba May 29, 2014, 1:29 p.m. UTC | #1
On Mon, May 26, 2014 at 05:30:25PM +0800, Anand Jain wrote:
> when we replace the device its corresponding sysfs
> entry has to be replaced as well
> 
> Signed-off-by: Anand Jain <anand.jain@oracle.com>
> ---
>  fs/btrfs/dev-replace.c |    5 +++++
>  1 files changed, 5 insertions(+), 0 deletions(-)
> 
> diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c
> index 9f22905..f4f8728 100644
> --- a/fs/btrfs/dev-replace.c
> +++ b/fs/btrfs/dev-replace.c
> @@ -36,6 +36,7 @@
>  #include "check-integrity.h"
>  #include "rcu-string.h"
>  #include "dev-replace.h"
> +#include "sysfs.h"
>  
>  static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info,
>  				       int scrub_ret);
> @@ -562,6 +563,10 @@ static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info,
>  		fs_info->fs_devices->latest_bdev = tgt_device->bdev;
>  	list_add(&tgt_device->dev_alloc_list, &fs_info->fs_devices->alloc_list);
>  
> +	/* replace the sysfs entry */
> +	rm_device_membership(fs_info, src_device);
> +	add_device_membership(fs_info, tgt_device);
> +
>  	btrfs_rm_dev_replace_blocked(fs_info);
>  
>  	btrfs_rm_dev_replace_srcdev(fs_info, src_device);

569         btrfs_rm_dev_replace_unblocked(fs_info);
570

The comment that follows says

571         /*
572          * this is again a consistent state where no dev_replace procedure
573          * is running, the target device is part of the filesystem, the
574          * source device is not part of the filesystem anymore and its 1st
575          * superblock is scratched out so that it is no longer marked to
576          * belong to this filesystem.
577          */

and I think this is the right place to put the sysfs updates, because the
srcdev is processed.
--
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
Anand Jain May 30, 2014, 7:40 a.m. UTC | #2
On 29/05/14 21:29, David Sterba wrote:
> On Mon, May 26, 2014 at 05:30:25PM +0800, Anand Jain wrote:
>> when we replace the device its corresponding sysfs
>> entry has to be replaced as well
>>
>> Signed-off-by: Anand Jain <anand.jain@oracle.com>
>> ---
>>   fs/btrfs/dev-replace.c |    5 +++++
>>   1 files changed, 5 insertions(+), 0 deletions(-)
>>
>> diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c
>> index 9f22905..f4f8728 100644
>> --- a/fs/btrfs/dev-replace.c
>> +++ b/fs/btrfs/dev-replace.c
>> @@ -36,6 +36,7 @@
>>   #include "check-integrity.h"
>>   #include "rcu-string.h"
>>   #include "dev-replace.h"
>> +#include "sysfs.h"
>>
>>   static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info,
>>   				       int scrub_ret);
>> @@ -562,6 +563,10 @@ static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info,
>>   		fs_info->fs_devices->latest_bdev = tgt_device->bdev;
>>   	list_add(&tgt_device->dev_alloc_list, &fs_info->fs_devices->alloc_list);
>>
>> +	/* replace the sysfs entry */
>> +	rm_device_membership(fs_info, src_device);
>> +	add_device_membership(fs_info, tgt_device);
>> +
>>   	btrfs_rm_dev_replace_blocked(fs_info);
>>
>>   	btrfs_rm_dev_replace_srcdev(fs_info, src_device);
>
> 569         btrfs_rm_dev_replace_unblocked(fs_info);
> 570
>
> The comment that follows says
>
> 571         /*
> 572          * this is again a consistent state where no dev_replace procedure
> 573          * is running, the target device is part of the filesystem, the
> 574          * source device is not part of the filesystem anymore and its 1st
> 575          * superblock is scratched out so that it is no longer marked to
> 576          * belong to this filesystem.
> 577          */
>
> and I think this is the right place to put the sysfs updates, because the
> srcdev is processed.

Looking into this, will update. Thanks for the review.


> --
> 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
Anand Jain June 3, 2014, 3:47 a.m. UTC | #3
inline below.


On 30/05/2014 15:40, Anand Jain wrote:
>
>
>
> On 29/05/14 21:29, David Sterba wrote:
>> On Mon, May 26, 2014 at 05:30:25PM +0800, Anand Jain wrote:
>>> when we replace the device its corresponding sysfs
>>> entry has to be replaced as well
>>>
>>> Signed-off-by: Anand Jain <anand.jain@oracle.com>
>>> ---
>>>   fs/btrfs/dev-replace.c |    5 +++++
>>>   1 files changed, 5 insertions(+), 0 deletions(-)
>>>
>>> diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c
>>> index 9f22905..f4f8728 100644
>>> --- a/fs/btrfs/dev-replace.c
>>> +++ b/fs/btrfs/dev-replace.c
>>> @@ -36,6 +36,7 @@
>>>   #include "check-integrity.h"
>>>   #include "rcu-string.h"
>>>   #include "dev-replace.h"
>>> +#include "sysfs.h"
>>>
>>>   static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info,
>>>                          int scrub_ret);
>>> @@ -562,6 +563,10 @@ static int btrfs_dev_replace_finishing(struct
>>> btrfs_fs_info *fs_info,
>>>           fs_info->fs_devices->latest_bdev = tgt_device->bdev;
>>>       list_add(&tgt_device->dev_alloc_list,
>>> &fs_info->fs_devices->alloc_list);
>>>
>>> +    /* replace the sysfs entry */
>>> +    rm_device_membership(fs_info, src_device);
>>> +    add_device_membership(fs_info, tgt_device);
>>> +
>>>       btrfs_rm_dev_replace_blocked(fs_info);
>>>
>>>       btrfs_rm_dev_replace_srcdev(fs_info, src_device);
>>
>> 569         btrfs_rm_dev_replace_unblocked(fs_info);
>> 570
>>
>> The comment that follows says
>>
>> 571         /*
>> 572          * this is again a consistent state where no dev_replace
>> procedure
>> 573          * is running, the target device is part of the
>> filesystem, the
>> 574          * source device is not part of the filesystem anymore and
>> its 1st
>> 575          * superblock is scratched out so that it is no longer
>> marked to
>> 576          * belong to this filesystem.
>> 577          */
>>
>> and I think this is the right place to put the sysfs updates, because the
>> srcdev is processed.
>
> Looking into this, will update. Thanks for the review.

  btrfs_rm_dev_replace_srcdev()  would destroy the btrfs_device of
  src_device, and I am removing its sys/fs entry before we destroy
  btrfs_device of src_device. Which is logically correct.

  Further, RFC like 6/6 would depend on the btrfs_device struct,
  so we have to call btrfs_kobj_rm_device() before
  btrfs_rm_dev_replace_srcdev()

  Also I did some extra tests and code walk I don't see any case
  which it would fail by calling btrfs_rm_dev_replace_srcdev()
  before btrfs_rm_dev_replace_srcdev().

  V2 for this patch-set has been sent out.

Thanks, Anand

>
>> --
>> 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
David Sterba June 3, 2014, 1:39 p.m. UTC | #4
On Tue, Jun 03, 2014 at 11:47:42AM +0800, Anand Jain wrote:
> >>>+    /* replace the sysfs entry */
> >>>+    rm_device_membership(fs_info, src_device);
> >>>+    add_device_membership(fs_info, tgt_device);
> >>>+
> >>>      btrfs_rm_dev_replace_blocked(fs_info);
> >>>
> >>>      btrfs_rm_dev_replace_srcdev(fs_info, src_device);
> >>
> >>569         btrfs_rm_dev_replace_unblocked(fs_info);
> >>570
> >>
> >>The comment that follows says
> >>
> >>571         /*
> >>572          * this is again a consistent state where no dev_replace
> >>procedure
> >>573          * is running, the target device is part of the
> >>filesystem, the
> >>574          * source device is not part of the filesystem anymore and
> >>its 1st
> >>575          * superblock is scratched out so that it is no longer
> >>marked to
> >>576          * belong to this filesystem.
> >>577          */
> >>
> >>and I think this is the right place to put the sysfs updates, because the
> >>srcdev is processed.
> >
> >Looking into this, will update. Thanks for the review.
> 
>  btrfs_rm_dev_replace_srcdev()  would destroy the btrfs_device of
>  src_device, and I am removing its sys/fs entry before we destroy
>  btrfs_device of src_device. Which is logically correct.

I agree, my analysis was wrong.
--
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
diff mbox

Patch

diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c
index 9f22905..f4f8728 100644
--- a/fs/btrfs/dev-replace.c
+++ b/fs/btrfs/dev-replace.c
@@ -36,6 +36,7 @@ 
 #include "check-integrity.h"
 #include "rcu-string.h"
 #include "dev-replace.h"
+#include "sysfs.h"
 
 static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info,
 				       int scrub_ret);
@@ -562,6 +563,10 @@  static int btrfs_dev_replace_finishing(struct btrfs_fs_info *fs_info,
 		fs_info->fs_devices->latest_bdev = tgt_device->bdev;
 	list_add(&tgt_device->dev_alloc_list, &fs_info->fs_devices->alloc_list);
 
+	/* replace the sysfs entry */
+	rm_device_membership(fs_info, src_device);
+	add_device_membership(fs_info, tgt_device);
+
 	btrfs_rm_dev_replace_blocked(fs_info);
 
 	btrfs_rm_dev_replace_srcdev(fs_info, src_device);