summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKuan Kai Chiu <big.chiu@bigtera.com>2013-04-18 14:43:25 +0800
committerGreg Farnum <greg@inktank.com>2013-04-18 10:38:05 -0700
commitf379ce37bfdcb3670f52ef47c02787f82e50e612 (patch)
tree80231dbda831252bd36a895b3caa11a577ebc780
parent7e4f80b12e86d0da9cedc1569c63d78cd27bb8ed (diff)
downloadceph-f379ce37bfdcb3670f52ef47c02787f82e50e612.tar.gz
mds: fix setting/removing xattrs on root
MDS crashes while journaling dirty root inode in handle_client_setxattr and handle_client_removexattr. We should use journal_dirty_inode to safely log root inode here. Signed-off-by: Kuan Kai Chiu <big.chiu@bigtera.com> Reviewed-by: Greg Farnum <greg@inktank.com>
-rw-r--r--src/mds/Server.cc6
1 files changed, 2 insertions, 4 deletions
diff --git a/src/mds/Server.cc b/src/mds/Server.cc
index 11ab834d856..1e62dd2dfba 100644
--- a/src/mds/Server.cc
+++ b/src/mds/Server.cc
@@ -3907,8 +3907,7 @@ void Server::handle_client_setxattr(MDRequest *mdr)
mdlog->start_entry(le);
le->metablob.add_client_req(req->get_reqid(), req->get_oldest_client_tid());
mdcache->predirty_journal_parents(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false);
- mdcache->journal_cow_inode(mdr, &le->metablob, cur);
- le->metablob.add_primary_dentry(cur->get_projected_parent_dn(), true, cur);
+ mdcache->journal_dirty_inode(mdr, &le->metablob, cur);
journal_and_reply(mdr, cur, 0, le, new C_MDS_inode_update_finish(mds, mdr, cur));
}
@@ -3964,8 +3963,7 @@ void Server::handle_client_removexattr(MDRequest *mdr)
mdlog->start_entry(le);
le->metablob.add_client_req(req->get_reqid(), req->get_oldest_client_tid());
mdcache->predirty_journal_parents(mdr, &le->metablob, cur, 0, PREDIRTY_PRIMARY, false);
- mdcache->journal_cow_inode(mdr, &le->metablob, cur);
- le->metablob.add_primary_dentry(cur->get_projected_parent_dn(), true, cur);
+ mdcache->journal_dirty_inode(mdr, &le->metablob, cur);
journal_and_reply(mdr, cur, 0, le, new C_MDS_inode_update_finish(mds, mdr, cur));
}