From: Karel Zak Date: Tue, 30 Jun 2026 15:30:33 +0000 (+0200) Subject: lib/sysfs: add VFS parameter to sysfs_devno_is_dm_*() X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ed599cb9a7cab8886bdca7a7668884c8b8f5429d;p=thirdparty%2Futil-linux.git lib/sysfs: add VFS parameter to sysfs_devno_is_dm_*() Add const struct ul_vfs_ops *vfs parameter to sysfs_devno_is_dm_hidden() and sysfs_devno_is_dm_private() so the internal sysfs reads go through VFS dispatch. Wire pr->vfs in libblkid probe.c and topology/sysfs.c callers. Non-library callers pass NULL. Addresses: https://github.com/util-linux/util-linux/issues/4308 Signed-off-by: Karel Zak --- diff --git a/disk-utils/fdisk-list.c b/disk-utils/fdisk-list.c index 76c1ac639..e92eba897 100644 --- a/disk-utils/fdisk-list.c +++ b/disk-utils/fdisk-list.c @@ -416,7 +416,7 @@ char *next_proc_partition(FILE **f) if (devno <= 0) continue; - if (sysfs_devno_is_dm_private(devno, NULL) || + if (sysfs_devno_is_dm_private(devno, NULL, NULL) || sysfs_devno_is_wholedisk(devno) <= 0) continue; diff --git a/include/sysfs.h b/include/sysfs.h index 37f3b71ca..0cf833912 100644 --- a/include/sysfs.h +++ b/include/sysfs.h @@ -93,10 +93,14 @@ int sysfs_blkdev_get_wholedisk( struct path_cxt *pc, size_t len, dev_t *diskdevno); +struct ul_vfs_ops; + int sysfs_devno_to_wholedisk(dev_t dev, char *diskname, size_t len, dev_t *diskdevno); -int sysfs_devno_is_dm_hidden(dev_t devno, char **uuid); -int sysfs_devno_is_dm_private(dev_t devno, char **uuid); +int sysfs_devno_is_dm_hidden(dev_t devno, char **uuid, + const struct ul_vfs_ops *vfs); +int sysfs_devno_is_dm_private(dev_t devno, char **uuid, + const struct ul_vfs_ops *vfs); int sysfs_devno_is_wholedisk(dev_t devno); dev_t sysfs_devname_to_devno(const char *name); diff --git a/lib/sysfs.c b/lib/sysfs.c index ad8a88ed0..99c486df7 100644 --- a/lib/sysfs.c +++ b/lib/sysfs.c @@ -664,7 +664,8 @@ int sysfs_devno_to_wholedisk(dev_t devno, char *diskname, * * The @uuid (if not NULL) returns DM device UUID, use free() to deallocate. */ -int sysfs_devno_is_dm_hidden(dev_t devno, char **uuid) +int sysfs_devno_is_dm_hidden(dev_t devno, char **uuid, + const struct ul_vfs_ops *vfs) { struct path_cxt *pc = NULL; char *id = NULL; @@ -673,6 +674,7 @@ int sysfs_devno_is_dm_hidden(dev_t devno, char **uuid) pc = ul_new_sysfs_path(devno, NULL, NULL); if (!pc) goto done; + ul_path_refer_vfs(pc, vfs); if (ul_path_read_string(pc, &id, "dm/uuid") <= 0 || !id) goto done; @@ -698,7 +700,8 @@ done: * Returns 1 if the device is private device mapper device. The @uuid * (if not NULL) returns DM device UUID, use free() to deallocate. */ -int sysfs_devno_is_dm_private(dev_t devno, char **uuid) +int sysfs_devno_is_dm_private(dev_t devno, char **uuid, + const struct ul_vfs_ops *vfs) { struct path_cxt *pc = NULL; char *id = NULL; @@ -707,6 +710,7 @@ int sysfs_devno_is_dm_private(dev_t devno, char **uuid) pc = ul_new_sysfs_path(devno, NULL, NULL); if (!pc) goto done; + ul_path_refer_vfs(pc, vfs); if (ul_path_read_string(pc, &id, "dm/uuid") <= 0 || !id) goto done; diff --git a/libblkid/src/blkid.h.in b/libblkid/src/blkid.h.in index 1f39eefc2..c1bf350d5 100644 --- a/libblkid/src/blkid.h.in +++ b/libblkid/src/blkid.h.in @@ -22,6 +22,7 @@ #ifndef _BLKID_BLKID_H #define _BLKID_BLKID_H +#include #include #include diff --git a/libblkid/src/probe.c b/libblkid/src/probe.c index 7f4c2791d..36d70ebb7 100644 --- a/libblkid/src/probe.c +++ b/libblkid/src/probe.c @@ -232,7 +232,7 @@ int blkid_probe_open_device(blkid_probe pr, const char *filename, int flags) struct stat sb; if (stat(filename, &sb) == 0 && S_ISBLK(sb.st_mode) && - sysfs_devno_is_dm_hidden(sb.st_rdev, NULL)) { + sysfs_devno_is_dm_hidden(sb.st_rdev, NULL, pr->vfs)) { DBG(LOWPROBE, ul_debug("ignore hidden device mapper device")); errno = EINVAL; return -EINVAL; @@ -1213,7 +1213,7 @@ int blkid_probe_set_device(blkid_probe pr, int fd, #endif if (S_ISBLK(sb.st_mode) && !is_floppy && - sysfs_devno_is_dm_private(sb.st_rdev, &dm_uuid)) { + sysfs_devno_is_dm_private(sb.st_rdev, &dm_uuid, pr->vfs)) { DBG(LOWPROBE, ul_debug("ignore private device mapper device")); pr->flags |= BLKID_FL_NOSCAN_DEV; } diff --git a/libblkid/src/topology/sysfs.c b/libblkid/src/topology/sysfs.c index d216cfccb..c9689450a 100644 --- a/libblkid/src/topology/sysfs.c +++ b/libblkid/src/topology/sysfs.c @@ -56,6 +56,7 @@ static int probe_sysfs_tp(blkid_probe pr, pc = ul_new_sysfs_path(dev, NULL, NULL); if (!pc) return 1; + ul_path_refer_vfs(pc, pr->vfs); rc = 1; /* nothing (default) */ diff --git a/libblkid/src/verify.c b/libblkid/src/verify.c index 7ca267dc7..b59af77b9 100644 --- a/libblkid/src/verify.c +++ b/libblkid/src/verify.c @@ -105,7 +105,7 @@ blkid_dev blkid_verify(blkid_cache cache, blkid_dev dev) (long long)diff)); #endif - if (sysfs_devno_is_dm_private(st.st_rdev, NULL)) + if (sysfs_devno_is_dm_private(st.st_rdev, NULL, NULL)) goto dev_free; if (!cache->probe) { cache->probe = blkid_new_probe();