]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
common: add blkdev.{h,cc}
authorSage Weil <sage@newdream.net>
Tue, 17 Apr 2012 20:17:50 +0000 (13:17 -0700)
committerSage Weil <sage@newdream.net>
Tue, 17 Apr 2012 20:17:50 +0000 (13:17 -0700)
Signed-off-by: Sage Weil <sage@newdream.net>
src/common/blkdev.cc [new file with mode: 0644]
src/common/blkdev.h [new file with mode: 0644]

diff --git a/src/common/blkdev.cc b/src/common/blkdev.cc
new file mode 100644 (file)
index 0000000..22b0aa6
--- /dev/null
@@ -0,0 +1,40 @@
+#include <inttypes.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <errno.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/mount.h>
+#include <iostream>
+
+#include "acconfig.h"
+#include "include/compat.h"
+
+#if defined(__FreeBSD__)
+#include <sys/disk.h>
+#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, &sectors);
+  *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 (file)
index 0000000..a5b6471
--- /dev/null
@@ -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