diff mbox series

[3/3] xfs_db: make the hash command print the dirent hash

Message ID 168597943560.1226265.697249744236069044.stgit@frogsfrogsfrogs (mailing list archive)
State Accepted
Headers show
Series xfs_db: create names with colliding hashes | expand

Commit Message

Darrick J. Wong June 5, 2023, 3:37 p.m. UTC
From: Darrick J. Wong <djwong@kernel.org>

It turns out that the da and dir2 hashname functions are /not/ the same,
at least not on ascii-ci filesystems.  Enhance this debugger command to
support printing the dir2 hashname.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
 db/hash.c         |   42 +++++++++++++++++++++++++++++++++++++-----
 man/man8/xfs_db.8 |    8 +++++++-
 2 files changed, 44 insertions(+), 6 deletions(-)

Comments

Carlos Maiolino June 6, 2023, 11:36 a.m. UTC | #1
On Mon, Jun 05, 2023 at 08:37:15AM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <djwong@kernel.org>
> 
> It turns out that the da and dir2 hashname functions are /not/ the same,
> at least not on ascii-ci filesystems.  Enhance this debugger command to
> support printing the dir2 hashname.
> 
> Signed-off-by: Darrick J. Wong <djwong@kernel.org>

Looks good, will test.

Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>

> ---
>  db/hash.c         |   42 +++++++++++++++++++++++++++++++++++++-----
>  man/man8/xfs_db.8 |    8 +++++++-
>  2 files changed, 44 insertions(+), 6 deletions(-)
> 
> 
> diff --git a/db/hash.c b/db/hash.c
> index 79a250526e9..716da88baf9 100644
> --- a/db/hash.c
> +++ b/db/hash.c
> @@ -18,9 +18,15 @@
>  static int hash_f(int argc, char **argv);
>  static void hash_help(void);
> 
> -static const cmdinfo_t hash_cmd =
> -	{ "hash", NULL, hash_f, 1, 1, 0, N_("string"),
> -	  N_("calculate hash value"), hash_help };
> +static const cmdinfo_t hash_cmd = {
> +	.name		= "hash",
> +	.cfunc		= hash_f,
> +	.argmin		= 1,
> +	.argmax		= -1,
> +	.args		= N_("string"),
> +	.oneline	= N_("calculate hash value"),
> +	.help		= hash_help,
> +};
> 
>  static void
>  hash_help(void)
> @@ -43,9 +49,35 @@ hash_f(
>  	char		**argv)
>  {
>  	xfs_dahash_t	hashval;
> +	bool		use_dir2_hash = false;
> +	int		c;
> +
> +	while ((c = getopt(argc, argv, "d")) != EOF) {
> +		switch (c) {
> +		case 'd':
> +			use_dir2_hash = true;
> +			break;
> +		default:
> +			exitcode = 1;
> +			hash_help();
> +			return 0;
> +		}
> +	}
> +
> +	for (c = optind; c < argc; c++) {
> +		if (use_dir2_hash) {
> +			struct xfs_name	xname = {
> +				.name	= (uint8_t *)argv[c],
> +				.len	= strlen(argv[c]),
> +			};
> +
> +			hashval = libxfs_dir2_hashname(mp, &xname);
> +		} else {
> +			hashval = libxfs_da_hashname(argv[c], strlen(argv[c]));
> +		}
> +		dbprintf("0x%x\n", hashval);
> +	}
> 
> -	hashval = libxfs_da_hashname((unsigned char *)argv[1], (int)strlen(argv[1]));
> -	dbprintf("0x%x\n", hashval);
>  	return 0;
>  }
> 
> diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8
> index fde1c5c6c69..60dcdc52cba 100644
> --- a/man/man8/xfs_db.8
> +++ b/man/man8/xfs_db.8
> @@ -763,10 +763,16 @@ Skip write verifiers but perform CRC recalculation; allows invalid data to be
>  written to disk to test detection of invalid data.
>  .RE
>  .TP
> -.BI hash " string
> +.BI hash [-d]" strings
>  Prints the hash value of
>  .I string
>  using the hash function of the XFS directory and attribute implementation.
> +
> +If the
> +.B \-d
> +option is specified, the directory-specific hash function is used.
> +This only makes a difference on filesystems with ascii case-insensitive
> +lookups enabled.
>  .TP
>  .BI "hashcoll [-a] [-s seed] [-n " nr "] [-p " path "] -i | " names...
>  Create directory entries or extended attributes names that all have the same
>
diff mbox series

Patch

diff --git a/db/hash.c b/db/hash.c
index 79a250526e9..716da88baf9 100644
--- a/db/hash.c
+++ b/db/hash.c
@@ -18,9 +18,15 @@ 
 static int hash_f(int argc, char **argv);
 static void hash_help(void);
 
-static const cmdinfo_t hash_cmd =
-	{ "hash", NULL, hash_f, 1, 1, 0, N_("string"),
-	  N_("calculate hash value"), hash_help };
+static const cmdinfo_t hash_cmd = {
+	.name		= "hash",
+	.cfunc		= hash_f,
+	.argmin		= 1,
+	.argmax		= -1,
+	.args		= N_("string"),
+	.oneline	= N_("calculate hash value"),
+	.help		= hash_help,
+};
 
 static void
 hash_help(void)
@@ -43,9 +49,35 @@  hash_f(
 	char		**argv)
 {
 	xfs_dahash_t	hashval;
+	bool		use_dir2_hash = false;
+	int		c;
+
+	while ((c = getopt(argc, argv, "d")) != EOF) {
+		switch (c) {
+		case 'd':
+			use_dir2_hash = true;
+			break;
+		default:
+			exitcode = 1;
+			hash_help();
+			return 0;
+		}
+	}
+
+	for (c = optind; c < argc; c++) {
+		if (use_dir2_hash) {
+			struct xfs_name	xname = {
+				.name	= (uint8_t *)argv[c],
+				.len	= strlen(argv[c]),
+			};
+
+			hashval = libxfs_dir2_hashname(mp, &xname);
+		} else {
+			hashval = libxfs_da_hashname(argv[c], strlen(argv[c]));
+		}
+		dbprintf("0x%x\n", hashval);
+	}
 
-	hashval = libxfs_da_hashname((unsigned char *)argv[1], (int)strlen(argv[1]));
-	dbprintf("0x%x\n", hashval);
 	return 0;
 }
 
diff --git a/man/man8/xfs_db.8 b/man/man8/xfs_db.8
index fde1c5c6c69..60dcdc52cba 100644
--- a/man/man8/xfs_db.8
+++ b/man/man8/xfs_db.8
@@ -763,10 +763,16 @@  Skip write verifiers but perform CRC recalculation; allows invalid data to be
 written to disk to test detection of invalid data.
 .RE
 .TP
-.BI hash " string
+.BI hash [-d]" strings
 Prints the hash value of
 .I string
 using the hash function of the XFS directory and attribute implementation.
+
+If the
+.B \-d
+option is specified, the directory-specific hash function is used.
+This only makes a difference on filesystems with ascii case-insensitive
+lookups enabled.
 .TP
 .BI "hashcoll [-a] [-s seed] [-n " nr "] [-p " path "] -i | " names...
 Create directory entries or extended attributes names that all have the same