From cd78a56fb2756439baf9ffb1d6cd3eb6aab95624 Mon Sep 17 00:00:00 2001 From: Vladimir 'phcoder' Serbinenko Date: Sat, 19 Oct 2013 16:29:20 +0200 Subject: [PATCH] Move stat () and device mode checking into OS-dependent files as long as performance doesn't suffer. --- ChangeLog | 5 ++ grub-core/osdep/apple/getroot.c | 7 ++ grub-core/osdep/bsd/getroot.c | 7 ++ grub-core/osdep/devmapper/getroot.c | 7 ++ grub-core/osdep/devmapper/hostdisk.c | 7 ++ grub-core/osdep/freebsd/getroot.c | 7 ++ grub-core/osdep/hurd/getroot.c | 8 ++- grub-core/osdep/linux/getroot.c | 6 ++ grub-core/osdep/sun/getroot.c | 9 ++- util/getroot.c | 101 +++++++++------------------ 10 files changed, 93 insertions(+), 71 deletions(-) diff --git a/ChangeLog b/ChangeLog index 57f33c912..a49f6fa55 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2013-10-19 Vladimir Serbinenko + + Move stat () and device mode checking into OS-dependent files as + long as performance doesn't suffer. + 2013-10-19 Vladimir Serbinenko Split make_system_path_relative_to_its_root into separate file diff --git a/grub-core/osdep/apple/getroot.c b/grub-core/osdep/apple/getroot.c index d8690e123..2091dedfe 100644 --- a/grub-core/osdep/apple/getroot.c +++ b/grub-core/osdep/apple/getroot.c @@ -57,6 +57,13 @@ grub_util_part_to_disk (const char *os_dev, struct stat *st, int *is_part) { char *path = xstrdup (os_dev); + + if (! S_ISCHR (st->st_mode)) + { + *is_part = 0; + return path; + } + if (strncmp ("/dev/", path, 5) == 0) { char *p; diff --git a/grub-core/osdep/bsd/getroot.c b/grub-core/osdep/bsd/getroot.c index 0cb0da109..dbc6a2f2a 100644 --- a/grub-core/osdep/bsd/getroot.c +++ b/grub-core/osdep/bsd/getroot.c @@ -65,6 +65,13 @@ grub_util_part_to_disk (const char *os_dev, struct stat *st, int *is_part) { int rawpart = -1; + + if (! S_ISCHR (st->st_mode)) + { + *is_part = 0; + return xstrdup (os_dev); + } + # ifdef HAVE_GETRAWPARTITION rawpart = getrawpartition(); # endif /* HAVE_GETRAWPARTITION */ diff --git a/grub-core/osdep/devmapper/getroot.c b/grub-core/osdep/devmapper/getroot.c index b5df7c2c7..2639a71ea 100644 --- a/grub-core/osdep/devmapper/getroot.c +++ b/grub-core/osdep/devmapper/getroot.c @@ -321,6 +321,13 @@ grub_util_devmapper_part_to_disk (struct stat *st, int grub_util_device_is_mapped_stat (struct stat *st) { +#if GRUB_DISK_DEVS_ARE_CHAR + if (! S_ISCHR (st->st_mode)) +#else + if (! S_ISBLK (st->st_mode)) +#endif + return 0; + if (!grub_device_mapper_supported ()) return 0; diff --git a/grub-core/osdep/devmapper/hostdisk.c b/grub-core/osdep/devmapper/hostdisk.c index 347813ed6..1078f3591 100644 --- a/grub-core/osdep/devmapper/hostdisk.c +++ b/grub-core/osdep/devmapper/hostdisk.c @@ -72,6 +72,13 @@ grub_util_device_is_mapped (const char *dev) if (stat (dev, &st) < 0) return 0; +#if GRUB_DISK_DEVS_ARE_CHAR + if (! S_ISCHR (st.st_mode)) +#else + if (! S_ISBLK (st.st_mode)) +#endif + return 0; + return dm_is_dm_major (major (st.st_rdev)); } diff --git a/grub-core/osdep/freebsd/getroot.c b/grub-core/osdep/freebsd/getroot.c index 620d2b553..ccc1d7028 100644 --- a/grub-core/osdep/freebsd/getroot.c +++ b/grub-core/osdep/freebsd/getroot.c @@ -115,6 +115,13 @@ grub_util_part_to_disk (const char *os_dev, struct stat *st, int *is_part) { char *out, *out2; + + if (! S_ISCHR (st->st_mode)) + { + *is_part = 0; + return xstrdup (os_dev); + } + if (strncmp (os_dev, "/dev/", sizeof ("/dev/") - 1) != 0) return xstrdup (os_dev); grub_util_follow_gpart_up (os_dev + sizeof ("/dev/") - 1, NULL, &out); diff --git a/grub-core/osdep/hurd/getroot.c b/grub-core/osdep/hurd/getroot.c index b3e8d8140..c66b206fa 100644 --- a/grub-core/osdep/hurd/getroot.c +++ b/grub-core/osdep/hurd/getroot.c @@ -143,13 +143,19 @@ is_fulldisk (const char *child, const char *parent) char * grub_util_part_to_disk (const char *os_dev, - struct stat *st __attribute__ ((unused)), + struct stat *st, int *is_part) { char *path; grub_disk_addr_t offset; char *p; + if (! S_ISBLK (st->st_mode)) + { + *is_part = 0; + return xstrdup (os_dev); + } + if (!grub_util_hurd_get_disk_info (os_dev, NULL, &offset, NULL, &path)) return xstrdup (os_dev); diff --git a/grub-core/osdep/linux/getroot.c b/grub-core/osdep/linux/getroot.c index ee57eb643..77d80838e 100644 --- a/grub-core/osdep/linux/getroot.c +++ b/grub-core/osdep/linux/getroot.c @@ -541,6 +541,12 @@ grub_util_part_to_disk (const char *os_dev, struct stat *st, { char *path = xmalloc (PATH_MAX); + if (! S_ISBLK (st->st_mode)) + { + *is_part = 0; + return xstrdup (os_dev); + } + if (! realpath (os_dev, path)) return NULL; diff --git a/grub-core/osdep/sun/getroot.c b/grub-core/osdep/sun/getroot.c index 8535a892a..611603769 100644 --- a/grub-core/osdep/sun/getroot.c +++ b/grub-core/osdep/sun/getroot.c @@ -54,10 +54,17 @@ char * grub_util_part_to_disk (const char *os_dev, - struct stat *st __attribute__ ((unused)), + struct stat *st, int *is_part) { char *colon = grub_strrchr (os_dev, ':'); + + if (! S_ISCHR (st->st_mode)) + { + *is_part = 0; + return xstrdup (os_dev); + } + if (grub_memcmp (os_dev, "/devices", sizeof ("/devices") - 1) == 0 && colon) { diff --git a/util/getroot.c b/util/getroot.c index cffac7dc3..ab3fa132a 100644 --- a/util/getroot.c +++ b/util/getroot.c @@ -143,34 +143,47 @@ grub_util_get_dev_abstraction (const char *os_dev) } static char * -convert_system_partition_to_system_disk (const char *os_dev, struct stat *st, - int *is_part) +convert_system_partition_to_system_disk (const char *os_dev, int *is_part) { - *is_part = 0; +#if GRUB_UTIL_FD_STAT_IS_FUNCTIONAL + struct stat st; - if (grub_util_device_is_mapped_stat (st)) - return grub_util_devmapper_part_to_disk (st, is_part, os_dev); + if (stat (os_dev, &st) < 0) + { + const char *errstr = strerror (errno); + grub_error (GRUB_ERR_BAD_DEVICE, N_("cannot stat `%s': %s"), + os_dev, errstr); + grub_util_info (_("cannot stat `%s': %s"), os_dev, errstr); + return 0; + } *is_part = 0; - return grub_util_part_to_disk (os_dev, st, is_part); + if (grub_util_device_is_mapped_stat (&st)) + return grub_util_devmapper_part_to_disk (&st, is_part, os_dev); + + *is_part = 0; + + return grub_util_part_to_disk (os_dev, &st, is_part); +#else + *is_part = 0; + + return grub_util_part_to_disk (os_dev, NULL, is_part); +#endif } static const char * -find_system_device (const char *os_dev, struct stat *st, int convert, int add) +find_system_device (const char *os_dev) { char *os_disk; const char *drive; int is_part; - if (convert) - os_disk = convert_system_partition_to_system_disk (os_dev, st, &is_part); - else - os_disk = xstrdup (os_dev); + os_disk = convert_system_partition_to_system_disk (os_dev, &is_part); if (! os_disk) return NULL; - drive = grub_hostdisk_os_dev_to_grub_drive (os_disk, add); + drive = grub_hostdisk_os_dev_to_grub_drive (os_disk, 0); free (os_disk); return drive; } @@ -201,22 +214,7 @@ grub_util_get_os_disk (const char *os_dev) grub_util_info ("Looking for %s", os_dev); -#if GRUB_UTIL_FD_STAT_IS_FUNCTIONAL - struct stat st; - - if (stat (os_dev, &st) < 0) - { - const char *errstr = strerror (errno); - grub_error (GRUB_ERR_BAD_DEVICE, N_("cannot stat `%s': %s"), - os_dev, errstr); - grub_util_info (_("cannot stat `%s': %s"), os_dev, errstr); - return 0; - } - - return convert_system_partition_to_system_disk (os_dev, &st, &is_part); -#else - return convert_system_partition_to_system_disk (os_dev, NULL, &is_part); -#endif + return convert_system_partition_to_system_disk (os_dev, &is_part); } #if !defined(__APPLE__) @@ -252,41 +250,19 @@ find_partition (grub_disk_t dsk __attribute__ ((unused)), char * grub_util_biosdisk_get_grub_dev (const char *os_dev) { -#if GRUB_UTIL_FD_STAT_IS_FUNCTIONAL - struct stat st; -#endif const char *drive; char *sys_disk; int is_part; grub_util_info ("Looking for %s", os_dev); -#if GRUB_UTIL_FD_STAT_IS_FUNCTIONAL - if (stat (os_dev, &st) < 0) - { - const char *errstr = strerror (errno); - grub_error (GRUB_ERR_BAD_DEVICE, N_("cannot stat `%s': %s"), os_dev, - errstr); - grub_util_info (_("cannot stat `%s': %s"), os_dev, errstr); - return 0; - } - drive = find_system_device (os_dev, &st, 1, 1); - -#if GRUB_DISK_DEVS_ARE_CHAR - if (! S_ISCHR (st.st_mode)) -#else - if (! S_ISBLK (st.st_mode)) -#endif - return make_device_name (drive); - - sys_disk = convert_system_partition_to_system_disk (os_dev, &st, &is_part); -#else - drive = find_system_device (os_dev, NULL, 1, 1); - sys_disk = convert_system_partition_to_system_disk (os_dev, NULL, &is_part); -#endif + sys_disk = convert_system_partition_to_system_disk (os_dev, &is_part); if (!sys_disk) return 0; + + drive = grub_hostdisk_os_dev_to_grub_drive (sys_disk, 1); + grub_util_info ("%s is a parent of %s", sys_disk, os_dev); if (!is_part) { @@ -426,11 +402,7 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev) grub_errno = GRUB_ERR_NONE; canon = canonicalize_file_name (os_dev); -#if GRUB_UTIL_FD_STAT_IS_FUNCTIONAL - drive = find_system_device (canon ? : os_dev, &st, 0, 1); -#else - drive = find_system_device (canon ? : os_dev, NULL, 0, 1); -#endif + drive = grub_hostdisk_os_dev_to_grub_drive (canon ? : os_dev, 1); if (canon) free (canon); return make_device_name (drive); @@ -473,16 +445,7 @@ grub_util_biosdisk_get_grub_dev (const char *os_dev) int grub_util_biosdisk_is_present (const char *os_dev) { -#if GRUB_UTIL_FD_STAT_IS_FUNCTIONAL - struct stat st; - - if (stat (os_dev, &st) < 0) - return 0; - - int ret= (find_system_device (os_dev, &st, 1, 0) != NULL); -#else - int ret= (find_system_device (os_dev, NULL, 1, 0) != NULL); -#endif + int ret = (find_system_device (os_dev) != NULL); grub_util_info ((ret ? "%s is present" : "%s is not present"), os_dev); return ret;