From: Alex Elder <aelder@sgi.com>
To: Dave Chinner <david@fromorbit.com>
Cc: xfs@oss.sgi.com
Subject: [PATCH v4, 13/16] xfsprogs: metadump: move duplicate name handling into its own function
Date: Fri, 25 Feb 2011 12:13:48 -0600 [thread overview]
Message-ID: <1298657628.1990.6987.camel@doink> (raw)
In-Reply-To: <20110224021239.GA3166@dastard>
Move the handling of duplicate names into its own function. As a
result, all names other than "lost+found" files (not just those that
get obfuscated) will be checked to avoid duplication.
This makes the local buffer newname[] in generate_obfuscated_name()
unnecessary, so just drop it and use the passed-in name.
Signed-off-by: Alex Elder <aelder@sgi.com>
Updates:
- A comment about handling of a leading '/' character is now modified
to match the updated code, rather than being deleted altogether.
- Renamed handle_duplicates() to be handle_duplicate_name().
---
db/metadump.c | 78
++++++++++++++++++++++++++++++++++------------------------
1 file changed, 47 insertions(+), 31 deletions(-)
Index: b/db/metadump.c
===================================================================
--- a/db/metadump.c
+++ b/db/metadump.c
@@ -552,6 +552,37 @@ obfuscate_name(
ASSERT(libxfs_da_hashname(name, name_len) == hash);
}
+/*
+ * Look up the given name in the name table. If it is already
+ * present, find an alternate and attempt to use that name instead.
+ *
+ * Returns 1 if the (possibly modified) name is not present in the
+ * name table. Returns 0 otherwise.
+ */
+static int
+handle_duplicate_name(xfs_dahash_t hash, size_t name_len, uchar_t
*name)
+{
+ int dup = 0;
+
+ if (!nametable_find(hash, name_len, name))
+ return 1; /* Not already in table */
+
+ /* Name is already in use. Need to find an alternate. */
+
+ do {
+ obfuscate_name(hash, name_len, name);
+
+ /*
+ * Search the name table to be sure we don't produce
+ * a name that's already been used.
+ */
+ if (!nametable_find(hash, name_len, name))
+ break;
+ } while (++dup < DUP_MAX);
+
+ return dup < DUP_MAX ? 1 : 0;
+}
+
static void
generate_obfuscated_name(
xfs_ino_t ino,
@@ -559,8 +590,6 @@ generate_obfuscated_name(
uchar_t *name)
{
xfs_dahash_t hash;
- int dup = 0;
- uchar_t newname[NAME_MAX];
/*
* We don't obfuscate "lost+found" or any orphan files
@@ -572,48 +601,35 @@ generate_obfuscated_name(
return;
/*
- * If the name starts with a slash, just skip over it. We
- * will copy our obfuscated name back into space following
- * the slash when we're done. Our new name will not have
- * the '/', and that's the version we'll keep in our
- * duplicates table. Note that the namelen value passed in
- * does not include the leading slash (if any).
+ * If the name starts with a slash, just skip over it. It
+ * isn't included in the hash and we don't record it in the
+ * name table. Note that the namelen value passed in does
+ * not count the leading slash (if one is present).
*/
if (*name == '/')
name++;
- hash = libxfs_da_hashname(name, namelen);
- do {
- obfuscate_name(hash, namelen, newname);
+ /* Obfuscate the name (if possible) */
- /*
- * Search the name table to be sure we don't produce
- * a name that's already been used.
- */
- if (!nametable_find(hash, namelen, newname))
- break;
- } while (++dup < DUP_MAX);
+ hash = libxfs_da_hashname(name, namelen);
+ obfuscate_name(hash, namelen, name);
/*
- * Update the caller's copy with the obfuscated name.
- *
- * If we couldn't come up with one, just use the original
- * name without obfuscation. Issue a warning if we managed
- * to previously create an obfuscated name that matches the
- * one we're working on now.
+ * Make sure the name is not something already seen. If we
+ * fail to find a suitable alternate, we're dealing with a
+ * very pathological situation, and we may end up creating
+ * a duplicate name in the metadump, so issue a warning.
*/
- if (dup < DUP_MAX)
- memcpy(name, newname, namelen);
- else if (nametable_find(hash, namelen, name))
+ if (!handle_duplicate_name(hash, namelen, name)) {
print_warning("duplicate name for inode %llu "
"in dir inode %llu\n",
(unsigned long long) ino,
(unsigned long long) cur_ino);
+ return;
+ }
+
+ /* Create an entry for the new name in the name table. */
- /*
- * Create an entry for the name in the name table. Use the
- * original name if we got too many dups.
- */
if (!nametable_add(hash, namelen, name))
print_warning("unable to record name for inode %llu "
"in dir inode %llu\n",
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
next prev parent reply other threads:[~2011-02-25 18:11 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-02-18 21:21 [PATCH v3, 13/16] xfsprogs: metadump: move duplicate name handling into its own function Alex Elder
2011-02-24 2:12 ` Dave Chinner
2011-02-25 18:13 ` Alex Elder [this message]
2011-03-03 4:59 ` [PATCH v4, " Dave Chinner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1298657628.1990.6987.camel@doink \
--to=aelder@sgi.com \
--cc=david@fromorbit.com \
--cc=xfs@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.