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));
}
// 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)