block/raw-posix: use a character device if a block device is given
PATCH 1/1 block/raw-posix: use a character device if a block device is given
On NetBSD a userland process is better with the character device interface. In addition, a block device can't be opened twice; if a Xen backend opens it, qemu can't and vice-versa.
block/raw-posix.c +43 -0
@@ -136,12 +143,55 @@ static int64_t raw_getlength(BlockDriverState *bs);static int cdrom_reopen (BlockDriverState *bs);#endif +#if defined(__NetBSD__) +static int raw_normalize_devicepath (const char **filename) +{ +static char namebuf[PATH_MAX ]; +const char *dp, *fname; +struct stat sb; + + fname = *filename; + dp =strrchr (fname,'/' ); +if (lstat (fname, &sb) <0 ) { +fprintf (stderr,"%s: stat failed: %s\n" , + fname,strerror (errno)); +return -errno; + } + +if (!S_ISBLK (sb.st_mode)) { +return 0 ; + } + +if (dp ==NULL ) { +snprintf (namebuf,PATH_MAX ,"r%s" , fname); + }else { +snprintf (namebuf,PATH_MAX ,"%.*s/r%s" , + (int )(dp - fname), fname, dp +1 ); + } +fprintf (stderr,"%s is a block device" , fname); + *filename = namebuf; +fprintf (stderr,", using %s\n" , *filename); + +return 0 ; +} +#else +static int raw_normalize_devicepath (const char **filename) +{ +return 0 ; +} +#endif +static int raw_open_common (BlockDriverState *bs,const char *filename,int bdrv_flags,int open_flags) {BDRVRawState *s = bs->opaque;int fd, ret; + ret =raw_normalize_devicepath (&filename); +if (ret !=0 ) { +return ret; + } + s->open_flags = open_flags |O_BINARY ; s->open_flags &= ~O_ACCMODE ;if (bdrv_flags &BDRV_O_RDWR ) {
Signature · 6 lines
---to satisfy European Law for business letters: Advanced Micro Devices GmbH Einsteinring 24, 85689 Dornach b. Muenchen Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen Registergericht Muenchen, HRB Nr. 43632
Am 24.05.2011 11:30, schrieb Christoph Egger:
Quoted 4 lines
On NetBSD a userland process is better with the character device interface. In addition, a block device can't be opened twice; if a Xen backend opens it, qemu can't and vice-versa.
If you provide a Signed-off-by, I think this patch is ready to be committed.
Kevin
Quoted 63 lines
block/raw-posix.c +43
-0@@ -136,12 +143,55 @@ static int64_t raw_getlength(BlockDriverState *bs);static int cdrom_reopen (BlockDriverState *bs);#endif +#if defined(__NetBSD__) +static int raw_normalize_devicepath (const char **filename) +{ +static char namebuf[PATH_MAX ]; +const char *dp, *fname; +struct stat sb; + + fname = *filename; + dp =strrchr (fname,'/' ); +if (lstat (fname, &sb) <0 ) { +fprintf (stderr,"%s: stat failed: %s\n" , + fname,strerror (errno)); +return -errno; + } + +if (!S_ISBLK (sb.st_mode)) { +return 0 ; + } + +if (dp ==NULL ) { +snprintf (namebuf,PATH_MAX ,"r%s" , fname); + }else { +snprintf (namebuf,PATH_MAX ,"%.*s/r%s" , + (int )(dp - fname), fname, dp +1 ); + } +fprintf (stderr,"%s is a block device" , fname); + *filename = namebuf; +fprintf (stderr,", using %s\n" , *filename); + +return 0 ; +} +#else +static int raw_normalize_devicepath (const char **filename) +{ +return 0 ; +} +#endif +static int raw_open_common (BlockDriverState *bs,const char *filename,int bdrv_flags,int open_flags) {BDRVRawState *s = bs->opaque;int fd, ret; + ret =raw_normalize_devicepath (&filename); +if (ret !=0 ) { +return ret; + } + s->open_flags = open_flags |O_BINARY ; s->open_flags &= ~O_ACCMODE ;if (bdrv_flags &BDRV_O_RDWR ) {
Quoted 7 lines · Kevin Wolf
Am 24.05.2011 11:30, schrieb Christoph Egger:
Quoted 4 lines
On NetBSD a userland process is better with the character device interface. In addition, a block device can't be opened twice; if a Xen backend opens it, qemu can't and vice-versa.
If you provide a Signed-off-by, I think this patch is ready to be committed.
Quoted 67 lines
Kevin
Quoted 63 lines
block/raw-posix.c +43
-0@@ -136,12 +143,55 @@ static int64_t raw_getlength(BlockDriverState *bs);static int cdrom_reopen (BlockDriverState *bs);#endif +#if defined(__NetBSD__) +static int raw_normalize_devicepath (const char **filename) +{ +static char namebuf[PATH_MAX ]; +const char *dp, *fname; +struct stat sb; + + fname = *filename; + dp =strrchr (fname,'/' ); +if (lstat (fname,&sb)<0 ) { +fprintf (stderr,"%s: stat failed: %s\n" , + fname,strerror (errno)); +return -errno; + } + +if (!S_ISBLK (sb.st_mode)) { +return 0 ; + } + +if (dp ==NULL ) { +snprintf (namebuf,PATH_MAX ,"r%s" , fname); + }else { +snprintf (namebuf,PATH_MAX ,"%.*s/r%s" , + (int )(dp - fname), fname, dp +1 ); + } +fprintf (stderr,"%s is a block device" , fname); + *filename = namebuf; +fprintf (stderr,", using %s\n" , *filename); + +return 0 ; +} +#else +static int raw_normalize_devicepath (const char **filename) +{ +return 0 ; +} +#endif +static int raw_open_common (BlockDriverState *bs,const char *filename,int bdrv_flags,int open_flags) {BDRVRawState *s = bs->opaque;int fd, ret; + ret =raw_normalize_devicepath (&filename); +if (ret !=0 ) { +return ret; + } + s->open_flags = open_flags |O_BINARY ; s->open_flags&= ~O_ACCMODE ;if (bdrv_flags&BDRV_O_RDWR ) {
Signature · 6 lines
---to satisfy European Law for business letters: Advanced Micro Devices GmbH Einsteinring 24, 85689 Dornach b. Muenchen Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen Registergericht Muenchen, HRB Nr. 43632
Kevin Wolf
AppliedAm 25.05.2011 14:19, schrieb Christoph Egger:
Quoted 10 lines · Kevin Wolf
Quoted 7 lines
Am 24.05.2011 11:30, schrieb Christoph Egger:
Quoted 4 lines
On NetBSD a userland process is better with the character device interface. In addition, a block device can't be opened twice; if a Xen backend opens it, qemu can't and vice-versa.
If you provide a Signed-off-by, I think this patch is ready to be committed.
Signed-off-by Christoph Egger <[email protected]>
Thanks, applied to the block branch.
Kevin