diff mbox

Btrfs: fix regression of btrfs device replace

Message ID 1406632179-17747-1-git-send-email-bo.li.liu@oracle.com (mailing list archive)
State Accepted
Headers show

Commit Message

Liu Bo July 29, 2014, 11:09 a.m. UTC
Commit 49c6f736f34f901117c20960ebd7d5e60f12fcac(
btrfs: dev replace should replace the sysfs entry) added the missing sysfs entry
in the process of device replace, but didn't take missing devices into account,
so now we have

BUG: unable to handle kernel NULL pointer dereference at 0000000000000088
IP: [<ffffffffa0268551>] btrfs_kobj_rm_device+0x21/0x40 [btrfs]
...

To reproduce it,
1. mkfs.btrfs -f disk1 disk2
2. mkfs.ext4 disk1
3. mount disk2 /mnt -odegraded
4. btrfs replace start -B 1 disk3 /mnt
--------------------------

This fixes the problem.

Reported-by: Chris Murphy <lists@colorremedies.com>
Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
---
 fs/btrfs/sysfs.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Chris Murphy Aug. 11, 2014, 9:41 p.m. UTC | #1
On Jul 29, 2014, at 5:09 AM, Liu Bo <bo.li.liu@oracle.com> wrote:

> Commit 49c6f736f34f901117c20960ebd7d5e60f12fcac(
> btrfs: dev replace should replace the sysfs entry) added the missing sysfs entry
> in the process of device replace, but didn't take missing devices into account,
> so now we have
> 
> BUG: unable to handle kernel NULL pointer dereference at 0000000000000088
> IP: [<ffffffffa0268551>] btrfs_kobj_rm_device+0x21/0x40 [btrfs]
> ...
> 
> To reproduce it,
> 1. mkfs.btrfs -f disk1 disk2
> 2. mkfs.ext4 disk1
> 3. mount disk2 /mnt -odegraded
> 4. btrfs replace start -B 1 disk3 /mnt
> --------------------------
> 
> This fixes the problem.
> 
> Reported-by: Chris Murphy <lists@colorremedies.com>
> Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
> ---
> fs/btrfs/sysfs.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c
> index 7869936..12e5355 100644
> --- a/fs/btrfs/sysfs.c
> +++ b/fs/btrfs/sysfs.c
> @@ -614,7 +614,7 @@ int btrfs_kobj_rm_device(struct btrfs_fs_info *fs_info,
> 	if (!fs_info->device_dir_kobj)
> 		return -EINVAL;
> 
> -	if (one_device) {
> +	if (one_device && one_device->bdev) {
> 		disk = one_device->bdev->bd_part;
> 		disk_kobj = &part_to_dev(disk)->kobj;
> 


Applied to 3.16.0 and tested, problem is fixed.


Chris Murphy

--
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
Satoru Takeuchi Aug. 12, 2014, 2:25 a.m. UTC | #2
Hi Liu,

(2014/08/12 6:41), Chris Murphy wrote:
>
> On Jul 29, 2014, at 5:09 AM, Liu Bo <bo.li.liu@oracle.com> wrote:
>
>> Commit 49c6f736f34f901117c20960ebd7d5e60f12fcac(
>> btrfs: dev replace should replace the sysfs entry) added the missing sysfs entry
>> in the process of device replace, but didn't take missing devices into account,
>> so now we have
>>
>> BUG: unable to handle kernel NULL pointer dereference at 0000000000000088
>> IP: [<ffffffffa0268551>] btrfs_kobj_rm_device+0x21/0x40 [btrfs]
>> ...
>>
>> To reproduce it,
>> 1. mkfs.btrfs -f disk1 disk2
>> 2. mkfs.ext4 disk1
>> 3. mount disk2 /mnt -odegraded
>> 4. btrfs replace start -B 1 disk3 /mnt
>> --------------------------
>>
>> This fixes the problem.
>>
>> Reported-by: Chris Murphy <lists@colorremedies.com>
>> Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
>> ---
>> fs/btrfs/sysfs.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c
>> index 7869936..12e5355 100644
>> --- a/fs/btrfs/sysfs.c
>> +++ b/fs/btrfs/sysfs.c
>> @@ -614,7 +614,7 @@ int btrfs_kobj_rm_device(struct btrfs_fs_info *fs_info,
>> 	if (!fs_info->device_dir_kobj)
>> 		return -EINVAL;
>>
>> -	if (one_device) {
>> +	if (one_device && one_device->bdev) {
>> 		disk = one_device->bdev->bd_part;
>> 		disk_kobj = &part_to_dev(disk)->kobj;
>>
>
>
> Applied to 3.16.0 and tested, problem is fixed.
>
>
> Chris Murphy

Reviewed-by: Satoru Takeuchi <takeuchi_satoru@jp.fujitsu.com>
Tested-by: Satoru Takeuchi <takeuchi_satoru@jp.fujitsu.com>

I confirmed both

  - This problem happens with 3.16, and
  - This problem doesn't happen with 3.16 + your patch.

Thanks,
Satoru

>
> --
> 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
Liu Bo Aug. 12, 2014, 3 a.m. UTC | #3
On Tue, Aug 12, 2014 at 11:25:00AM +0900, Satoru Takeuchi wrote:
> Hi Liu,
> 
> (2014/08/12 6:41), Chris Murphy wrote:
> >
> >On Jul 29, 2014, at 5:09 AM, Liu Bo <bo.li.liu@oracle.com> wrote:
> >
> >>Commit 49c6f736f34f901117c20960ebd7d5e60f12fcac(
> >>btrfs: dev replace should replace the sysfs entry) added the missing sysfs entry
> >>in the process of device replace, but didn't take missing devices into account,
> >>so now we have
> >>
> >>BUG: unable to handle kernel NULL pointer dereference at 0000000000000088
> >>IP: [<ffffffffa0268551>] btrfs_kobj_rm_device+0x21/0x40 [btrfs]
> >>...
> >>
> >>To reproduce it,
> >>1. mkfs.btrfs -f disk1 disk2
> >>2. mkfs.ext4 disk1
> >>3. mount disk2 /mnt -odegraded
> >>4. btrfs replace start -B 1 disk3 /mnt
> >>--------------------------
> >>
> >>This fixes the problem.
> >>
> >>Reported-by: Chris Murphy <lists@colorremedies.com>
> >>Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
> >>---
> >>fs/btrfs/sysfs.c | 2 +-
> >>1 file changed, 1 insertion(+), 1 deletion(-)
> >>
> >>diff --git a/fs/btrfs/sysfs.c b/fs/btrfs/sysfs.c
> >>index 7869936..12e5355 100644
> >>--- a/fs/btrfs/sysfs.c
> >>+++ b/fs/btrfs/sysfs.c
> >>@@ -614,7 +614,7 @@ int btrfs_kobj_rm_device(struct btrfs_fs_info *fs_info,
> >>	if (!fs_info->device_dir_kobj)
> >>		return -EINVAL;
> >>
> >>-	if (one_device) {
> >>+	if (one_device && one_device->bdev) {
> >>		disk = one_device->bdev->bd_part;
> >>		disk_kobj = &part_to_dev(disk)->kobj;
> >>
> >
> >
> >Applied to 3.16.0 and tested, problem is fixed.
> >
> >
> >Chris Murphy
> 
> Reviewed-by: Satoru Takeuchi <takeuchi_satoru@jp.fujitsu.com>
> Tested-by: Satoru Takeuchi <takeuchi_satoru@jp.fujitsu.com>
> 
> I confirmed both
> 
>  - This problem happens with 3.16, and
>  - This problem doesn't happen with 3.16 + your patch.

Thanks for your testing!
 
-liubo
--
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/sysfs.c b/fs/btrfs/sysfs.c
index 7869936..12e5355 100644
--- a/fs/btrfs/sysfs.c
+++ b/fs/btrfs/sysfs.c
@@ -614,7 +614,7 @@  int btrfs_kobj_rm_device(struct btrfs_fs_info *fs_info,
 	if (!fs_info->device_dir_kobj)
 		return -EINVAL;
 
-	if (one_device) {
+	if (one_device && one_device->bdev) {
 		disk = one_device->bdev->bd_part;
 		disk_kobj = &part_to_dev(disk)->kobj;