]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: use (robust) buffer::list::write_fd() to write to disk
authorSage Weil <sage@newdream.net>
Thu, 29 Apr 2010 17:43:24 +0000 (10:43 -0700)
committerSage Weil <sage@newdream.net>
Thu, 29 Apr 2010 17:43:55 +0000 (10:43 -0700)
src/common/buffer.cc
src/include/buffer.h
src/mon/MonitorStore.cc

index b2819dedcdb7bf6098f2c5f5e3b6d3d59f4208a5..03a8b2fa117d991604fedacec268d00c1dd14b91 100644 (file)
@@ -81,6 +81,13 @@ int buffer::list::write_file(const char *fn, int mode)
     cerr << "can't write " << fn << ": " << strerror_r(errno, buf, sizeof(buf)) << std::endl;
     return -errno;
   }
+  int err = write_fd(fd);
+  ::close(fd);
+  return err;
+}
+
+int buffer::list::write_fd(int fd)
+{
   for (std::list<ptr>::const_iterator it = _buffers.begin(); 
        it != _buffers.end(); 
        it++) {
@@ -88,18 +95,17 @@ int buffer::list::write_file(const char *fn, int mode)
     int left = it->length();
     while (left > 0) {
       int r = ::write(fd, c, left);
-      if (r < 0) {
-       ::close(fd);
+      if (r < 0)
        return -errno;
-      }
       c += r;
       left -= r;
     }
   }
-  ::close(fd);
   return 0;
 }
 
+
+
 void buffer::list::hexdump(std::ostream &out) const
 {
   out.setf(std::ios::right);
index f4d14ae84d4e13a825b87325db44c03ba87a1252..01316fa152203da9a183f2bd9994c1328376a462 100644 (file)
@@ -1134,6 +1134,7 @@ public:
     void hexdump(std::ostream &out) const;
     int read_file(const char *fn, bool silent=false);
     int write_file(const char *fn, int mode=0644);
+    int write_fd(int fd);
     __u32 crc32c(__u32 crc) {
       for (std::list<ptr>::const_iterator it = _buffers.begin(); 
           it != _buffers.end(); 
index 25132468f811b5d50c96695d3283d303c6c8c44a..f669d6ed3c2d2a6146752116cd64118183d43bda 100644 (file)
@@ -261,20 +261,7 @@ int MonitorStore::write_bl_ss(bufferlist& bl, const char *a, const char *b, bool
   }
   assert(fd >= 0);
   
-  // write data
-  for (list<bufferptr>::const_iterator it = bl.buffers().begin();
-       it != bl.buffers().end();
-       it++)  {
-    int r = ::write(fd, it->c_str(), it->length());
-    if (r != (int)it->length())
-      derr(0) << "put_bl_ss ::write() returned " << r << " not " << it->length() << dendl;
-    if (r < 0) {
-      char buf[80];
-      derr(0) << "put_bl_ss ::write() errored out, errno is " << strerror_r(errno, buf, sizeof(buf)) << dendl;
-      err = -errno;
-      break;
-    }
-  }
+  err = bl.write_fd(fd);
 
   if (sync && !err)
     ::fsync(fd);