summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-06-21 11:53:29 -0700
committerSage Weil <sage@inktank.com>2013-06-21 11:53:29 -0700
commitd572cf6f77418f217a5a8e37f1124dc566e24d0b (patch)
tree51fd965fec373047cfeb5ed2cde4aee6123ee06c
parent50957772c3582290331f69ba4a985b1cdf86834d (diff)
downloadceph-d572cf6f77418f217a5a8e37f1124dc566e24d0b.tar.gz
mds: fix iterator invalidation for backtrace removal
- Don't increment before we dereference! - We need to update the iterator before we delete the item. This code is changed in master, so this fix is for cuttlefish only. Signed-off-by: Sage Weil <sage@inktank.com> Reviewed-by: Greg Farnum <greg@inktank.com>
-rw-r--r--src/mds/journal.cc11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/mds/journal.cc b/src/mds/journal.cc
index b8139e3a05b..0453fc8f163 100644
--- a/src/mds/journal.cc
+++ b/src/mds/journal.cc
@@ -305,10 +305,13 @@ void LogSegment::queue_backtrace_update(CInode *inode, int64_t location, int64_t
void LogSegment::remove_pending_backtraces(inodeno_t ino, int64_t pool) {
elist<BacktraceInfo*>::iterator i = update_backtraces.begin();
- while(!i.end()) {
- ++i;
- if((*i)->bt.ino == ino && (*i)->location == pool) {
- delete (*i);
+ while (!i.end()) {
+ BacktraceInfo *bi = *i;
+ if (bi->bt.ino == ino && bi->location == pool) {
+ ++i;
+ delete bi;
+ } else {
+ ++i;
}
}
}