|
From: | Andrei Borzenkov |
Subject: | Re: [BUG] grub-install fails on devices with high minor numbers |
Date: | Sat, 7 Nov 2015 09:48:44 +0300 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0 |
06.11.2015 22:59, Tim Walberg пишет:
On 11/06/2015 21:26 +0300, Andrei Borzenkov wrote:06.11.2015 19:08, Tim Walberg ??????????: >On some relatively large systems that are used for virtualization, >often containing upwards of 100 virtual machines, we've started running >into issues with GRUB not being able to install on a new virtual machine >(using the typical process of mounting all the VM file systems on the host >and running grub-install under chroot). We've tracked the issue down to this >code, which is clearly erroneous - device minor numbers have been more than >8 bits for quite some time now - in grub-core/osdep/devmapper/getroot.c: > > char * > grub_util_devmapper_part_to_disk (struct stat *st, > int *is_part, const char *path) > { > int major, minor; > > if (grub_util_get_dm_node_linear_info (st->st_rdev, > &major, &minor, 0)) > { > *is_part = 1; > return grub_find_device ("/dev", > (major << 8) | minor); <<<<< --------- ERROR! > } > *is_part = 0; > return xstrdup (path); > } > >When we have enough device-mapper devices (including all their partitions) >on a host that the next newly-added set of devices ends up with minor numbers >outside the 8-bit range, this code fails, with the result that grub-install >can't find the devices that it needs to complete the install. > >There might be other places in the code where similar assumptions are made. >Someone more familiar with the code would probably be better for tracking >those down. But, this one at least needs to be fixed. > Does attached patch help?From: Andrei Borzenkov <address@hidden> Subject: [PATCH] devmapper/getroot: use makedev instead of direct shift Fixes device detection with large number of devices. Reported by Tim Wallberg <address@hidden> --- grub-core/osdep/devmapper/getroot.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/grub-core/osdep/devmapper/getroot.c b/grub-core/osdep/devmapper/getroot.c index 0a77a04..64419f6 100644 --- a/grub-core/osdep/devmapper/getroot.c +++ b/grub-core/osdep/devmapper/getroot.c @@ -208,8 +208,7 @@ grub_util_devmapper_part_to_disk (struct stat *st, &major, &minor, 0)) { *is_part = 1; - return grub_find_device ("/dev", - (major << 8) | minor); + return grub_find_device ("/dev", makedev (major, minor)); } *is_part = 0; return xstrdup (path); -- tg: (cd6d79c..) u/makedev (depends on: master)End of included message Yes, that appears to have resolved the issue. I was already testing essentially that patch on my own, but wasn't sure if there might be similar assumptions made elsewhere in the code.
As far as I can tell, other places used makedev() already. Committed. Thanks!
[Prev in Thread] | Current Thread | [Next in Thread] |