[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux-xfs
Subject:    [PATCH 09/12] xfsprogs: don't loop on too many dups
From:       Alex Elder <aelder () sgi ! com>
Date:       2010-12-30 20:42:06
Message-ID: 1293741726.2294.368.camel () doink
[Download RAW message or body]

Don't just loop indefinitely when an obfuscated name comes
up as a duplicate.  Count the number of times we've found
a duplicate, and if it gets excessive just give up and use
the original name without obfuscation.

Signed-off-by: Alex Elder <aelder@sgi.com>

---
 db/metadump.c |   35 ++++++++++++++++++++++++++---------
 1 file changed, 26 insertions(+), 9 deletions(-)


Index: b/db/metadump.c
===================================================================
--- a/db/metadump.c
+++ b/db/metadump.c
@@ -29,6 +29,14 @@
 
 #define DEFAULT_MAX_EXT_SIZE	1000
 
+/*
+ * It's possible that more than one file in a directory produce the
+ * same obfuscated name.  If that happens, we try to create another
+ * one.  After several rounds of this though, we just give up and
+ * leave the original name as-is.
+ */
+#define	DUP_MAX		5	/* Max duplicates before we give up */
+
 /* copy all metadata structures to/from a file */
 
 static int	metadump_f(int argc, char **argv);
@@ -415,7 +423,7 @@ generate_obfuscated_name(
 {
        xfs_dahash_t            hash;
        name_ent_t              *p;
-       int                     dup;
+       int                     dup = 0;
        uchar_t                 newname[NAME_MAX];

        /*
@@ -454,8 +462,6 @@ generate_obfuscated_name(
 		uchar_t		high_bit;
 		int		shift;
 
-		dup = 0;
-
 		/*
 		 * The beginning of the obfuscated name can be
 		 * pretty much anything, so fill it in with random
@@ -510,14 +516,24 @@ generate_obfuscated_name(
 
 		ASSERT(libxfs_da_hashname((char *) newname, namelen) == hash);
 
+		/*
+		 * Search the name table to be sure we don't produce
+		 * a name that's already been used.
+		 */
 		for (p = nametable[hash % NAME_TABLE_SIZE]; p; p = p->next) {
 			if (p->hash == hash && p->namelen == namelen &&
-					!memcmp(p->name, newname, namelen)) {
-				dup = 1;
+					!memcmp(p->name, newname, namelen))
 				break;
-			}
 		}
-	} while (dup);
+		if (p)
+		    	dup++;
+		else
+		    	dup = 0;
+	} while (dup && dup < DUP_MAX);
+
+	/* Use the original name if we got too many dups. */
+
+	newp = dup ? name : newname;
 
 	/* Create an entry for the name in the name table */
 
@@ -526,7 +542,7 @@ generate_obfuscated_name(
 		return;
 
 	p->namelen = namelen;
-	memcpy(p->name, newname, namelen);
+	memcpy(p->name, newp, namelen);
 	p->hash = hash;
 	p->next = nametable[hash % NAME_TABLE_SIZE];
 
@@ -534,7 +550,8 @@ generate_obfuscated_name(
 
 	/* Update the caller's copy with the obfuscated name */
 
-	memcpy(name, newname, namelen);
+	if (newp != name)
+		memcpy(name, newp, namelen);
 }
 
 static void


_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic