block: split raw_getlength
PATCH 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 +41 -17
@@ -628,8 +628,34 @@ 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;
@@ -640,10 +666,6 @@ static int64_t raw_getlength(BlockDriveint reopened =0 ;#endif #endif -#ifdef __sun__ -struct dk_minfo minfo; -int rv; -#endif int ret; ret =fd_open (bs);
@@ -687,22 +709,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 { 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 05.04.2010 16:12, 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]>
Seems to leave some duplicate #ifdef CONFIG_BSD around, but that code is a mess anyway and maybe it's the bit of additional ugliness that makes someone of the BSD people clean it up. Anyway, it's definitely an improvement over the current code.