]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
filejournal: fix unchecked returns, modularize
authorColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Fri, 4 Feb 2011 12:24:27 +0000 (04:24 -0800)
committerColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Fri, 4 Feb 2011 12:24:27 +0000 (04:24 -0800)
Signed-off-by: Colin McCabe <colin.mccabe@dreamhost.com>
src/os/FileJournal.cc

index 5d26e967d4d081515dd62301decac692658dc58e..568b333be8990f5e2ddfa04860891805f04bd9c2 100644 (file)
@@ -145,6 +145,42 @@ int FileJournal::_open_block_device()
   return 0;
 }
 
+static int get_kernel_version(int *a, int *b, int *c)
+{
+  int ret;
+  char buf[128];
+  memset(buf, 0, sizeof(buf));
+  int fd = TEMP_FAILURE_RETRY(::open("/proc/version", O_RDONLY));
+  if (fd < 0) {
+    ret = errno;
+    derr << "get_kernel_version: failed to open /proc/version: "
+        << cpp_strerror(ret) << dendl;
+    goto out;
+  }
+  ret = TEMP_FAILURE_RETRY(::read(fd, buf, sizeof(buf) - 1));
+  if (ret < 0) {
+    ret = errno;
+    derr << "get_kernel_version: failed to read from /proc/version: "
+        << cpp_strerror(ret) << dendl;
+    goto close_fd;
+  }
+
+  if (sscanf(buf, "Linux version %d.%d.%d", a, b, c) != 3) {
+    derr << "get_kernel_version: failed to parse string: '"
+        << buf << "'" << dendl;
+    ret = EIO;
+    goto close_fd;
+  }
+
+  dout(0) << " kernel version is " << *a <<"." << *b << "." << *c << dendl;
+  ret = 0;
+
+close_fd:
+  TEMP_FAILURE_RETRY(::close(fd));
+out:
+  return ret;
+}
+
 void FileJournal::_check_disk_write_cache() const
 {
   if (geteuid() != 0) {
@@ -178,18 +214,12 @@ void FileJournal::_check_disk_write_cache() const
     int on;
     if (sscanf(s, " write-caching =  %d", &on) == 1) {
       if (on) {
-
-       // check kenrel version
-       char buf[40];
-       int fd = ::open("/proc/version", O_RDONLY);
-       ::read(fd, buf, 39);
-       buf[39] = 0;
-       ::close(fd);
-
-       int b, c;
-       int r = sscanf(buf, "Linux version 2.%d.%d", &b, &c);
-       dout(0) << " kernel version is 2." << b << "." << c << dendl;
-       if (r == 2 &&
+       int a, b ,c;
+       if (get_kernel_version(&a, &b, &c)) {
+         derr << "error: failed to get kernel version" << dendl;
+         a = b = c = 0;
+       }
+       if (a >= 2 &&
            b >= 6 &&
            c >= 33) {
          // a-ok