From: Samuel Just Date: Tue, 1 Feb 2011 21:48:39 +0000 (-0800) Subject: FileStore: fix double close X-Git-Tag: v0.25~231^2~28 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=06fe1320efe7285f2bc76bcf81c19671f44a70df;p=ceph.git FileStore: fix double close curr_fd is already closed if cp == cur_seq. This second close occasionally ended up closing another thread's fd. The next open would tend to grab that fd in op_fd or current_fd which would then get closed by the other thread leaving op_fd or current_fd pointing to some random file (or a closed descriptor). Signed-off-by: Samuel Just --- diff --git a/src/os/FileStore.cc b/src/os/FileStore.cc index 5f30683836c8..f55ca4a69dc6 100644 --- a/src/os/FileStore.cc +++ b/src/os/FileStore.cc @@ -1132,7 +1132,8 @@ int FileStore::mount() int curr_fd = read_op_seq(current_op_seq_fn.c_str(), &curr_seq); assert(curr_fd >= 0); - close(curr_fd); + ::close(curr_fd); + curr_fd = -1; dout(10) << "*** curr_seq=" << curr_seq << " cp=" << cp << dendl; if (cp != curr_seq && !g_conf.osd_use_stale_snap) { @@ -1189,14 +1190,13 @@ int FileStore::mount() dout(10) << "mount rolled back to consistent snap " << cp << dendl; snaps.pop_back(); - assert(curr_fd >= 0); if (cp != curr_seq) { curr_fd = read_op_seq(current_op_seq_fn.c_str(), &curr_seq); /* we'll use the higher version from now on */ curr_seq = cp; write_op_seq(curr_fd, curr_seq); + ::close(curr_fd); } - close(curr_fd); } }