]> xenbits.xensource.com Git - xen.git/commitdiff
libfsimage: portability fixes for NetBSD
authorKeir Fraser <keir.fraser@citrix.com>
Wed, 26 Mar 2008 14:40:54 +0000 (14:40 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Wed, 26 Mar 2008 14:40:54 +0000 (14:40 +0000)
Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
tools/libfsimage/Makefile
tools/libfsimage/Rules.mk
tools/libfsimage/check-libext2fs
tools/libfsimage/common/fsimage_grub.c
tools/libfsimage/common/fsimage_grub.h
tools/libfsimage/common/fsimage_plugin.c

index 7dd3c4f0fb04f5d754b6c4ade76ef09b98cc4a16..b72e51895a6084efcd1c75d030c61c656a520341 100644 (file)
@@ -2,7 +2,7 @@ XEN_ROOT = ../..
 include $(XEN_ROOT)/tools/Rules.mk
 
 SUBDIRS-y = common ufs reiserfs iso9660 fat
-SUBDIRS-y += $(shell env CC="$(CC)" ./check-libext2fs)
+SUBDIRS-y += $(shell $(SHELL) env CC="$(CC)" ./check-libext2fs)
 
 .PHONY: all clean install
 all clean install: %: subdirs-%
index 0cc3d2199fdeab27471a36a2ab8b7adad218c752..afc08bdaab727f4c4011b9e930b852de213360b9 100644 (file)
@@ -11,6 +11,7 @@ FSDIR-$(CONFIG_Linux) = $(LIBDIR)/fs/$(FS)
 FSDIR-$(CONFIG_SunOS)-x86_64 = $(PREFIX)/lib/fs/$(FS)/64
 FSDIR-$(CONFIG_SunOS)-x86_32 = $(PREFIX)/lib/fs/$(FS)/
 FSDIR-$(CONFIG_SunOS) = $(FSDIR-$(CONFIG_SunOS)-$(XEN_TARGET_ARCH))
+FSDIR-$(CONFIG_NetBSD) = $(LIBDIR)/fs/$(FS)
 FSDIR = $(FSDIR-y)
 
 FSLIB = fsimage.so
index e6a8d186fcd9e5791a2ab7606711f64e645d65bd..b6fa7fbacd6492b2ec1c4d2904f08fddeb9f6bf1 100755 (executable)
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
 
 cat >ext2-test.c <<EOF
 #include <ext2fs/ext2fs.h>
@@ -9,7 +9,9 @@ int main()
 }
 EOF
 
-${CC:-gcc} -o ext2-test ext2-test.c -lext2fs >/dev/null 2>&1
+if test -z ${CC}; then CC="gcc"; fi
+${CC} -o ext2-test ext2-test.c -lext2fs >/dev/null 2>&1
+
 if [ $? = 0 ]; then
        echo ext2fs-lib
 else
index 5edb3ba05b4f3d76c1701ba16eaea2c341b72477..9ea2e35ac68abf5766f7ec72e5e61ec9ea0bcd16 100644 (file)
@@ -204,19 +204,47 @@ int
 fsig_devread(fsi_file_t *ffi, unsigned int sector, unsigned int offset,
     unsigned int bufsize, char *buf)
 {
-       uint64_t off = ffi->ff_fsi->f_off + ((uint64_t)sector * 512) + offset;
-       ssize_t bytes_read = 0;
+       off_t off;
+       ssize_t ret;
+       int n, r;
+       char tmp[SECTOR_SIZE];
+
+       off = ffi->ff_fsi->f_off + ((off_t)sector * SECTOR_SIZE) + offset;
+
+       /*
+        * Make reads from a raw disk sector-aligned. This is a requirement
+        * for NetBSD. Split the read up into to three parts to meet this
+        * requirement.
+        */
+
+       n = (off & (SECTOR_SIZE - 1));
+       if (n > 0) {
+               r = SECTOR_SIZE - n;
+               if (r > bufsize)
+                       r = bufsize;
+               ret = pread(ffi->ff_fsi->f_fd, tmp, SECTOR_SIZE, off - n);
+               if (ret < n + r)
+                       return (0);
+               memcpy(buf, tmp + n, r);
+               buf += r;
+               bufsize -= r;
+               off += r;
+       }
 
-       while (bufsize) {
-               ssize_t ret = pread(ffi->ff_fsi->f_fd, buf + bytes_read,
-                   bufsize, (off_t)off);
-               if (ret == -1)
+       n = (bufsize & ~(SECTOR_SIZE - 1));
+       if (n > 0) {
+               ret = pread(ffi->ff_fsi->f_fd, buf, n, off);
+               if (ret < n)
                        return (0);
-               if (ret == 0)
+               buf += n;
+               bufsize -= n;
+               off += n;
+       }
+       if (bufsize > 0) {
+               ret = pread(ffi->ff_fsi->f_fd, tmp, SECTOR_SIZE, off);
+               if (ret < bufsize)
                        return (0);
-
-               bytes_read += ret;
-               bufsize -= ret;
+               memcpy(buf, tmp, bufsize);
        }
 
        return (1);
index 800a9186559154a643be66a5783a18eeb836448c..bca481bc28cd9d1cba0af6b80a9d83b569154768 100644 (file)
@@ -44,7 +44,7 @@ typedef struct fsig_plugin_ops {
 } fsig_plugin_ops_t;
 
 #define        STAGE1_5
-#define FSYS_BUFLEN 0x8000
+#define FSYS_BUFLEN 0x40000
 #define        SECTOR_BITS 9
 #define        SECTOR_SIZE 0x200
 
index d62435c8dd824a463fbe0c704758802c28763c7d..5ee9d746b25502d9cab1add591495da6b0c752b1 100644 (file)
@@ -131,7 +131,10 @@ static int load_plugins(void)
        int err;
        int ret = -1;
 
-#ifdef __sun__
+#if defined(FSIMAGE_FSDIR)
+       if (fsdir == NULL)
+               fsdir = FSIMAGE_FSDIR;
+#elif defined(__sun__)
        if (fsdir == NULL)
                fsdir = "/usr/lib/fs";