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.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Christoph Hellwig 2010-04-06 19:13:44 +02:00 committed by Kevin Wolf
parent 6db956039d
commit 50779cc264

View File

@ -627,21 +627,41 @@ static int64_t raw_getlength(BlockDriverState *bs)
} else
return st.st_size;
}
#else /* !__OpenBSD__ */
#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;
@ -649,7 +669,6 @@ static int64_t raw_getlength(BlockDriverState *bs)
if (ret < 0)
return ret;
#ifdef CONFIG_BSD
#if defined (__FreeBSD__) || defined(__FreeBSD_kernel__)
again:
#endif
@ -684,24 +703,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)