diff options
author | Sage Weil <sage@inktank.com> | 2013-06-21 11:53:29 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-06-21 11:53:29 -0700 |
commit | d572cf6f77418f217a5a8e37f1124dc566e24d0b (patch) | |
tree | 51fd965fec373047cfeb5ed2cde4aee6123ee06c | |
parent | 50957772c3582290331f69ba4a985b1cdf86834d (diff) | |
download | ceph-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.cc | 11 |
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; } } } |