From: Noah Watkins Date: Sun, 21 Jul 2013 01:41:39 +0000 (-0700) Subject: blkdev: support blkdev size query on osx X-Git-Tag: v0.73~35^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=268785ff0c0fb861f2db47c7eae933f6528193df;p=ceph.git blkdev: support blkdev size query on osx Support OSX, add checks for platform specific headers. Signed-off-by: Noah Watkins --- diff --git a/src/common/blkdev.cc b/src/common/blkdev.cc index b0dc0a54e9e..9c7240c0aac 100644 --- a/src/common/blkdev.cc +++ b/src/common/blkdev.cc @@ -1,40 +1,56 @@ -#include "include/int_types.h" - -#include -#include #include #include -#include -#include -#include - -#include "acconfig.h" -#include "include/compat.h" +#include +#include "include/int_types.h" -#if defined(__FreeBSD__) -#include -#endif +#ifdef __linux__ +#include int get_block_device_size(int fd, int64_t *psize) { - int ret = 0; - -#if defined(__FreeBSD__) - ret = ::ioctl(fd, DIOCGMEDIASIZE, psize); -#elif defined(__linux__) #ifdef BLKGETSIZE64 - // ioctl block device - ret = ::ioctl(fd, BLKGETSIZE64, psize); + int ret = ::ioctl(fd, BLKGETSIZE64, psize); #elif BLKGETSIZE - // hrm, try the 32 bit ioctl? unsigned long sectors = 0; - ret = ::ioctl(fd, BLKGETSIZE, §ors); + int ret = ::ioctl(fd, BLKGETSIZE, §ors); *psize = sectors * 512ULL; -#endif #else -#error "Compile error: we don't know how to get the size of a raw block device." -#endif /* !__FreeBSD__ */ +# error "Linux configuration error (get_block_device_size)" +#endif if (ret < 0) ret = -errno; return ret; } + +#elif defined(__APPLE__) +#include + +int get_block_device_size(int fd, int64_t *psize) +{ + unsigned long blocksize = 0; + int ret = ::ioctl(fd, DKIOCGETBLOCKSIZE, &blocksize); + if (!ret) { + unsigned long nblocks; + ret = ::ioctl(fd, DKIOCGETBLOCKCOUNT, &nblocks); + if (!ret) + *psize = (int64_t)nblocks * blocksize; + } + if (ret < 0) + ret = -errno; + return ret; +} + +#elif defined(__FreeBSD__) +#include + +int get_block_device_size(int fd, int64_t *psize) +{ + int ret = ::ioctl(fd, DIOCGMEDIASIZE, psize); + if (ret < 0) + ret = -errno; + return ret; +} + +#else +# error "Unable to query block device size: unsupported platform, please report." +#endif