Skip to contentSkip to conversation

libfsimage: portability fixes

PATCH In review Christoph Egger 4 participants 15 messages Mar 26, 2008 – Mar 28, 2008

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 libfsimage: portability fixes

Hi Keir!

Attached patch improves portability and adds fixes for NetBSD to libfsimage.

Signature · 12 lines
AMD Saxony, Dresden, Germany
Operating System Research Center

Legal Information:
AMD Saxony Limited Liability Company & Co. KG
Sitz (Geschäftsanschrift):
   Wilschdorfer Landstr. 101, 01109 Dresden, Deutschland
Registergericht Dresden: HRA 4896
vertretungsberechtigter Komplementär:
   AMD Saxony LLC (Sitz Wilmington, Delaware, USA)
Geschäftsführer der AMD Saxony LLC:
   Dr. Hans-R. Deppe, Thomas McCoy
tools/libfsimage/Makefile +1 -1
diff -r 966c04d42e94 tools/libfsimage/Makefile
@@ -2,7 +2,7 @@ include $(XEN_ROOT)/tools/Rules.mk
 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-%
tools/libfsimage/Rules.mk +1 -0
diff -r 966c04d42e94 tools/libfsimage/Rules.mk
@@ -11,6 +11,7 @@ FSDIR-$(CONFIG_SunOS)-x86_64 = $(PREFIX)
 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
tools/libfsimage/check-libext2fs +4 -2
diff -r 966c04d42e94 tools/libfsimage/check-libext2fs
@@ -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
tools/libfsimage/common/fsimage_grub.c +38 -10

57 lines not on this page · raw message

tools/libfsimage/common/fsimage_grub.h +1 -1
diff -r 966c04d42e94 tools/libfsimage/common/fsimage_grub.h
@@ -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
 
tools/libfsimage/common/fsimage_plugin.c +4 -1
diff -r 966c04d42e94 tools/libfsimage/common/fsimage_plugin.c
@@ -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";
 

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel

#1 lore raw

Christoph Egger writes ("[Xen-devel] [PATCH][TOOLS] libfsimage: portability fixes"):

tools/libfsimage/Makefile include $(XEN_ROOT)/tools/Rules.mk · line 5

Quoted 2 lines
tools/libfsimage/Makefile +1 -1
-SUBDIRS-y += $(shell env CC="$(CC)" ./check-libext2fs)
+SUBDIRS-y += $(shell $(SHELL) env CC="$(CC)" ./check-libext2fs)

What purpose does this serve ?

tools/libfsimage/common/fsimage_grub.c fsig_devread(fsi_file_t *ffi, unsigned i · line 218

Quoted 5 lines
tools/libfsimage/common/fsimage_grub.c +5 -0
+	/*
+	 * 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.
+	 */

Please forgive my ignorance: Does NetBSD offer a different (non-raw) device which does not have this requirement. If so perhaps we should be using it instead - if not, why not ?

Ian.

#2 lore raw
Quoted 1 line · On Thursday 27 March 2008 11:54:41 Ian Jackson wrote:

Christoph Egger writes ("[Xen-devel] [PATCH][TOOLS] libfsimage: portability

fixes"):

Quoted 4 lines

tools/libfsimage/Makefile include $(XEN_ROOT)/tools/Rules.mk · line 5

Quoted 2 lines
tools/libfsimage/Makefile +1 -1
-SUBDIRS-y += $(shell env CC="$(CC)" ./check-libext2fs)
+SUBDIRS-y += $(shell $(SHELL) env CC="$(CC)" ./check-libext2fs)

What purpose does this serve ?

Everytime when I submitted a patch where I changed /bin/bash to /bin/sh John Levon came up with a "Build is broken on Solaris" message. The fix was always the same: Use $(SHELL) as this is explicitely set for Solaris.

Quoted 9 lines

tools/libfsimage/common/fsimage_grub.c fsig_devread(fsi_file_t *ffi, unsigned i · line 218

Quoted 5 lines
tools/libfsimage/common/fsimage_grub.c +5 -0
+	/*
+	 * 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.
+	 */

Please forgive my ignorance: Does NetBSD offer a different (non-raw) device which does not have this requirement. If so perhaps we should be using it instead - if not, why not ?

The raw device pass requests directly to the underlying device, with only check/adjustments against the partition bounds. Especially it won't try to do read/modify/write for write requests, or expand the read if it's not sector-aligned.

The block device doesn't have this restriction, but allows only ONE open, therefore it is not usable by pygrub. It also has other side-effects (as it goes through the buffer cache), it's definitively not useable for the
NetBSD block device *backend* or for qemu-dm I/O.

Christoph

Signature · 12 lines
AMD Saxony, Dresden, Germany
Operating System Research Center

Legal Information:
AMD Saxony Limited Liability Company & Co. KG
Sitz (Geschäftsanschrift):
   Wilschdorfer Landstr. 101, 01109 Dresden, Deutschland
Registergericht Dresden: HRA 4896
vertretungsberechtigter Komplementär:
   AMD Saxony LLC (Sitz Wilmington, Delaware, USA)
Geschäftsführer der AMD Saxony LLC:
   Dr. Hans-R. Deppe, Thomas McCoy
#3 lore raw

Christoph Egger writes ("Re: [Xen-devel] [PATCH][TOOLS] libfsimage: portability fixes"):

Quoted 4 lines

Everytime when I submitted a patch where I changed /bin/bash to /bin/sh John Levon came up with a "Build is broken on Solaris" message. The fix was always the same: Use $(SHELL) as this is explicitely set for Solaris.

People whose /bin/sh is that badly broken deserve to lose IMO - that is to say, we shouldn't inconvenience other people for their benefit. We've had this conversation before.

But in any case your syntax was completely wrong and the script has #!/bin/sh at the top already so I don't see why this is relevant to you.

Quoted 10 lines · On Thursday 27 March 2008 11:54:41 Ian Jackson wrote:
Quoted 4 lines

Christoph Egger writes ("[Xen-devel] [PATCH][TOOLS] libfsimage: portability Please forgive my ignorance: Does NetBSD offer a different (non-raw) device which does not have this requirement. If so perhaps we should be using it instead - if not, why not ?

The raw device pass requests directly to the underlying device, with only check/adjustments against the partition bounds. Especially it won't try to do read/modify/write for write requests, or expand the read if it's not sector-aligned.

Yes, but these aren't desirable in this case.

Quoted 4 lines

The block device doesn't have this restriction, but allows only ONE open, therefore it is not usable by pygrub. It also has other side-effects (as it goes through the buffer cache), it's definitively not useable for the
NetBSD block device *backend* or for qemu-dm I/O.

The problem is that pygrub wants to open the disk multiple times ? Or is it that xend has already plumbed in the device to qemu-dm or what have you, and that prevents a second open ?

There doesn't seem to me to be any problem with pygrub's accesses going through the buffer cache.

I accept that it's not suitable for use as the full block backend, but perhaps the answer is to pass pygrub an edited version of the device name, or have pygrub edit it itself. If we were to use the non-raw device for pygrub and the raw device for qemu-dm, would things work ?

Ian.

#4 lore raw
Quoted 7 lines · Ian Jackson

Christoph Egger writes ("Re: [Xen-devel] [PATCH][TOOLS] libfsimage: portability fixes"):

Quoted 4 lines

Everytime when I submitted a patch where I changed /bin/bash to /bin/sh John Levon came up with a "Build is broken on Solaris" message. The fix was always the same: Use $(SHELL) as this is explicitely set for Solaris.

People whose /bin/sh is that badly broken deserve to lose IMO - that

Putting it mildly, I don't think that disabling an important platform because you have a bee in your bonnet about $(SHELL) is a sensible implementation choice.

john

#5 lore raw
In reply to Ian Jackson
Quoted 1 line · On Thursday 27 March 2008 16:36:45 Ian Jackson wrote:

Christoph Egger writes ("Re: [Xen-devel] [PATCH][TOOLS] libfsimage:

portability fixes"):

Quoted 26 lines
Quoted 4 lines

Everytime when I submitted a patch where I changed /bin/bash to /bin/sh John Levon came up with a "Build is broken on Solaris" message. The fix was always the same: Use $(SHELL) as this is explicitely set for Solaris.

People whose /bin/sh is that badly broken deserve to lose IMO - that is to say, we shouldn't inconvenience other people for their benefit. We've had this conversation before.

But in any case your syntax was completely wrong and the script has #!/bin/sh at the top already so I don't see why this is relevant to you.

Quoted 10 lines · On Thursday 27 March 2008 11:54:41 Ian Jackson wrote:
Quoted 4 lines

Christoph Egger writes ("[Xen-devel] [PATCH][TOOLS] libfsimage:
portability Please forgive my ignorance: Does NetBSD offer a different (non-raw) device which does not have this requirement. If so perhaps we should be using it instead - if not, why not ?

The raw device pass requests directly to the underlying device, with only check/adjustments against the partition bounds. Especially it won't try to do read/modify/write for write requests, or expand the read if it's not sector-aligned.

Yes, but these aren't desirable in this case.

Quoted 8 lines
Quoted 4 lines

The block device doesn't have this restriction, but allows only ONE open, therefore it is not usable by pygrub. It also has other side-effects (as it goes through the buffer cache), it's definitively not useable for
the NetBSD block device *backend* or for qemu-dm I/O.

The problem is that pygrub wants to open the disk multiple times ? Or is it that xend has already plumbed in the device to qemu-dm or what have you, and that prevents a second open ?

The block backend opens the block device before pygrub is started. So, when you have "disk = [ 'phy:/dev/bla,blub,w' ]" in your setup you get an EBUSY when pygrub tries to open the block device.

Quoted 4 lines

I accept that it's not suitable for use as the full block backend, but perhaps the answer is to pass pygrub an edited version of the device name, or have pygrub edit it itself. If we were to use the non-raw device for pygrub and the raw device for qemu-dm, would things work ?

I don't think it would work without a lot of work on the backend device, if it is possible at all. For now, the backend assumes it was given a block device.

Christoph

Signature · 12 lines
AMD Saxony, Dresden, Germany
Operating System Research Center

Legal Information:
AMD Saxony Limited Liability Company & Co. KG
Sitz (Geschäftsanschrift):
   Wilschdorfer Landstr. 101, 01109 Dresden, Deutschland
Registergericht Dresden: HRA 4896
vertretungsberechtigter Komplementär:
   AMD Saxony LLC (Sitz Wilmington, Delaware, USA)
Geschäftsführer der AMD Saxony LLC:
   Dr. Hans-R. Deppe, Thomas McCoy
#6 lore raw

Christoph Egger writes ("Re: [Xen-devel] [PATCH][TOOLS] libfsimage: portability fixes"):

Quoted 9 lines · On Thursday 27 March 2008 16:36:45 Ian Jackson wrote:
Quoted 4 lines

I accept that it's not suitable for use as the full block backend, but perhaps the answer is to pass pygrub an edited version of the device name, or have pygrub edit it itself. If we were to use the non-raw device for pygrub and the raw device for qemu-dm, would things work ?

I don't think it would work without a lot of work on the backend device, if it is possible at all. For now, the backend assumes it was given a block device.

I'm afraid I don't follow this at all. (What does `block device' stand in opposition to?)

Is it possible for pygrub to open the non-raw device while the block backend is using the raw device ? Or do you mean that the block backend is already using the non-raw device and that you're having pygrub use the raw device just so that you are able to use the same underlying storage object twice simultaneously ?

Ian.

#7 lore raw
Quoted 1 line · On Friday 28 March 2008 11:42:15 Ian Jackson wrote:

Christoph Egger writes ("Re: [Xen-devel] [PATCH][TOOLS] libfsimage:

portability fixes"):

Quoted 6 lines
Quoted 6 lines · On Thursday 27 March 2008 16:36:45 Ian Jackson wrote:
Quoted 4 lines

I accept that it's not suitable for use as the full block backend, but perhaps the answer is to pass pygrub an edited version of the device name, or have pygrub edit it itself. If we were to use the non-raw device for pygrub and the raw device for qemu-dm, would things work ?

Quoted 6 lines
Quoted 3 lines

I don't think it would work without a lot of work on the backend device, if it is possible at all. For now, the backend assumes it was given a block device.

I'm afraid I don't follow this at all. (What does `block device' stand in opposition to?)

"block device" is what is given in the guest setup with "disk = [ 'phy:/dev/wd0a,0x1,w' ]" (NetBSD syntax) "disk = [ 'phy:/dev/hda1,hda,w' ]" (Linux syntax)

Quoted 5 lines

Is it possible for pygrub to open the non-raw device while the block backend is using the raw device ? Or do you mean that the block backend is already using the non-raw device and that you're having pygrub use the raw device just so that you are able to use the same underlying storage object twice simultaneously ?

With changeset 17300, pygrub uses a raw device on NetBSD only. The block backend already opened the block device when pygrub opens the raw device.

Christoph

Signature · 12 lines
AMD Saxony, Dresden, Germany
Operating System Research Center

Legal Information:
AMD Saxony Limited Liability Company & Co. KG
Sitz (Geschäftsanschrift):
   Wilschdorfer Landstr. 101, 01109 Dresden, Deutschland
Registergericht Dresden: HRA 4896
vertretungsberechtigter Komplementär:
   AMD Saxony LLC (Sitz Wilmington, Delaware, USA)
Geschäftsführer der AMD Saxony LLC:
   Dr. Hans-R. Deppe, Thomas McCoy
#8 lore raw

Christoph Egger writes ("Re: [Xen-devel] [PATCH][TOOLS] libfsimage: portability fixes"):

Quoted 13 lines · On Friday 28 March 2008 11:42:15 Ian Jackson wrote:
Quoted 1 line

Christoph Egger writes ("Re: [Xen-devel] [PATCH][TOOLS] libfsimage:

portability fixes"):

Quoted 10 lines
Quoted 9 lines · On Thursday 27 March 2008 16:36:45 Ian Jackson wrote:
Quoted 4 lines

I accept that it's not suitable for use as the full block backend, but perhaps the answer is to pass pygrub an edited version of the device name, or have pygrub edit it itself. If we were to use the non-raw device for pygrub and the raw device for qemu-dm, would things work ?

I don't think it would work without a lot of work on the backend device, if it is possible at all. For now, the backend assumes it was given a block device.

Quoted 6 lines
Quoted 2 lines

I'm afraid I don't follow this at all. (What does `block device' stand in opposition to?)

"block device" is what is given in the guest setup with "disk = [ 'phy:/dev/wd0a,0x1,w' ]" (NetBSD syntax) "disk = [ 'phy:/dev/hda1,hda,w' ]" (Linux syntax)

Yes, I know that. But you say `the backend assumes it was given a block device' and I was suggesting giving it the raw block device so obviously we are talking at cross purposes.

Do you mean that it would somehow be difficult for the block backend to talk to /dev/rwd0a instead ? Surely that would be more appropriate in any case.

Quoted 9 lines
Quoted 5 lines

Is it possible for pygrub to open the non-raw device while the block backend is using the raw device ? Or do you mean that the block backend is already using the non-raw device and that you're having pygrub use the raw device just so that you are able to use the same underlying storage object twice simultaneously ?

With changeset 17300, pygrub uses a raw device on NetBSD only. The block backend already opened the block device when pygrub opens the raw device.

Yes, so you said already. But you haven't answered my question.

Ian.

#9 lore raw
In reply to Christoph Egger

Christoph Egger writes ("[Xen-devel] [PATCH][TOOLS] libfsimage: portability fixes"):

tools/libfsimage/check-libext2fs int main() · line 14

Quoted 4 lines

-${CC:-gcc} -o ext2-test ext2-test.c -lext2fs >/dev/null 2>&1

tools/libfsimage/check-libext2fs +3 -0
+if test -z ${CC}; then CC="gcc"; fi
+${CC} -o ext2-test ext2-test.c -lext2fs >/dev/null 2>&1
+

This also seems to serve no purpose as far as I can tell.

Ian.

#10 lore raw
Quoted 1 line · On Thursday 27 March 2008 12:05:30 Ian Jackson wrote:

Christoph Egger writes ("[Xen-devel] [PATCH][TOOLS] libfsimage: portability

fixes"):

Quoted 6 lines

tools/libfsimage/check-libext2fs int main() · line 14

Quoted 4 lines

-${CC:-gcc} -o ext2-test ext2-test.c -lext2fs >/dev/null 2>&1

tools/libfsimage/check-libext2fs +3 -0
+if test -z ${CC}; then CC="gcc"; fi
+${CC} -o ext2-test ext2-test.c -lext2fs >/dev/null 2>&1
+

This also seems to serve no purpose as far as I can tell.

This is for the ancient Solaris /bin/sh. If John Levon confirms that this and that the $(SHELL) mentioned in your other mail
are NOT needed/required to not break Solaris, you can undo these two changes.

Christoph

Signature · 12 lines
AMD Saxony, Dresden, Germany
Operating System Research Center

Legal Information:
AMD Saxony Limited Liability Company & Co. KG
Sitz (Geschäftsanschrift):
   Wilschdorfer Landstr. 101, 01109 Dresden, Deutschland
Registergericht Dresden: HRA 4896
vertretungsberechtigter Komplementär:
   AMD Saxony LLC (Sitz Wilmington, Delaware, USA)
Geschäftsführer der AMD Saxony LLC:
   Dr. Hans-R. Deppe, Thomas McCoy
#11 lore raw
Quoted 10 lines · Christoph Egger
Quoted 1 line · On Thursday 27 March 2008 12:05:30 Ian Jackson wrote:

Christoph Egger writes ("[Xen-devel] [PATCH][TOOLS] libfsimage: portability

fixes"):

Quoted 6 lines

tools/libfsimage/check-libext2fs int main() · line 14

Quoted 4 lines

-${CC:-gcc} -o ext2-test ext2-test.c -lext2fs >/dev/null 2>&1

tools/libfsimage/check-libext2fs +3 -0
+if test -z ${CC}; then CC="gcc"; fi
+${CC} -o ext2-test ext2-test.c -lext2fs >/dev/null 2>&1
+

This also seems to serve no purpose as far as I can tell.

Quoted 3 lines

This is for the ancient Solaris /bin/sh. If John Levon confirms that this and that the $(SHELL) mentioned in your other mail
are NOT needed/required to not break Solaris, you can undo these two changes.

It's not needed for the Bourne shell, no.

regards,
john

#12 lore raw
In reply to Christoph Egger

Christoph Egger wrote: [Wed Mar 26 2008, 10:14:33AM EDT]

tools/libfsimage/Makefile include $(XEN_ROOT)/tools/Rules.mk · line 5

Quoted 9 lines

diff -r 966c04d42e94 tools/libfsimage/Makefile

tools/libfsimage/Makefile +1 -1
@@ -2,7 +2,7 @@ include $(XEN_ROOT)/tools/Rules.mk
 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)

As Ian asked, what was this intended to do? It's certainly wrong:

$ /bin/sh env CC=gcc ./check-libext2fs 
/usr/bin/env: /usr/bin/env: cannot execute binary file
Quoted 10 lines

diff -r 966c04d42e94 tools/libfsimage/check-libext2fs

tools/libfsimage/check-libext2fs +1 -1
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
 
 cat >ext2-test.c <<EOF
 #include <ext2fs/ext2fs.h>

tools/libfsimage/check-libext2fs int main() · line 17

Quoted 10 lines
tools/libfsimage/check-libext2fs +3 -1
@@ -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

This prevents check-libext2fs from being run outside the Makefile. It will silently fail compilation if $CC isn't set. For Bourne shell and cross-platform compatibility, it should be:

${CC-cc} -o ext2-test ext2-test.c -lext2fs >/dev/null 2>&1

Aron

#13 lore raw

Aron Griffis writes ("Re: [Xen-devel] [PATCH][TOOLS] libfsimage: portability fixes"):

Quoted 8 lines

Christoph Egger wrote: [Wed Mar 26 2008, 10:14:33AM EDT]

Quoted 3 lines

-${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

This prevents check-libext2fs from being run outside the Makefile. It will silently fail compilation if $CC isn't set. For Bourne shell and cross-platform compatibility, it should be:

${VARIABLE:-defaultvalue} is in SuSv3 (section 2.6.2, `Use Default Values') and has been in many previous standards. Any system whose /bin/sh can't cope is hopelessly broken.

Quoted 1 line

${CC-cc} -o ext2-test ext2-test.c -lext2fs >/dev/null 2>&1

However, in this case, ${VARIABLE-defaultvalue} is an adequate substitute so we should use that. With a default of gcc, since without gcc you're doomed anyway.

Ian.

#14 lore raw

Ian Jackson wrote: [Thu Mar 27 2008, 11:13:41AM EDT]

Quoted 3 lines

${VARIABLE:-defaultvalue} is in SuSv3 (section 2.6.2, `Use Default Values') and has been in many previous standards. Any system whose /bin/sh can't cope is hopelessly broken.

Ah, great.

Quoted 5 lines
Quoted 1 line

${CC-cc} -o ext2-test ext2-test.c -lext2fs >/dev/null 2>&1

However, in this case, ${VARIABLE-defaultvalue} is an adequate substitute so we should use that. With a default of gcc, since without gcc you're doomed anyway.

Okay, thanks.