* util/grub-setup.c (setup): Fix partition handling and blocklist

check.
This commit is contained in:
Vladimir 'phcoder' Serbinenko 2012-04-13 16:58:02 +02:00
parent ee5207750f
commit 5600807745
2 changed files with 22 additions and 12 deletions

View file

@ -1,3 +1,8 @@
2012-04-13 Vladimir Serbinenko <phcoder@gmail.com>
* util/grub-setup.c (setup): Fix partition handling and blocklist
check.
2012-04-13 Vladimir Serbinenko <phcoder@gmail.com> 2012-04-13 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/lib/relocator.c (grub_relocator_alloc_chunk_align): Remove * grub-core/lib/relocator.c (grub_relocator_alloc_chunk_align): Remove

View file

@ -150,7 +150,7 @@ setup (const char *dir,
char *root = 0; char *root = 0;
size_t boot_size, core_size; size_t boot_size, core_size;
grub_uint16_t core_sectors; grub_uint16_t core_sectors;
grub_device_t root_dev = 0, dest_dev; grub_device_t root_dev = 0, dest_dev, core_dev;
struct grub_boot_blocklist *first_block, *block; struct grub_boot_blocklist *first_block, *block;
char *tmp_img; char *tmp_img;
grub_disk_addr_t first_sector; grub_disk_addr_t first_sector;
@ -252,6 +252,8 @@ setup (const char *dir,
if (! dest_dev) if (! dest_dev)
grub_util_error ("%s", grub_errmsg); grub_util_error ("%s", grub_errmsg);
core_dev = dest_dev;
{ {
char **root_devices = grub_guess_root_devices (dir); char **root_devices = grub_guess_root_devices (dir);
char **cur; char **cur;
@ -582,6 +584,8 @@ unable_to_embed:
but MBR on another. */ but MBR on another. */
grub_util_error ("%s", _("embedding is not possible, but this is required for " grub_util_error ("%s", _("embedding is not possible, but this is required for "
"cross-disk install")); "cross-disk install"));
#else
core_dev = root_dev;
#endif #endif
grub_util_warn ("%s", _("Embedding is not possible. GRUB can only be installed in this " grub_util_warn ("%s", _("Embedding is not possible. GRUB can only be installed in this "
@ -697,6 +701,7 @@ unable_to_embed:
#ifdef __linux__ #ifdef __linux__
{ {
grub_partition_t container = root_dev->disk->partition; grub_partition_t container = root_dev->disk->partition;
grub_uint64_t container_start = grub_partition_get_start (container);
struct fiemap fie1; struct fiemap fie1;
int fd; int fd;
@ -743,11 +748,11 @@ unable_to_embed:
rest = GRUB_DISK_SECTOR_SIZE; rest = GRUB_DISK_SECTOR_SIZE;
if (i == 0 && j == 0) if (i == 0 && j == 0)
save_first_sector (((grub_uint64_t) blk) * mul save_first_sector (((grub_uint64_t) blk) * mul
+ grub_partition_get_start (container), + container_start,
0, rest); 0, rest);
else else
save_blocklists (((grub_uint64_t) blk) * mul + j save_blocklists (((grub_uint64_t) blk) * mul + j
+ grub_partition_get_start (container), + container_start,
0, rest); 0, rest);
} }
} }
@ -782,13 +787,13 @@ unable_to_embed:
if (i == 0 && j == 0) if (i == 0 && j == 0)
save_first_sector ((fie2->fm_extents[i].fe_physical save_first_sector ((fie2->fm_extents[i].fe_physical
>> GRUB_DISK_SECTOR_BITS) >> GRUB_DISK_SECTOR_BITS)
+ j, + j + container_start,
fie2->fm_extents[i].fe_physical fie2->fm_extents[i].fe_physical
& (GRUB_DISK_SECTOR_SIZE - 1), len); & (GRUB_DISK_SECTOR_SIZE - 1), len);
else else
save_blocklists ((fie2->fm_extents[i].fe_physical save_blocklists ((fie2->fm_extents[i].fe_physical
>> GRUB_DISK_SECTOR_BITS) >> GRUB_DISK_SECTOR_BITS)
+ j, + j + container_start,
fie2->fm_extents[i].fe_physical fie2->fm_extents[i].fe_physical
& (GRUB_DISK_SECTOR_SIZE - 1), len); & (GRUB_DISK_SECTOR_SIZE - 1), len);
@ -874,16 +879,16 @@ unable_to_embed:
char *buf, *ptr = core_img; char *buf, *ptr = core_img;
size_t len = core_size; size_t len = core_size;
grub_uint64_t blk; grub_uint64_t blk;
grub_partition_t container = root_dev->disk->partition; grub_partition_t container = core_dev->disk->partition;
grub_err_t err; grub_err_t err;
root_dev->disk->partition = 0; core_dev->disk->partition = 0;
buf = xmalloc (core_size); buf = xmalloc (core_size);
blk = first_sector; blk = first_sector;
err = grub_disk_read (dest_dev->disk, blk, 0, GRUB_DISK_SECTOR_SIZE, buf); err = grub_disk_read (core_dev->disk, blk, 0, GRUB_DISK_SECTOR_SIZE, buf);
if (err) if (err)
grub_util_error (_("cannot read `%s': %s"), dest_dev->disk->name, grub_util_error (_("cannot read `%s': %s"), core_dev->disk->name,
grub_errmsg); grub_errmsg);
if (grub_memcmp (buf, ptr, GRUB_DISK_SECTOR_SIZE) != 0) if (grub_memcmp (buf, ptr, GRUB_DISK_SECTOR_SIZE) != 0)
grub_util_error ("%s", _("blocklists are invalid")); grub_util_error ("%s", _("blocklists are invalid"));
@ -900,9 +905,9 @@ unable_to_embed:
if (cur > len) if (cur > len)
cur = len; cur = len;
err = grub_disk_read (dest_dev->disk, blk, 0, cur, buf); err = grub_disk_read (core_dev->disk, blk, 0, cur, buf);
if (err) if (err)
grub_util_error (_("cannot read `%s': %s"), dest_dev->disk->name, grub_util_error (_("cannot read `%s': %s"), core_dev->disk->name,
grub_errmsg); grub_errmsg);
if (grub_memcmp (buf, ptr, cur) != 0) if (grub_memcmp (buf, ptr, cur) != 0)
@ -915,7 +920,7 @@ unable_to_embed:
if ((char *) block <= core_img) if ((char *) block <= core_img)
grub_util_error ("%s", _("no terminator in the core image")); grub_util_error ("%s", _("no terminator in the core image"));
} }
root_dev->disk->partition = container; core_dev->disk->partition = container;
free (buf); free (buf);
} }