All of lore.kernel.org
 help / color / mirror / Atom feed
* [f2fs-dev] [PATCH] f2fs-tools: fix to check loop device for non-root users
@ 2024-02-29  7:18 Huang Jianan via Linux-f2fs-devel
  2024-02-29  7:41 ` [f2fs-dev] [PATCH v2] " Huang Jianan via Linux-f2fs-devel
  0 siblings, 1 reply; 6+ messages in thread
From: Huang Jianan via Linux-f2fs-devel @ 2024-02-29  7:18 UTC (permalink / raw)
  To: linux-f2fs-devel, chao, jaegeuk; +Cc: jnhuang95, wanghui33

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>
---
 lib/libf2fs.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 46 insertions(+), 2 deletions(-)

diff --git a/lib/libf2fs.c b/lib/libf2fs.c
index d51e485..fa9ea9a 100644
--- a/lib/libf2fs.c
+++ b/lib/libf2fs.c
@@ -834,14 +834,20 @@ int f2fs_dev_is_umounted(char *path)
 		/* check whether regular is backfile of loop device */
 #if defined(HAVE_LINUX_LOOP_H) && defined(HAVE_LINUX_MAJOR_H)
 		struct mntent *mnt;
-		struct stat st_loop;
+		struct stat st_loop, st_sysfs;
 		FILE *f;
+		bool has_sysfs = true;
+
+		if (stat("/sys/dev/block/", &st_sysfs) || !S_ISDIR(st_sysfs.st_mode))
+			has_sysfs = false;
 
 		f = setmntent("/proc/mounts", "r");
 
 		while ((mnt = getmntent(f)) != NULL) {
 			struct loop_info64 loopinfo = {0, };
-			int loop_fd, err;
+			struct stat st_back;
+			int loop_fd, sysfs_fd, rc, err;
+			char buf[PATH_MAX + 1];
 
 			if (mnt->mnt_fsname[0] != '/')
 				continue;
@@ -852,6 +858,44 @@ int f2fs_dev_is_umounted(char *path)
 			if (major(st_loop.st_rdev) != LOOP_MAJOR)
 				continue;
 
+			if (has_sysfs) {
+				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",
+						buf, errno);
+					return -1;
+				}
+
+				memset(buf, 0, PATH_MAX + 1);
+				rc = read(sysfs_fd, buf, 1024);
+				if (rc < 0) {
+					MSG(0, "Info: read %s failed errno:%d\n",
+						buf, errno);
+					return -1;
+				}
+
+				/* Remove trailing newline (usual in sysfs) */
+				if (rc > 0 && *(buf + rc - 1) == '\n')
+					--rc;
+				buf[rc] = '\0';
+
+				if (stat(buf, &st_back) != 0) {
+					MSG(0, "Info: stat %s failed errno:%d\n",
+						buf, errno);
+					return -1;
+				}
+
+				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;
+				}
+			}
+
 			loop_fd = open(mnt->mnt_fsname, O_RDONLY);
 			if (loop_fd < 0) {
 				MSG(0, "Info: open %s failed errno:%d\n",
-- 
2.34.1



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2024-03-05 20:52 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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       ` [f2fs-dev] [External Mail]Re: " 黄佳男 via Linux-f2fs-devel
2024-03-05 20:51         ` Jaegeuk Kim

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.