/* * Returns 1 if the device is private LVM device. */ int sysfs_devno_is_lvm_private(dev_t devno) { struct sysfs_cxt cxt = UL_SYSFSCXT_EMPTY; char *uuid = NULL; int rc = 0; if (sysfs_init(&cxt, devno, NULL) != 0) return 0; uuid = sysfs_strdup(&cxt, "dm/uuid"); /* Private LVM devices use "LVM-<uuid>-<name>" uuid format (important * is the "LVM" prefix and "-<name>" postfix). */ if (uuid && strncmp(uuid, "LVM-", 4) == 0) { char *p = strrchr(uuid + 4, '-'); if (p && *(p + 1)) rc = 1; } sysfs_deinit(&cxt); free(uuid); return rc; }
/* * @lc: context * * Returns (allocated) string with path to the file assicieted * with the current loop device. */ char *loopcxt_get_backing_file(struct loopdev_cxt *lc) { struct sysfs_cxt *sysfs = loopcxt_get_sysfs(lc); char *res = NULL; if (sysfs) /* * This is always preffered, the loop_info64 * has too small buffer for the filename. */ res = sysfs_strdup(sysfs, "loop/backing_file"); if (!res && loopcxt_ioctl_enabled(lc)) { struct loop_info64 *lo = loopcxt_get_info(lc); if (lo) { lo->lo_file_name[LO_NAME_SIZE - 2] = '*'; lo->lo_file_name[LO_NAME_SIZE - 1] = '\0'; res = strdup((char *) lo->lo_file_name); } } DBG(lc, loopdev_debug("get_backing_file [%s]", res)); return res; }
/* * Returns by @diskdevno whole disk device devno and (optionaly) by * @diskname the whole disk device name. */ int sysfs_devno_to_wholedisk(dev_t dev, char *diskname, size_t len, dev_t *diskdevno) { struct sysfs_cxt cxt; int is_part = 0; if (!dev || sysfs_init(&cxt, dev, NULL) != 0) return -1; is_part = sysfs_has_attribute(&cxt, "partition"); if (!is_part) { /* * Extra case for partitions mapped by device-mapper. * * All regualar partitions (added by BLKPG ioctl or kernel PT * parser) have the /sys/.../partition file. The partitions * mapped by DM don't have such file, but they have "part" * prefix in DM UUID. */ char *uuid = sysfs_strdup(&cxt, "dm/uuid"); char *tmp = uuid; char *prefix = uuid ? strsep(&tmp, "-") : NULL; if (prefix && strncasecmp(prefix, "part", 4) == 0) is_part = 1; free(uuid); if (is_part && get_dm_wholedisk(&cxt, diskname, len, diskdevno) == 0) /* * partitioned device, mapped by DM */ goto done; is_part = 0; } if (!is_part) { /* * unpartitioned device */ if (diskname && len) { if (!sysfs_get_devname(&cxt, diskname, len)) goto err; } if (diskdevno) *diskdevno = dev; } else { /* * partitioned device * - readlink /sys/dev/block/8:1 = ../../block/sda/sda1 * - dirname ../../block/sda/sda1 = ../../block/sda * - basename ../../block/sda = sda */ char linkpath[PATH_MAX]; char *name; int linklen; linklen = sysfs_readlink(&cxt, NULL, linkpath, sizeof(linkpath) - 1); if (linklen < 0) goto err; linkpath[linklen] = '\0'; stripoff_last_component(linkpath); /* dirname */ name = stripoff_last_component(linkpath); /* basename */ if (!name) goto err; if (diskname && len) { strncpy(diskname, name, len); diskname[len - 1] = '\0'; } if (diskdevno) { *diskdevno = sysfs_devname_to_devno(name, NULL); if (!*diskdevno) goto err; } } done: sysfs_deinit(&cxt); return 0; err: sysfs_deinit(&cxt); return -1; }