From: Colin Patrick McCabe Date: Thu, 10 Feb 2011 11:55:38 +0000 (-0800) Subject: os: convert some read/write uses to safe variants X-Git-Tag: v0.25~172 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b161e6a3cb8453264800251bfcf3556a205c95ea;p=ceph.git os: convert some read/write uses to safe variants Signed-off-by: Colin McCabe --- diff --git a/src/os/FileJournal.cc b/src/os/FileJournal.cc index ed65e37be54c..d46c5dcb50f6 100644 --- a/src/os/FileJournal.cc +++ b/src/os/FileJournal.cc @@ -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; diff --git a/src/os/FileStore.cc b/src/os/FileStore.cc index c29140102c5c..ceae3a7fa894 100644 --- a/src/os/FileStore.cc +++ b/src/os/FileStore.cc @@ -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 @@ -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;