On Fri, Feb 18, 2011 at 03:21:01PM -0600, Alex Elder wrote: > Move the check for short names out of is_special_dirent() and into > generate_obfuscated_name(). That way the check is more directly > associated with the algorithm that requires it. > > Similarly, move the check for inode == 0, since that case has to do > with storing extended attributes (not files) in the name table. > > As a result, is_special_dirent() is really only focused on whether a > given file is in the lost+found directory. Rename the function to > reflect its more specific purpose. > > Signed-off-by: Alex Elder <aelder@xxxxxxx> > > Updated: > - The previous version did not properly skip the "lost+found" > directory itself; this one does. > - Created a new definition representing the name of the orphanage > directory. Encapsulate recognizing that directory into a new > macro, is_lost_found(). > - Removed casts that eliminate a compile warning in calls to > libxfs_da_hashname(); will do them separately later if needed. > > --- > db/metadump.c | 76 +++++++++++++++++++++++++++++++++++++++------------------- > 1 file changed, 52 insertions(+), 24 deletions(-) > > Index: b/db/metadump.c > =================================================================== > --- a/db/metadump.c > +++ b/db/metadump.c > @@ -1,5 +1,5 @@ > /* > - * Copyright (c) 2007 Silicon Graphics, Inc. > + * Copyright (c) 2007, 2011 SGI > * All Rights Reserved. > * > * This program is free software; you can redistribute it and/or > @@ -377,40 +377,56 @@ random_filename_char(void) > return c; > } > > +/* > + * Determine whether a name is one we shouldn't obfuscate because > + * it's an orphan (or the "lost+found" directory itself). Note > + * "cur_ino" is the inode for the directory currently being > + * processed. > + * > + * Returns 1 if the name should NOT be obfuscated or 0 otherwise. > + */ > +#define is_lost_found(mnt, dir_ino, nmlen, nm) \ > + ((dir_ino) == (mnt)->m_sb.sb_rootino && \ > + (nmlen) == ORPHANAGE_LEN && \ > + !memcmp((nm), ORPHANAGE, ORPHANAGE_LEN)) Perhaps a static inline function? > + > +#define ORPHANAGE "lost+found" > +#define ORPHANAGE_LEN (sizeof ORPHANAGE - 1) sizeof works without ()? Even it is does, it is unusual to do so, and a little ambiguous.... > + > static int > -is_special_dirent( > +in_lost_found( Oh, that confused me for a second - in_lost_found and is_lost_found are very similar in name, hence easily confused when scanning the code. Not sure how better to name them, maybe you've got a better idea, Alex? > xfs_ino_t ino, > int namelen, > uchar_t *name) > { > static xfs_ino_t orphanage_ino = 0; > - char s[32]; > + char s[24]; /* 21 is enough */ Why is 21 enough? > int slen; > > - /* > - * due to the XFS name hashing algorithm, we cannot obfuscate > - * names with 4 chars or less. > - */ > - if (namelen <= 4) > - return 1; > + /* Record the "lost+found" inode if we haven't done so already */ > > - if (ino == 0) > + ASSERT(ino != 0); > + if (!orphanage_ino && is_lost_found(mp, cur_ino, namelen, name)) > + orphanage_ino = ino; > + > + /* We don't obfuscate the "lost+found" directory itself */ > + > + if (ino == orphanage_ino) > + return 1; > + > + /* Most files aren't in "lost+found" at all */ > + > + if (cur_ino != orphanage_ino) > return 0; I'm judging by this that if a directory tree is attached to lost+found we are obfuscating anything in that subdirectory? > > /* > - * don't obfuscate lost+found nor any inodes within lost+found with > - * the inode number > + * Within "lost+found", we don't obfuscate any file whose > + * name is the same as its inode number. Any others are > + * stray files and can be obfuscated. > */ > - if (cur_ino == mp->m_sb.sb_rootino && namelen == 10 && > - memcmp(name, "lost+found", 10) == 0) { > - orphanage_ino = ino; > - return 1; > - } > - if (cur_ino != orphanage_ino) > - return 0; > + slen = snprintf(s, sizeof s, "%llu", (unsigned long long) ino); > > - slen = sprintf(s, "%lld", (long long)ino); > - return (slen == namelen && memcmp(name, s, namelen) == 0); > + return slen == namelen && !memcmp(name, s, namelen); > } > > static void > @@ -426,13 +442,25 @@ generate_obfuscated_name( > xfs_dahash_t newhash; > uchar_t newname[NAME_MAX]; > > - if (is_special_dirent(ino, namelen, name)) > - return; > + /* > + * Our obfuscation algorithm requires at least 5-character > + * names, so don't bother if the name is too short. > + */ > + if (namelen < 5) > + return; Please make usre you include the reason for this - that this is a property of the name hashing algorithm. > - hash = libxfs_da_hashname(name, namelen); > + /* > + * We don't obfuscate "lost+found" or any orphan files > + * therein. When the name table is used for extended > + * attributes, the inode number provided is 0, in which > + * case we don't need to make this check. > + */ > + if (ino && in_lost_found(ino, namelen, name)) > + return; > > /* create a random name with the same hash value */ > > + hash = libxfs_da_hashname(name, namelen); > do { > dup = 0; > newname[0] = '/'; > > _______________________________________________ > xfs mailing list > xfs@xxxxxxxxxxx > http://oss.sgi.com/mailman/listinfo/xfs > -- Dave Chinner david@xxxxxxxxxxxxx _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs