On Mon, Nov 30, 2009 at 01:26:53AM -0500, Erez Zadok wrote: > In message <1256152779-10054-14-git-send-email-vaurora@xxxxxxxxxx>, Valerie Aurora writes: > > From: Jan Blunck <jblunck@xxxxxxx> > > > > Add support for whiteout dentries to tmpfs. > > Shouldn't you CC Hugh Dickins here? He's probably best positioned to review > the changes in mm/shmem.c. Thanks, I added him and linux-mm. > > XXX - Not sure this is the right patch to put the code for supporting > > whiteouts in d_genocide(). > > > > Signed-off-by: Jan Blunck <jblunck@xxxxxxx> > > Signed-off-by: David Woodhouse <dwmw2@xxxxxxxxxxxxx> > > Signed-off-by: Valerie Aurora <vaurora@xxxxxxxxxx> > > --- > > fs/dcache.c | 3 +- > > mm/shmem.c | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++++------ > > 2 files changed, 137 insertions(+), 15 deletions(-) > > > > diff --git a/fs/dcache.c b/fs/dcache.c > > index 0fcae4b..1fae1df 100644 > > --- a/fs/dcache.c > > +++ b/fs/dcache.c > > @@ -2280,7 +2280,8 @@ resume: > > struct list_head *tmp = next; > > struct dentry *dentry = list_entry(tmp, struct dentry, d_u.d_child); > > next = tmp->next; > > - if (d_unhashed(dentry)||!dentry->d_inode) > > + if (d_unhashed(dentry)||(!dentry->d_inode && > > + !d_is_whiteout(dentry))) > > I think this d_genocide patch should go elsewhere. What does it have to do > with tmpfs? Without this patch, you can't unmount a tmpfs file system with whiteouts. d_genocide() is called by kill_litter_super() to evict all the dcache entries used by tmpfs. > Also, is your logic above correct? If I understood d_genocide correctly, > then the code you changed attempts to skip over dentries for which > d_genocide has no work to do, like unhashed and negative dentries. So I > assume it should also skip over whiteout dentries. Your condition is > > if (d_unhashed(dentry) || (!dentry->d_inode && !d_is_whiteout(dentry))) > > but perhaps it needs to be > > if (d_unhashed(dentry) || !dentry->d_inode || d_is_whiteout(dentry)) > > No? > > Either way, you may want to document any complex conditional that may be > confusing to parse. This is a good thing to document. What we're dealing with here is dropping the ref count on persistent dentries. How about this comment? /* * Skip unhashed and negative dentries, but process * positive dentries and whiteouts. A whiteout looks * kind of like a negative dentry for purposes of * lookup, but it has an extra pinning ref count * because it can't be evicted like a negative dentry * can. What we care about here is ref counts - and * we need to drop the ref count on a whiteout before * we can evict it. */ if (d_unhashed(dentry)||(!dentry->d_inode && !d_is_whiteout(dentry))) continue; -VAL -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html