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 <samuel.just@dreamhost.com>
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) {
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);
}
}