From: Colin Patrick McCabe Date: Fri, 4 Feb 2011 17:47:29 +0000 (-0800) Subject: Merge branch 'wannoying2' X-Git-Tag: v0.25~220 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a87a3c116c23c13c15be3a090e87270e53acdd3e;p=ceph.git Merge branch 'wannoying2' Conflicts: src/os/FileJournal.cc --- a87a3c116c23c13c15be3a090e87270e53acdd3e diff --cc src/os/FileJournal.cc index ae1811b6b1ebb,22befd238b7fc..613ae83c2c3b5 --- a/src/os/FileJournal.cc +++ b/src/os/FileJournal.cc @@@ -255,11 -299,14 +299,15 @@@ int FileJournal::_open_file(int64_t old int FileJournal::create() { + char *buf = 0; ++ int64_t needed_space; + int ret; + buffer::ptr bp; dout(2) << "create " << fn << dendl; - int err = _open(true, true); - if (err < 0) - return err; + ret = _open(true, true); + if (ret < 0) + goto done; // write empty header memset(&header, 0, sizeof(header)); @@@ -284,23 -330,36 +331,45 @@@ } // zero first little bit, too. - char z[block_size]; - memset(z, 0, block_size); - ::pwrite(fd, z, block_size, get_top()); - - TEMP_FAILURE_RETRY(::close(fd)); - fd = -1; + 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; + } - int64_t needed_space = g_conf.osd_max_write_size << 20; ++ needed_space = g_conf.osd_max_write_size << 20; + needed_space += (2 * sizeof(entry_header_t)) + get_top(); + if (header.max_size - header.start < needed_space) { - derr << "OSD journal is not large enough to hold osd_max_write_size bytes!" - << dendl; - return -ENOSPC; ++ derr << "FileJournal::create: OSD journal is not large enough to hold " ++ << "osd_max_write_size bytes!" << dendl; ++ ret = -ENOSPC; ++ goto free_buf; + } + dout(2) << "create done" << dendl; - return 0; + ret = 0; + + free_buf: + free(buf); + buf = 0; + close_fd: + if (TEMP_FAILURE_RETRY(::close(fd)) < 0) { + ret = errno; + derr << "FileJournal::create: error closing fd: " << cpp_strerror(ret) + << dendl; + goto done; + } + done: + fd = -1; + return ret; } int FileJournal::open(uint64_t next_seq)