From: Sage Weil Date: Wed, 28 May 2008 21:32:59 +0000 (-0700) Subject: mds: fix nested update in rename X-Git-Tag: v0.3~170^2~32 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2e7bc80e54739915beca4c76ef4418766ef57162;p=ceph.git mds: fix nested update in rename --- diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 831cee9e137e..33e9daccb88c 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -3405,22 +3405,20 @@ void Server::_rename_prepare(MDRequest *mdr, // prepare nesting, mtime updates if (mdr->is_master()) { - // sub off target int predirty_dir = silent ? 0:PREDIRTY_DIR; - if (!linkmerge && destdn->is_primary()) - mds->locker->predirty_nested(mdr, metablob, destdn->inode, destdn->dir, PREDIRTY_PRIMARY|predirty_dir, -1, + + // sub off target + if (!destdn->is_null()) + mds->locker->predirty_nested(mdr, metablob, destdn->inode, destdn->dir, + (destdn->is_primary() ? PREDIRTY_PRIMARY:0)|predirty_dir, -1, rollback); - if (destdn->dir == srcdn->dir) { - // same dir. don't update nested info or adjust counts. - mds->locker->predirty_nested(mdr, metablob, srcdn->inode, srcdn->dir, predirty_dir, 0, rollback); - } else { - // different dir. update nested accounting. - int flags = srcdn->is_primary() ? PREDIRTY_PRIMARY:0; - flags |= predirty_dir; - if (srcdn->is_auth()) - mds->locker->predirty_nested(mdr, metablob, srcdn->inode, srcdn->dir, flags, -1, rollback); - mds->locker->predirty_nested(mdr, metablob, srcdn->inode, destdn->dir, flags, 1, rollback); - } + + // move srcdn + int predirty_primary = (srcdn->is_primary() && srcdn->dir != destdn->dir) ? PREDIRTY_PRIMARY:0; + int flags = predirty_dir | predirty_primary; + if (srcdn->is_auth()) + mds->locker->predirty_nested(mdr, metablob, srcdn->inode, srcdn->dir, flags, -1, rollback); + mds->locker->predirty_nested(mdr, metablob, srcdn->inode, destdn->dir, flags, 1, rollback); } // add it all to the metablob