From: "黄佳男 via Linux-f2fs-devel" <linux-f2fs-devel@lists.sourceforge.net>
To: Juhyung Park <qkrwngud825@gmail.com>,
"chao@kernel.org" <chao@kernel.org>
Cc: "jaegeuk@kernel.org" <jaegeuk@kernel.org>,
王辉 <wanghui33@xiaomi.com>,
"jnhuang95@gmail.com" <jnhuang95@gmail.com>,
"linux-f2fs-devel@lists.sourceforge.net"
<linux-f2fs-devel@lists.sourceforge.net>
Subject: Re: [f2fs-dev] [External Mail]Re: [PATCH v3] f2fs-tools: fix to check loop device for non-root users
Date: Fri, 1 Mar 2024 10:32:21 +0000 [thread overview]
Message-ID: <9ee3e01b-72c2-4eed-aed7-b005b3173203@xiaomi.com> (raw)
In-Reply-To: <CAD14+f0saGRa401qDWKwFiYgsHUBcqrfxgmXCWcq1Eqphj8OPw@mail.gmail.com>
On 2024/3/1 16:39, Juhyung Park wrote:
> [外部邮件] 此邮件来源于小米公司外部,请谨慎处理。若对邮件安全性存疑,请将邮件转发给misec@xiaomi.com进行反馈
>
> Hi Huang and Chao.
>
> I feel like this special loopback handling alongside Chao's
> 14197d546b93 on f2fs-tools is just unnecessarily complicating the code
> flow.
> We're now doing what, lookup to /sys, parse original backing file,
> remove trailing newline char, stat()'ing it to make sure it exists?
Indeed this is not a good approach.
> What if the stat()'ed file is a new file after the original backing
> file has been deleted?
>
> Being able to overwrite an active loopback backing file is a semantic
> that Linux provides willingly.
> O_EXCL only works on block devices and it's a POSIX guarantee that
> multiple writers can work on a regular file.
>
> IMHO we should honor that, but if we really want to prevent this akin
> to e2fsprogs, we should be using mntent like e2fsprogs.
e2fsprogs will continue to check if opening the loop device fails,
rather than
exiting. This way non-root users can use mkfs/fsck normally, although there
may be overwrite issues.
Thanks,
Jianan
> On Fri, Mar 1, 2024 at 4:15 PM Huang Jianan via Linux-f2fs-devel
> <linux-f2fs-devel@lists.sourceforge.net> wrote:
>> Currently mkfs/fsck gets the following error when executed by
>> non-root users:
>>
>> Info: open /dev/loop0 failed errno:13
>> Error: Not available on mounted device!
>>
>> Let's fix it by reading the backing file from sysfs.
>>
>> Fixes: 14197d546b93 ("f2fs-tools: fix to check loop device")
>> Signed-off-by: Huang Jianan <huangjianan@xiaomi.com>
>> ---
>> v3:
>> - Skip deleted backing file.
>> lib/libf2fs.c | 40 +++++++++++++++++++++++++++-------------
>> 1 file changed, 27 insertions(+), 13 deletions(-)
>>
>> diff --git a/lib/libf2fs.c b/lib/libf2fs.c
>> index d51e485..fad3fd4 100644
>> --- a/lib/libf2fs.c
>> +++ b/lib/libf2fs.c
>> @@ -832,7 +832,7 @@ int f2fs_dev_is_umounted(char *path)
>> }
>> } else if (S_ISREG(st_buf.st_mode)) {
>> /* check whether regular is backfile of loop device */
>> -#if defined(HAVE_LINUX_LOOP_H) && defined(HAVE_LINUX_MAJOR_H)
>> +#if defined(HAVE_LINUX_MAJOR_H)
>> struct mntent *mnt;
>> struct stat st_loop;
>> FILE *f;
>> @@ -840,8 +840,9 @@ int f2fs_dev_is_umounted(char *path)
>> f = setmntent("/proc/mounts", "r");
>>
>> while ((mnt = getmntent(f)) != NULL) {
>> - struct loop_info64 loopinfo = {0, };
>> - int loop_fd, err;
>> + struct stat st_back;
>> + int sysfs_fd, rc;
>> + char buf[PATH_MAX + 1];
>>
>> if (mnt->mnt_fsname[0] != '/')
>> continue;
>> @@ -852,23 +853,36 @@ int f2fs_dev_is_umounted(char *path)
>> if (major(st_loop.st_rdev) != LOOP_MAJOR)
>> continue;
>>
>> - loop_fd = open(mnt->mnt_fsname, O_RDONLY);
>> - if (loop_fd < 0) {
>> + snprintf(buf, PATH_MAX,
>> + "/sys/dev/block/%d:%d/loop/backing_file",
>> + major(st_loop.st_rdev), minor(st_loop.st_rdev));
>> +
>> + sysfs_fd = open(buf, O_RDONLY);
>> + if (sysfs_fd < 0) {
>> MSG(0, "Info: open %s failed errno:%d\n",
>> - mnt->mnt_fsname, errno);
>> + buf, errno);
>> return -1;
>> }
>>
>> - err = ioctl(loop_fd, LOOP_GET_STATUS64, &loopinfo);
>> - close(loop_fd);
>> - if (err < 0) {
>> - MSG(0, "\tError: ioctl LOOP_GET_STATUS64 failed errno:%d!\n",
>> - errno);
>> + memset(buf, 0, PATH_MAX + 1);
>> + rc = read(sysfs_fd, buf, PATH_MAX);
>> + if (rc < 0) {
>> + MSG(0, "Info: read %s failed errno:%d\n",
>> + buf, errno);
>> return -1;
>> }
>>
>> - if (st_buf.st_dev == loopinfo.lo_device &&
>> - st_buf.st_ino == loopinfo.lo_inode) {
>> + /* Remove trailing newline */
>> + if (rc > 0 && *(buf + rc - 1) == '\n')
>> + --rc;
>> + buf[rc] = '\0';
>> +
>> + /* Skip deleted files like "xxx (deleted)" */
>> + if (stat(buf, &st_back) != 0)
>> + continue;
>> +
>> + if (st_buf.st_dev == st_back.st_dev &&
>> + st_buf.st_ino == st_back.st_ino) {
>> MSG(0, "\tError: In use by loop device!\n");
>> return -EBUSY;
>> }
>> --
>> 2.34.1
>>
>>
>>
>> _______________________________________________
>> Linux-f2fs-devel mailing list
>> Linux-f2fs-devel@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel
next prev parent reply other threads:[~2024-03-01 10:33 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-29 7:18 [f2fs-dev] [PATCH] f2fs-tools: fix to check loop device for non-root users Huang Jianan via Linux-f2fs-devel
2024-02-29 7:41 ` [f2fs-dev] [PATCH v2] " Huang Jianan via Linux-f2fs-devel
2024-03-01 7:14 ` [f2fs-dev] [PATCH v3] " Huang Jianan via Linux-f2fs-devel
2024-03-01 8:39 ` Juhyung Park
2024-03-01 10:32 ` 黄佳男 via Linux-f2fs-devel [this message]
2024-03-05 20:51 ` [f2fs-dev] [External Mail]Re: " Jaegeuk Kim
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=9ee3e01b-72c2-4eed-aed7-b005b3173203@xiaomi.com \
--to=linux-f2fs-devel@lists.sourceforge.net \
--cc=chao@kernel.org \
--cc=huangjianan@xiaomi.com \
--cc=jaegeuk@kernel.org \
--cc=jnhuang95@gmail.com \
--cc=qkrwngud825@gmail.com \
--cc=wanghui33@xiaomi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox