]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os: convert some read/write uses to safe variants
authorColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Thu, 10 Feb 2011 11:55:38 +0000 (03:55 -0800)
committerColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Thu, 10 Feb 2011 12:58:47 +0000 (04:58 -0800)
Signed-off-by: Colin McCabe <colin.mccabe@dreamhost.com>
src/os/FileJournal.cc
src/os/FileStore.cc

index ed65e37be54cc8eef72ff1071f3650f165c5d819..d46c5dcb50f63a5ceef6ae2a0411eab06a9b9b9f 100644 (file)
@@ -14,6 +14,7 @@
 
 #include "config.h"
 #include "common/errno.h"
+#include "common/safe_io.h"
 #include "FileJournal.h"
 #include "include/color.h"
 
@@ -158,9 +159,8 @@ static int get_kernel_version(int *a, int *b, int *c)
         << cpp_strerror(ret) << dendl;
     goto out;
   }
-  ret = TEMP_FAILURE_RETRY(::read(fd, buf, sizeof(buf) - 1));
+  ret = safe_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;
@@ -1063,8 +1063,12 @@ void FileJournal::wrap_read_bl(off64_t& pos, int64_t olen, bufferlist& bl)
 #endif
     
     bufferptr bp = buffer::create(len);
-    int r = ::read(fd, bp.c_str(), len);
-    assert(r == len);
+    int r = safe_read_exact(fd, bp.c_str(), len);
+    if (r) {
+      derr << "FileJournal::wrap_read_bl: safe_read_exact returned "
+          << r << dendl;
+      ceph_abort();
+    }
     bl.push_back(bp);
     pos += len;
     olen -= len;
index c29140102c5c4e31ea0807f1de2e3f620b787806..ceae3a7fa894c6f48e735d547584660036139007 100644 (file)
@@ -27,6 +27,7 @@
 #include "common/Timer.h"
 #include "common/errno.h"
 #include "common/run_cmd.h"
+#include "common/safe_io.h"
 
 #define __STDC_FORMAT_MACROS
 #include <inttypes.h>
@@ -776,6 +777,7 @@ out:
 int FileStore::mkjournal()
 {
   // read fsid
+  int ret;
   char fn[PATH_MAX];
   snprintf(fn, sizeof(fn), "%s/fsid", basedir.c_str());
   int fd = ::open(fn, O_RDONLY, 0644);
@@ -784,11 +786,11 @@ int FileStore::mkjournal()
     derr << "FileStore::mkjournal: open error: " << cpp_strerror(err) << dendl;
     return -err;
   }
-  if (TEMP_FAILURE_RETRY(::read(fd, &fsid, sizeof(fsid))) < 0) {
-    int err = errno;
-    derr << "FileStore::mkjournal: read error: " << cpp_strerror(err) << dendl;
+  ret = safe_read(fd, &fsid, sizeof(fsid));
+  if (ret < 0) {
+    derr << "FileStore::mkjournal: read error: " << cpp_strerror(ret) << dendl;
     TEMP_FAILURE_RETRY(::close(fd));
-    return -err;
+    return ret;
   }
   if (TEMP_FAILURE_RETRY(::close(fd))) {
     int err = errno;
@@ -796,7 +798,7 @@ int FileStore::mkjournal()
     return -err;
   }
 
-  int ret = 0;
+  ret = 0;
 
   open_journal();
   if (journal) {
@@ -1082,20 +1084,16 @@ int FileStore::read_op_seq(const char *fn, uint64_t *seq)
   int op_fd = ::open(current_op_seq_fn.c_str(), O_CREAT|O_RDWR, 0644);
   if (op_fd < 0)
     return -errno;
-
   char s[40];
-  int l = ::read(op_fd, s, sizeof(s));
-  if (l >= 0) {
-    s[l] = 0;
-    *seq = atoll(s);
-  } else {
-    int err = errno;
-    dout(0) << "error reading " << current_op_seq_fn << ": "
-     << cpp_strerror(err) << dendl;
-    ::close(op_fd);
-    return -err;
+  memset(s, 0, sizeof(s));
+  int ret = safe_read(op_fd, s, sizeof(s) - 1);
+  if (ret < 0) {
+    derr << "error reading " << current_op_seq_fn << ": "
+        << cpp_strerror(ret) << dendl;
+    TEMP_FAILURE_RETRY(::close(op_fd));
+    return ret;
   }
-
+  *seq = atoll(s);
   return op_fd;
 }
 
@@ -1145,8 +1143,8 @@ int FileStore::mount()
   }
 
   fsid = 0;
-  if (TEMP_FAILURE_RETRY(::read(fsid_fd, &fsid, sizeof(fsid))) < 0) {
-    ret = -errno;
+  ret = safe_read_exact(fsid_fd, &fsid, sizeof(fsid));
+  if (ret) {
     derr << "FileStore::mount: error reading fsid_fd: " << cpp_strerror(ret)
         << dendl;
     goto close_fsid_fd;