From 65614847588ed74949c302af0436bd520780dec9 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 17 Apr 2012 13:17:50 -0700 Subject: [PATCH] common: add blkdev.{h,cc} Signed-off-by: Sage Weil --- src/common/blkdev.cc | 40 ++++++++++++++++++++++++++++++++++++++++ src/common/blkdev.h | 6 ++++++ 2 files changed, 46 insertions(+) create mode 100644 src/common/blkdev.cc create mode 100644 src/common/blkdev.h diff --git a/src/common/blkdev.cc b/src/common/blkdev.cc new file mode 100644 index 0000000000000..22b0aa67b3eae --- /dev/null +++ b/src/common/blkdev.cc @@ -0,0 +1,40 @@ +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "acconfig.h" +#include "include/compat.h" + +#if defined(__FreeBSD__) +#include +#endif + +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); +#elif BLKGETSIZE + // hrm, try the 32 bit ioctl? + unsigned long sectors = 0; + 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__ */ + if (ret < 0) + ret = -errno; + return ret; +} diff --git a/src/common/blkdev.h b/src/common/blkdev.h new file mode 100644 index 0000000000000..a5b6471a51db6 --- /dev/null +++ b/src/common/blkdev.h @@ -0,0 +1,6 @@ +#ifndef __CEPH_COMMON_BLKDEV_H +#define __CEPH_COMMON_BLKDEV_H + +extern int get_block_device_size(int fd, int64_t *psize); + +#endif -- 2.39.5