]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os: fix zeroing first chunk of FileJournal
authorColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Fri, 4 Feb 2011 15:42:14 +0000 (07:42 -0800)
committerColin Patrick McCabe <cmccabe@alumni.cmu.edu>
Fri, 4 Feb 2011 16:27:36 +0000 (08:27 -0800)
Signed-off-by: Colin McCabe <colin.mccabe@dreamhost.com>
src/os/FileJournal.cc

index 71680affc99e7740c9eef8979c27c3bd7ecf8324..7b630cc75d0ac712edd1cb1730c60f4df58ffef3 100644 (file)
@@ -285,6 +285,7 @@ int FileJournal::_open_file(int64_t oldsize, blksize_t blksize,
 
 int FileJournal::create()
 {
+  char *buf = 0;
   int ret;
   buffer::ptr bp;
   dout(2) << "create " << fn << dendl;
@@ -315,20 +316,26 @@ int FileJournal::create()
   }
 
   // zero first little bit, too.
-  {
-    char z[block_size];
-    memset(z, 0, block_size);
-    if (TEMP_FAILURE_RETRY(::pwrite(fd, z, block_size, get_top())) < 0) {
-      ret = errno;
-      derr << "FileJournal::create: error zeroing first " << block_size
-          << " bytes " << cpp_strerror(ret) << dendl;
-      goto close_fd;
-    }
+  ret = posix_memalign((void**)&buf, block_size, block_size);
+  if (ret) {
+    derr << "FileJournal::create: failed to allocate " << block_size
+        << " bytes of memory: " << cpp_strerror(ret) << dendl;
+    goto close_fd;
+  }
+  memset(buf, 0, block_size);
+  if (TEMP_FAILURE_RETRY(::pwrite(fd, buf, block_size, get_top())) < 0) {
+    ret = errno;
+    derr << "FileJournal::create: error zeroing first " << block_size
+        << " bytes " << cpp_strerror(ret) << dendl;
+    goto free_buf;
   }
 
   dout(2) << "create done" << dendl;
   ret = 0;
 
+free_buf:
+  free(buf);
+  buf = 0;
 close_fd:
   if (TEMP_FAILURE_RETRY(::close(fd)) < 0) {
     ret = errno;