From mboxrd@z Thu Jan 1 00:00:00 1970 From: Nick Piggin Subject: [patch] jfs: don't overwrite dentry name in d_revalidate Date: Thu, 11 Nov 2010 18:44:13 +1100 Message-ID: <20101111074413.GB10159@amd> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii To: Dave Kleikamp , jfs-discussion@lists.sourceforge.net, linux-fsdevel@vger.kernel.org Return-path: Received: from ipmail06.adl2.internode.on.net ([150.101.137.129]:41457 "EHLO ipmail06.adl2.internode.on.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757788Ab0KKHoQ (ORCPT ); Thu, 11 Nov 2010 02:44:16 -0500 Content-Disposition: inline Sender: linux-fsdevel-owner@vger.kernel.org List-ID: Instead use fatfs's method for dealing with negative dentries to preserve case, rather than overwrite dentry name in d_revalidate, which is a bit ugly and also gets in the way of doing lock-free path walking. Signed-off-by: Nick Piggin Index: linux-2.6/fs/jfs/namei.c =================================================================== --- linux-2.6.orig/fs/jfs/namei.c 2010-11-11 18:09:26.000000000 +1100 +++ linux-2.6/fs/jfs/namei.c 2010-11-11 18:18:53.000000000 +1100 @@ -18,6 +18,7 @@ */ #include +#include #include #include #include @@ -1597,21 +1598,47 @@ static int jfs_ci_compare(struct dentry goto out; } result = 0; +out: + return result; +} +static int jfs_ci_revalidate(struct dentry *dentry, struct nameidata *nd) +{ /* - * We want creates to preserve case. A negative dentry, a, that - * has a different case than b may cause a new entry to be created - * with the wrong case. Since we can't tell if a comes from a negative - * dentry, we blindly replace it with b. This should be harmless if - * a is not a negative dentry. + * This is not negative dentry. Always valid. + * + * Note, rename() to existing directory entry will have ->d_inode, + * and will use existing name which isn't specified name by user. + * + * We may be able to drop this positive dentry here. But dropping + * positive dentry isn't good idea. So it's unsupported like + * rename("filename", "FILENAME") for now. */ - memcpy((unsigned char *)a->name, b->name, a->len); -out: - return result; + if (dentry->d_inode) + return 1; + + /* + * This may be nfsd (or something), anyway, we can't see the + * intent of this. So, since this can be for creation, drop it. + */ + if (!nd) + return 0; + + /* + * Drop the negative dentry, in order to make sure to use the + * case sensitive name which is specified by user if this is + * for creation. + */ + if (!(nd->flags & (LOOKUP_CONTINUE | LOOKUP_PARENT))) { + if (nd->flags & (LOOKUP_CREATE | LOOKUP_RENAME_TARGET)) + return 0; + } + return 1; } const struct dentry_operations jfs_ci_dentry_operations = { .d_hash = jfs_ci_hash, .d_compare = jfs_ci_compare, + .d_revalidate = jfs_ci_revalidate, };