block: split raw_getlength
PATCH v2 1/1 block: split raw_getlength
Split up the raw_getlength into separate generic, solaris and BSD versions to reduce the ifdef maze a bit. The BSD variant still is a complete maze, but to clean it up properly we'd need some people using the BSD variants to figure out what code is used for what variant.
block/raw-posix.c +42 -23
@@ -628,29 +628,48 @@ static int64_t raw_getlength(BlockDriver } elsereturn st.st_size; } -#else /* !__OpenBSD__ */ -static int64_t raw_getlength (BlockDriverState *bs) +#elif defined(__sun__) +static int64_t raw_getlength (BlockDriverState *bs) +{ +BDRVRawState *s = bs->opaque; +struct dk_minfo minfo; +int ret; + + ret =fd_open (bs); +if (ret <0 ) { +return ret; + } + +/* +* Use the DKIOCGMEDIAINFO ioctl to read the size. +*/ + ret =ioctl (s->fd,DKIOCGMEDIAINFO , &minfo); +if (ret !=-1 ) { +return minfo.dki_lbsize * minfo.dki_capacity; + } + +/* +* There are reports that lseek on some devices fails, but +* irc discussion said that contingency on contingency was overkill. +*/ +return lseek (s->fd,0 ,SEEK_END ); +} +#elif defined(CONFIG_BSD) +static int64_t raw_getlength (BlockDriverState *bs) {BDRVRawState *s = bs->opaque;int fd = s->fd;int64_t size; -#ifdef CONFIG_BSD struct stat sb;#if defined (__FreeBSD__) || defined(__FreeBSD_kernel__)int reopened =0 ;#endif -#endif -#ifdef __sun__ -struct dk_minfo minfo; -int rv; -#endif int ret; ret =fd_open (bs);if (ret <0 )return ret; -#ifdef CONFIG_BSD #if defined (__FreeBSD__) || defined(__FreeBSD_kernel__) again: #endif
@@ -685,24 +704,24 @@ again: } } #endif - } else -#endif -#ifdef __sun__ -/* -* use the DKIOCGMEDIAINFO ioctl to read the size. -*/ - rv =ioctl ( fd,DKIOCGMEDIAINFO , &minfo ); -if ( rv !=-1 ) { - size = minfo.dki_lbsize * minfo.dki_capacity; - } else /* there are reports that lseek on some devices -fails, but irc discussion said that contingency -on contingency was overkill */ -#endif - { + } else { size =lseek (fd,0 ,SEEK_END ); }return size; } +#else +static int64_t raw_getlength (BlockDriverState *bs) +{ +BDRVRawState *s = bs->opaque; +int ret; + + ret =fd_open (bs); +if (ret <0 ) { +return ret; + } + +return lseek (s->fd,0 ,SEEK_END ); +}#endif static int raw_create (const char *filename,QEMUOptionParameter *options)
Am 06.04.2010 19:13, schrieb Christoph Hellwig:
Quoted 7 lines
Split up the
raw_getlengthinto separate generic, solaris and BSD versions to reduce the ifdef maze a bit. The BSD variant still is a complete maze, but to clean it up properly we'd need some people using the BSD variants to figure out what code is used for what variant.Signed-off-by Christoph Hellwig <[email protected]>
This is the same logic that was already correct in v1, only superfluous #ifdefs are removed. Pushed both v2 patches to my block branch.
Kevin