Re: [PATCH 1/2] btrfs-progs: Correctly open filesystem on image file

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 2019/5/16 下午9:45, Nikolay Borisov wrote:
>
>
> On 16.05.19 г. 16:41 ч., Qu Wenruo wrote:
>>
>>
>> On 2019/5/16 下午9:12, Nikolay Borisov wrote:
>>> When btrfs' 'filesystem' subcommand is passed path to an image file it
>>> currently fails since the code expects the image file is going to be
>>> recognised by libblkid (called from btrfs_scan_devices()). This is not
>>> the case since libblkid only scan well-known locations under /dev.
>>>
>>> Fix this by explicitly calling open_ctree which will correctly open
>>> the image and add it to the correct btrfs_fs_devices struct. This allows
>>> subsequent cmd_filesystem_show logic to correctly show requested
>>> information.
>>>
>>> Signed-off-by: Nikolay Borisov <nborisov@xxxxxxxx>
>>> ---
>>>  cmds-filesystem.c | 13 ++++++++++++-
>>>  1 file changed, 12 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/cmds-filesystem.c b/cmds-filesystem.c
>>> index b8beec13f0e5..f55ce9b4ab85 100644
>>> --- a/cmds-filesystem.c
>>> +++ b/cmds-filesystem.c
>>> @@ -771,7 +771,18 @@ static int cmd_filesystem_show(int argc, char **argv)
>>>  		goto out;
>>>
>>>  devs_only:
>>> -	ret = btrfs_scan_devices();
>>> +	if (type == BTRFS_ARG_REG) {
>>> +		/*
>>> +		 * We don't close the fs_info because it will free the device,
>>> +		 * this is not a long-running process so it's fine
>>> +		 */
>>
>> The comment makes sense, but I'm pretty sure we still prefer to clean it up.
>>
>> Just something like:
>>
>> 	struct btrfs_root *root = NULL;
>>
>> 	root = open_ctree();
>> 	if (root)
>> 		ret = 0;
>> 	else
>> 		ret = 1;
>> 	close_ctree(root);
>
> Tested that and it doesn't work, because close_ctree will call
> btrfs_close_devices which frees existing devices so the test fails.

Sorry for the confusion, I missed "..." line before close_ctree(root);

I mean something like:

diff --git a/cmds-filesystem.c b/cmds-filesystem.c
index c4e43f8446dd..d20cbd49c201 100644
--- a/cmds-filesystem.c
+++ b/cmds-filesystem.c
@@ -677,6 +677,7 @@ static int cmd_filesystem_show(int argc, char **argv)
 {
        LIST_HEAD(all_uuids);
        struct btrfs_fs_devices *fs_devices;
+       struct btrfs_root *root = NULL;
        char *search = NULL;
        int ret;
        /* default, search both kernel and udev */
@@ -779,7 +780,8 @@ devs_only:
                 * We don't close the fs_info because it will free the
device,
                 * this is not a long-running process so it's fine
                 */
-               if (open_ctree(search, btrfs_sb_offset(0), 0))
+               root = open_ctree(search, 0, 0);
+               if (root)
                        ret = 0;
                else
                        ret = 1;
@@ -821,6 +823,7 @@ devs_only:
                free_fs_devices(fs_devices);
        }
 out:
+       close_ctree(root);
        free_seen_fsid(seen_fsid_hash);
        return ret;
 }

Thanks,
Qu
>
>>
>> Despite that, I think the patch looks good to me.
>>
>> Thanks,
>> Qu
>>
>>> +		if (open_ctree(search, btrfs_sb_offset(0), 0))
>>> +			ret = 0;
>>> +		else
>>> +			ret = 1;
>>> +	} else {
>>> +		ret = btrfs_scan_devices();
>>> +	}
>>>
>>>  	if (ret) {
>>>  		error("blkid device scan returned %d", ret);
>>>
>>




[Index of Archives]     [Linux Filesystem Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux