From: Yan, Zheng Date: Wed, 15 Jan 2014 01:23:52 +0000 (+0800) Subject: mds: fix CInode::get_dirfrags_under() X-Git-Tag: v0.78~165^2~21 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ee0ab2b733c6414c27e74f95ecc9643c1ba26478;p=ceph.git mds: fix CInode::get_dirfrags_under() make the function work when opened dirfrags don't match the dirfragtree. Signed-off-by: Yan, Zheng --- diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 82958ad3b4ff..b7c9772c9f0f 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -460,13 +460,31 @@ bool CInode::get_dirfrags_under(frag_t fg, list& ls) bool all = true; list fglist; dirfragtree.get_leaves_under(fg, fglist); - for (list::iterator p = fglist.begin(); - p != fglist.end(); - ++p) + for (list::iterator p = fglist.begin(); p != fglist.end(); ++p) if (dirfrags.count(*p)) ls.push_back(dirfrags[*p]); else all = false; + + if (all) + return all; + + fragtree_t tmpdft; + tmpdft.force_to_leaf(g_ceph_context, fg); + for (map::iterator p = dirfrags.begin(); p != dirfrags.end(); ++p) { + tmpdft.force_to_leaf(g_ceph_context, p->first); + if (fg.contains(p->first) && !dirfragtree.is_leaf(p->first)) + ls.push_back(p->second); + } + + all = true; + tmpdft.get_leaves_under(fg, fglist); + for (list::iterator p = fglist.begin(); p != fglist.end(); ++p) + if (!dirfrags.count(*p)) { + all = false; + break; + } + return all; }