[syslinux] [PATCH 2/3] ALPHA: first try to fix adv problem

Frediano Ziglio frediano.ziglio at citrix.com
Thu Aug 2 02:44:41 PDT 2012


This is part of some patches to support sectors > 512.

Currently I'm able to boot a Ubuntu kernel but seems that mboot is not working for some reason.

This patch try to fix ADV size problem.

Signed-off-by: Frediano Ziglio <frediano.ziglio at citrix.com>
---
 extlinux/main.c |   40 +++++++++++++++++++++++++++++++++++-----
 1 files changed, 35 insertions(+), 5 deletions(-)

diff --git a/extlinux/main.c b/extlinux/main.c
index e40b4d7..61eaad1 100644
--- a/extlinux/main.c
+++ b/extlinux/main.c
@@ -275,7 +275,8 @@ static int patch_file_and_bootblock(int fd, const char *dir, int devfd)
     dprintf("subpath = %s\n", subpath);
 
     totalbytes = get_size(devfd);
-    sector_size = get_sector_size(devfd);
+    /* FIXME support greater sector sizes for BTRFS */
+    sector_size = fs_type == BTRFS ? SECTOR_SIZE : get_sector_size(devfd);
     get_geometry(devfd, totalbytes, sector_size, &geo);
 
     if (opt.heads)
@@ -318,6 +319,7 @@ static int patch_file_and_bootblock(int fd, const char *dir, int devfd)
 	int i;
 	sector_t *sp = sectp;
 
+// FIXME ??
 	for (i = 0; i < nsect - 2; i++)
 	    *sp++ = BTRFS_EXTLINUX_OFFSET/SECTOR_SIZE + i;
 	for (i = 0; i < 2; i++)
@@ -410,12 +412,33 @@ int install_bootblock(int fd, const char *device)
     return 0;
 }
 
-int ext2_fat_install_file(const char *path, int devfd, struct stat *rst)
+static int inc_and_align(int fd, unsigned *pos, unsigned bytes, unsigned align)
+{
+    char buf[512];
+    unsigned left;
+
+    *pos += bytes;
+    left = *pos % align;
+    left = (align - left) % align;
+    while (left > 0) {
+	unsigned l = left > sizeof(buf) ? sizeof(buf) : left;
+	memset(buf, 0, sizeof(buf));
+	if (xpwrite(fd, buf, l, *pos) != l)
+	    return 0;
+	left -= l;
+	*pos += l;
+    }
+    return 1;
+}
+
+static int ext2_fat_install_file(const char *path, int devfd, struct stat *rst)
 {
     char *file, *oldfile;
     int fd = -1, dirfd = -1;
     int modbytes;
     int r1, r2;
+    unsigned sector_size;
+    unsigned pos;
 
     r1 = asprintf(&file, "%s%sldlinux.sys",
 		  path, path[0] && path[strlen(path) - 1] == '/' ? "" : "/");
@@ -450,10 +473,17 @@ int ext2_fat_install_file(const char *path, int devfd, struct stat *rst)
 	goto bail;
     }
 
+    /* FIXME copied above */
+    sector_size = fs_type == BTRFS ? SECTOR_SIZE : get_sector_size(devfd);
+
     /* Write it the first time */
-    if (xpwrite(fd, boot_image, boot_image_len, 0) != boot_image_len ||
-	xpwrite(fd, syslinux_adv, 2 * ADV_SIZE,
-		boot_image_len) != 2 * ADV_SIZE) {
+    pos = 0;
+    if (xpwrite(fd, boot_image, boot_image_len, pos) != boot_image_len ||
+        !inc_and_align(fd, &pos, boot_image_len, sector_size) ||
+	xpwrite(fd, syslinux_adv, ADV_SIZE, pos) != ADV_SIZE ||
+        !inc_and_align(fd, &pos, ADV_SIZE, sector_size) ||
+	xpwrite(fd, syslinux_adv + ADV_SIZE, ADV_SIZE, pos) != ADV_SIZE ||
+        !inc_and_align(fd, &pos, ADV_SIZE, sector_size)) {
 	fprintf(stderr, "%s: write failure on %s\n", program, file);
 	goto bail;
     }
-- 
1.7.5.4





More information about the Syslinux mailing list