diff mbox series

btrfs: improve messages when devices rescanned

Message ID 77fc0b0c7c88b14c734b646d1969ccf45a063146.1599118052.git.anand.jain@oracle.com (mailing list archive)
State New, archived
Headers show
Series btrfs: improve messages when devices rescanned | expand

Commit Message

Anand Jain Sept. 3, 2020, 7:27 a.m. UTC
Systems booting without the initramfs seems to scan an unusual kind
of device path. And at a later time, the device is updated to the
correct path. We generally print the process name and PID of the process
scanning the device but we don't capture the same information if the
device path is rescanned with a different pathname.

But the current message is too long, so drop the unwanted words and add
process name and PID.

While at this also update the duplicate device warning to include the
process name and PID.

Reported-by: https://bugzilla.kernel.org/show_bug.cgi?id=89721
Signed-off-by: Anand Jain <anand.jain@oracle.com>
---
 fs/btrfs/volumes.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

Comments

Nikolay Borisov Sept. 3, 2020, 8:16 a.m. UTC | #1
On 3.09.20 г. 10:27 ч., Anand Jain wrote:
> Systems booting without the initramfs seems to scan an unusual kind
> of device path. And at a later time, the device is updated to the
> correct path. We generally print the process name and PID of the process
> scanning the device but we don't capture the same information if the
> device path is rescanned with a different pathname.
> 
> But the current message is too long, so drop the unwanted words and add
> process name and PID.
> 
> While at this also update the duplicate device warning to include the
> process name and PID.
> 
> Reported-by: https://bugzilla.kernel.org/show_bug.cgi?id=89721
> Signed-off-by: Anand Jain <anand.jain@oracle.com>
> ---
>  fs/btrfs/volumes.c | 14 ++++++++------
>  1 file changed, 8 insertions(+), 6 deletions(-)
> 
> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> index dc81646b13c0..c386ad722ae1 100644
> --- a/fs/btrfs/volumes.c
> +++ b/fs/btrfs/volumes.c
> @@ -942,16 +942,18 @@ static noinline struct btrfs_device *device_list_add(const char *path,
>  				bdput(path_bdev);
>  				mutex_unlock(&fs_devices->device_list_mutex);
>  				btrfs_warn_in_rcu(device->fs_info,
> -			"duplicate device fsid:devid for %pU:%llu old:%s new:%s",
> -					disk_super->fsid, devid,
> -					rcu_str_deref(device->name), path);
> +	"duplicate device %s devid %llu generation %llu scanned by %s (%d)",
> +						  path, devid, found_transid,
> +						  current->comm,
> +						  task_pid_nr(current));
>  				return ERR_PTR(-EEXIST);
>  			}
>  			bdput(path_bdev);
>  			btrfs_info_in_rcu(device->fs_info,
> -				"device fsid %pU devid %llu moved old:%s new:%s",
> -				disk_super->fsid, devid,
> -				rcu_str_deref(device->name), path);
> +				"device path %s changed to %s by %s (pid %d)",
> +					  rcu_str_deref(device->name),
> +					  path, current->comm,
> +					  task_pid_nr(current));

This 2nd messages is misleading, it's not the process calling
device_list_add which have changed the path per-se but rather it sees
the changed path. It's not possible to know why it changed in this
context. The idea here is "

"Process %pid saw different dev path %new_dev_path for dev %old_path"

>  		}
>  
>  		name = rcu_string_strdup(path, GFP_NOFS);
>
Anand Jain Sept. 3, 2020, 9:41 a.m. UTC | #2
On 3/9/20 4:16 pm, Nikolay Borisov wrote:
> 
> 
> On 3.09.20 г. 10:27 ч., Anand Jain wrote:
>> Systems booting without the initramfs seems to scan an unusual kind
>> of device path. And at a later time, the device is updated to the
>> correct path. We generally print the process name and PID of the process
>> scanning the device but we don't capture the same information if the
>> device path is rescanned with a different pathname.
>>
>> But the current message is too long, so drop the unwanted words and add
>> process name and PID.
>>
>> While at this also update the duplicate device warning to include the
>> process name and PID.
>>
>> Reported-by: https://bugzilla.kernel.org/show_bug.cgi?id=89721
>> Signed-off-by: Anand Jain <anand.jain@oracle.com>
>> ---
>>   fs/btrfs/volumes.c | 14 ++++++++------
>>   1 file changed, 8 insertions(+), 6 deletions(-)
>>
>> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
>> index dc81646b13c0..c386ad722ae1 100644
>> --- a/fs/btrfs/volumes.c
>> +++ b/fs/btrfs/volumes.c
>> @@ -942,16 +942,18 @@ static noinline struct btrfs_device *device_list_add(const char *path,
>>   				bdput(path_bdev);
>>   				mutex_unlock(&fs_devices->device_list_mutex);
>>   				btrfs_warn_in_rcu(device->fs_info,
>> -			"duplicate device fsid:devid for %pU:%llu old:%s new:%s",
>> -					disk_super->fsid, devid,
>> -					rcu_str_deref(device->name), path);
>> +	"duplicate device %s devid %llu generation %llu scanned by %s (%d)",
>> +						  path, devid, found_transid,
>> +						  current->comm,
>> +						  task_pid_nr(current));
>>   				return ERR_PTR(-EEXIST);
>>   			}
>>   			bdput(path_bdev);
>>   			btrfs_info_in_rcu(device->fs_info,
>> -				"device fsid %pU devid %llu moved old:%s new:%s",
>> -				disk_super->fsid, devid,
>> -				rcu_str_deref(device->name), path);
>> +				"device path %s changed to %s by %s (pid %d)",
>> +					  rcu_str_deref(device->name),
>> +					  path, current->comm,
>> +					  task_pid_nr(current));
> 
> This 2nd messages is misleading, it's not the process calling
> device_list_add which have changed the path per-se but rather it sees
> the changed path. It's not possible to know why it changed in this
> context. The idea here is "
> 
> "Process %pid saw different dev path %new_dev_path for dev %old_path"

   Hm. How about we stick to the usual scanned by. That is..

   "device path %s changed to %s scanned by %s (pid %d)",

Thanks, Anand

> 
>>   		}
>>   
>>   		name = rcu_string_strdup(path, GFP_NOFS);
>>
Nikolay Borisov Sept. 3, 2020, 9:42 a.m. UTC | #3
On 3.09.20 г. 12:41 ч., Anand Jain wrote:
> On 3/9/20 4:16 pm, Nikolay Borisov wrote:
>>
>>
>> On 3.09.20 г. 10:27 ч., Anand Jain wrote:
>>> Systems booting without the initramfs seems to scan an unusual kind
>>> of device path. And at a later time, the device is updated to the
>>> correct path. We generally print the process name and PID of the process
>>> scanning the device but we don't capture the same information if the
>>> device path is rescanned with a different pathname.
>>>
>>> But the current message is too long, so drop the unwanted words and add
>>> process name and PID.
>>>
>>> While at this also update the duplicate device warning to include the
>>> process name and PID.
>>>
>>> Reported-by: https://bugzilla.kernel.org/show_bug.cgi?id=89721
>>> Signed-off-by: Anand Jain <anand.jain@oracle.com>
>>> ---
>>>   fs/btrfs/volumes.c | 14 ++++++++------
>>>   1 file changed, 8 insertions(+), 6 deletions(-)
>>>
>>> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
>>> index dc81646b13c0..c386ad722ae1 100644
>>> --- a/fs/btrfs/volumes.c
>>> +++ b/fs/btrfs/volumes.c
>>> @@ -942,16 +942,18 @@ static noinline struct btrfs_device
>>> *device_list_add(const char *path,
>>>                   bdput(path_bdev);
>>>                   mutex_unlock(&fs_devices->device_list_mutex);
>>>                   btrfs_warn_in_rcu(device->fs_info,
>>> -            "duplicate device fsid:devid for %pU:%llu old:%s new:%s",
>>> -                    disk_super->fsid, devid,
>>> -                    rcu_str_deref(device->name), path);
>>> +    "duplicate device %s devid %llu generation %llu scanned by %s
>>> (%d)",
>>> +                          path, devid, found_transid,
>>> +                          current->comm,
>>> +                          task_pid_nr(current));
>>>                   return ERR_PTR(-EEXIST);
>>>               }
>>>               bdput(path_bdev);
>>>               btrfs_info_in_rcu(device->fs_info,
>>> -                "device fsid %pU devid %llu moved old:%s new:%s",
>>> -                disk_super->fsid, devid,
>>> -                rcu_str_deref(device->name), path);
>>> +                "device path %s changed to %s by %s (pid %d)",
>>> +                      rcu_str_deref(device->name),
>>> +                      path, current->comm,
>>> +                      task_pid_nr(current));
>>
>> This 2nd messages is misleading, it's not the process calling
>> device_list_add which have changed the path per-se but rather it sees
>> the changed path. It's not possible to know why it changed in this
>> context. The idea here is "
>>
>> "Process %pid saw different dev path %new_dev_path for dev %old_path"
> 
>   Hm. How about we stick to the usual scanned by. That is..
> 
>   "device path %s changed to %s scanned by %s (pid %d)",

works for me.

> 
> Thanks, Anand
> 
>>
>>>           }
>>>             name = rcu_string_strdup(path, GFP_NOFS);
>>>
>
David Sterba Sept. 3, 2020, 10:10 a.m. UTC | #4
On Thu, Sep 03, 2020 at 12:42:09PM +0300, Nikolay Borisov wrote:
> 
> 
> On 3.09.20 г. 12:41 ч., Anand Jain wrote:
> > On 3/9/20 4:16 pm, Nikolay Borisov wrote:
> >>
> >>
> >> On 3.09.20 г. 10:27 ч., Anand Jain wrote:
> >>> Systems booting without the initramfs seems to scan an unusual kind
> >>> of device path. And at a later time, the device is updated to the
> >>> correct path. We generally print the process name and PID of the process
> >>> scanning the device but we don't capture the same information if the
> >>> device path is rescanned with a different pathname.
> >>>
> >>> But the current message is too long, so drop the unwanted words and add
> >>> process name and PID.
> >>>
> >>> While at this also update the duplicate device warning to include the
> >>> process name and PID.
> >>>
> >>> Reported-by: https://bugzilla.kernel.org/show_bug.cgi?id=89721
> >>> Signed-off-by: Anand Jain <anand.jain@oracle.com>
> >>> ---
> >>>   fs/btrfs/volumes.c | 14 ++++++++------
> >>>   1 file changed, 8 insertions(+), 6 deletions(-)
> >>>
> >>> diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
> >>> index dc81646b13c0..c386ad722ae1 100644
> >>> --- a/fs/btrfs/volumes.c
> >>> +++ b/fs/btrfs/volumes.c
> >>> @@ -942,16 +942,18 @@ static noinline struct btrfs_device
> >>> *device_list_add(const char *path,
> >>>                   bdput(path_bdev);
> >>>                   mutex_unlock(&fs_devices->device_list_mutex);
> >>>                   btrfs_warn_in_rcu(device->fs_info,
> >>> -            "duplicate device fsid:devid for %pU:%llu old:%s new:%s",
> >>> -                    disk_super->fsid, devid,
> >>> -                    rcu_str_deref(device->name), path);
> >>> +    "duplicate device %s devid %llu generation %llu scanned by %s
> >>> (%d)",
> >>> +                          path, devid, found_transid,
> >>> +                          current->comm,
> >>> +                          task_pid_nr(current));
> >>>                   return ERR_PTR(-EEXIST);
> >>>               }
> >>>               bdput(path_bdev);
> >>>               btrfs_info_in_rcu(device->fs_info,
> >>> -                "device fsid %pU devid %llu moved old:%s new:%s",
> >>> -                disk_super->fsid, devid,
> >>> -                rcu_str_deref(device->name), path);
> >>> +                "device path %s changed to %s by %s (pid %d)",
> >>> +                      rcu_str_deref(device->name),
> >>> +                      path, current->comm,
> >>> +                      task_pid_nr(current));
> >>
> >> This 2nd messages is misleading, it's not the process calling
> >> device_list_add which have changed the path per-se but rather it sees
> >> the changed path. It's not possible to know why it changed in this
> >> context. The idea here is "
> >>
> >> "Process %pid saw different dev path %new_dev_path for dev %old_path"
> > 
> >   Hm. How about we stick to the usual scanned by. That is..
> > 
> >   "device path %s changed to %s scanned by %s (pid %d)",
> 
> works for me.

The device id should still be there, the filesystem is referred to by
the device name as printed by btrfs_info* so its uuid can be dropped
from the message itself.
diff mbox series

Patch

diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index dc81646b13c0..c386ad722ae1 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -942,16 +942,18 @@  static noinline struct btrfs_device *device_list_add(const char *path,
 				bdput(path_bdev);
 				mutex_unlock(&fs_devices->device_list_mutex);
 				btrfs_warn_in_rcu(device->fs_info,
-			"duplicate device fsid:devid for %pU:%llu old:%s new:%s",
-					disk_super->fsid, devid,
-					rcu_str_deref(device->name), path);
+	"duplicate device %s devid %llu generation %llu scanned by %s (%d)",
+						  path, devid, found_transid,
+						  current->comm,
+						  task_pid_nr(current));
 				return ERR_PTR(-EEXIST);
 			}
 			bdput(path_bdev);
 			btrfs_info_in_rcu(device->fs_info,
-				"device fsid %pU devid %llu moved old:%s new:%s",
-				disk_super->fsid, devid,
-				rcu_str_deref(device->name), path);
+				"device path %s changed to %s by %s (pid %d)",
+					  rcu_str_deref(device->name),
+					  path, current->comm,
+					  task_pid_nr(current));
 		}
 
 		name = rcu_string_strdup(path, GFP_NOFS);