osdep/linux/hostdisk: Use stat() instead of udevadm for partition lookup
The sysfs_partition_path() calls udevadm to resolve the sysfs path for a block device. That can be accomplished by stating the device node and using the major/minor to follow the symlinks in /sys/dev/block/. This cuts the execution time of grub-mkconfig to somewhere near 55% on system without LVM (which uses libdevmapper instead sysfs_partition_path()). Remove udevadm call as it does not help us more than calling stat() directly. Signed-off-by: Jeff Mahoney <jeffm@suse.com> Signed-off-by: Petr Vorel <pvorel@suse.cz> Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
parent
e94b4f2327
commit
1ea4e5ef09
@ -31,6 +31,7 @@
|
|||||||
#include <grub/misc.h>
|
#include <grub/misc.h>
|
||||||
#include <grub/i18n.h>
|
#include <grub/i18n.h>
|
||||||
#include <grub/list.h>
|
#include <grub/list.h>
|
||||||
|
#include <grub/osdep/major.h>
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -98,54 +99,13 @@ grub_util_get_fd_size_os (grub_util_fd_t fd, const char *name, unsigned *log_sec
|
|||||||
static char *
|
static char *
|
||||||
sysfs_partition_path (const char *dev, const char *entry)
|
sysfs_partition_path (const char *dev, const char *entry)
|
||||||
{
|
{
|
||||||
const char *argv[7];
|
struct stat st;
|
||||||
int fd;
|
|
||||||
pid_t pid;
|
|
||||||
FILE *udevadm;
|
|
||||||
char *buf = NULL;
|
|
||||||
size_t len = 0;
|
|
||||||
char *path = NULL;
|
|
||||||
|
|
||||||
argv[0] = "udevadm";
|
if (stat (dev, &st) == 0 && S_ISBLK (st.st_mode))
|
||||||
argv[1] = "info";
|
return xasprintf ("/sys/dev/block/%u:%u/%s",
|
||||||
argv[2] = "--query";
|
major (st.st_rdev), minor (st.st_rdev), entry);
|
||||||
argv[3] = "path";
|
|
||||||
argv[4] = "--name";
|
|
||||||
argv[5] = dev;
|
|
||||||
argv[6] = NULL;
|
|
||||||
|
|
||||||
pid = grub_util_exec_pipe (argv, &fd);
|
return NULL;
|
||||||
|
|
||||||
if (!pid)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/* Parent. Read udevadm's output. */
|
|
||||||
udevadm = fdopen (fd, "r");
|
|
||||||
if (!udevadm)
|
|
||||||
{
|
|
||||||
grub_util_warn (_("Unable to open stream from %s: %s"),
|
|
||||||
"udevadm", strerror (errno));
|
|
||||||
close (fd);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (getline (&buf, &len, udevadm) > 0)
|
|
||||||
{
|
|
||||||
char *newline;
|
|
||||||
|
|
||||||
newline = strchr (buf, '\n');
|
|
||||||
if (newline)
|
|
||||||
*newline = '\0';
|
|
||||||
path = xasprintf ("/sys%s/%s", buf, entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
|
||||||
if (udevadm)
|
|
||||||
fclose (udevadm);
|
|
||||||
waitpid (pid, NULL, 0);
|
|
||||||
free (buf);
|
|
||||||
|
|
||||||
return path;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user