All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Biggers <ebiggers@kernel.org>
To: linux-kernel@vger.kernel.org
Cc: linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-crypto@vger.kernel.org, linux-ext4@vger.kernel.org,
	linux-f2fs-devel@lists.sourceforge.net,
	linux-mips@vger.kernel.org, linux-riscv@lists.infradead.org,
	linux-s390@vger.kernel.org, linux-scsi@vger.kernel.org,
	linuxppc-dev@lists.ozlabs.org, loongarch@lists.linux.dev,
	sparclinux@vger.kernel.org, x86@kernel.org
Subject: [PATCH v2 04/18] crypto: crc32 - don't unnecessarily register arch algorithms
Date: Fri, 25 Oct 2024 12:14:40 -0700	[thread overview]
Message-ID: <20241025191454.72616-5-ebiggers@kernel.org> (raw)
In-Reply-To: <20241025191454.72616-1-ebiggers@kernel.org>

From: Eric Biggers <ebiggers@google.com>

Instead of registering the crc32-$arch and crc32c-$arch algorithms if
the arch-specific code was built, only register them when that code was
built *and* is not falling back to the base implementation at runtime.

This avoids confusing users like btrfs which checks the shash driver
name to determine whether it is crc32c-generic.

(It would also make sense to change btrfs to test the crc32_optimization
flags itself, so that it doesn't have to use the weird hack of parsing
the driver name.  This change still makes sense either way though.)

Signed-off-by: Eric Biggers <ebiggers@google.com>
---
 crypto/crc32_generic.c  | 8 ++++++--
 crypto/crc32c_generic.c | 8 ++++++--
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/crypto/crc32_generic.c b/crypto/crc32_generic.c
index cc064ea8240e..cecd01e4d6e6 100644
--- a/crypto/crc32_generic.c
+++ b/crypto/crc32_generic.c
@@ -155,19 +155,23 @@ static struct shash_alg algs[] = {{
 	.base.cra_ctxsize	= sizeof(u32),
 	.base.cra_module	= THIS_MODULE,
 	.base.cra_init		= crc32_cra_init,
 }};
 
+static int num_algs;
+
 static int __init crc32_mod_init(void)
 {
 	/* register the arch flavor only if it differs from the generic one */
-	return crypto_register_shashes(algs, 1 + IS_ENABLED(CONFIG_CRC32_ARCH));
+	num_algs = 1 + ((crc32_optimizations & CRC32_LE_OPTIMIZATION) != 0);
+
+	return crypto_register_shashes(algs, num_algs);
 }
 
 static void __exit crc32_mod_fini(void)
 {
-	crypto_unregister_shashes(algs, 1 + IS_ENABLED(CONFIG_CRC32_ARCH));
+	crypto_unregister_shashes(algs, num_algs);
 }
 
 subsys_initcall(crc32_mod_init);
 module_exit(crc32_mod_fini);
 
diff --git a/crypto/crc32c_generic.c b/crypto/crc32c_generic.c
index 04b03d825cf4..47d694da9d4a 100644
--- a/crypto/crc32c_generic.c
+++ b/crypto/crc32c_generic.c
@@ -195,19 +195,23 @@ static struct shash_alg algs[] = {{
 	.base.cra_ctxsize	= sizeof(struct chksum_ctx),
 	.base.cra_module	= THIS_MODULE,
 	.base.cra_init		= crc32c_cra_init,
 }};
 
+static int num_algs;
+
 static int __init crc32c_mod_init(void)
 {
 	/* register the arch flavor only if it differs from the generic one */
-	return crypto_register_shashes(algs, 1 + IS_ENABLED(CONFIG_CRC32_ARCH));
+	num_algs = 1 + ((crc32_optimizations & CRC32C_OPTIMIZATION) != 0);
+
+	return crypto_register_shashes(algs, num_algs);
 }
 
 static void __exit crc32c_mod_fini(void)
 {
-	crypto_unregister_shashes(algs, 1 + IS_ENABLED(CONFIG_CRC32_ARCH));
+	crypto_unregister_shashes(algs, num_algs);
 }
 
 subsys_initcall(crc32c_mod_init);
 module_exit(crc32c_mod_fini);
 
-- 
2.47.0


WARNING: multiple messages have this Message-ID (diff)
From: Eric Biggers via Linux-f2fs-devel <linux-f2fs-devel@lists.sourceforge.net>
To: linux-kernel@vger.kernel.org
Cc: linux-arch@vger.kernel.org, linux-s390@vger.kernel.org,
	linux-scsi@vger.kernel.org, x86@kernel.org,
	linux-mips@vger.kernel.org,
	linux-f2fs-devel@lists.sourceforge.net,
	linux-crypto@vger.kernel.org, loongarch@lists.linux.dev,
	sparclinux@vger.kernel.org, linux-riscv@lists.infradead.org,
	linux-ext4@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
	linux-arm-kernel@lists.infradead.org
Subject: [f2fs-dev] [PATCH v2 04/18] crypto: crc32 - don't unnecessarily register arch algorithms
Date: Fri, 25 Oct 2024 12:14:40 -0700	[thread overview]
Message-ID: <20241025191454.72616-5-ebiggers@kernel.org> (raw)
In-Reply-To: <20241025191454.72616-1-ebiggers@kernel.org>

From: Eric Biggers <ebiggers@google.com>

Instead of registering the crc32-$arch and crc32c-$arch algorithms if
the arch-specific code was built, only register them when that code was
built *and* is not falling back to the base implementation at runtime.

This avoids confusing users like btrfs which checks the shash driver
name to determine whether it is crc32c-generic.

(It would also make sense to change btrfs to test the crc32_optimization
flags itself, so that it doesn't have to use the weird hack of parsing
the driver name.  This change still makes sense either way though.)

Signed-off-by: Eric Biggers <ebiggers@google.com>
---
 crypto/crc32_generic.c  | 8 ++++++--
 crypto/crc32c_generic.c | 8 ++++++--
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/crypto/crc32_generic.c b/crypto/crc32_generic.c
index cc064ea8240e..cecd01e4d6e6 100644
--- a/crypto/crc32_generic.c
+++ b/crypto/crc32_generic.c
@@ -155,19 +155,23 @@ static struct shash_alg algs[] = {{
 	.base.cra_ctxsize	= sizeof(u32),
 	.base.cra_module	= THIS_MODULE,
 	.base.cra_init		= crc32_cra_init,
 }};
 
+static int num_algs;
+
 static int __init crc32_mod_init(void)
 {
 	/* register the arch flavor only if it differs from the generic one */
-	return crypto_register_shashes(algs, 1 + IS_ENABLED(CONFIG_CRC32_ARCH));
+	num_algs = 1 + ((crc32_optimizations & CRC32_LE_OPTIMIZATION) != 0);
+
+	return crypto_register_shashes(algs, num_algs);
 }
 
 static void __exit crc32_mod_fini(void)
 {
-	crypto_unregister_shashes(algs, 1 + IS_ENABLED(CONFIG_CRC32_ARCH));
+	crypto_unregister_shashes(algs, num_algs);
 }
 
 subsys_initcall(crc32_mod_init);
 module_exit(crc32_mod_fini);
 
diff --git a/crypto/crc32c_generic.c b/crypto/crc32c_generic.c
index 04b03d825cf4..47d694da9d4a 100644
--- a/crypto/crc32c_generic.c
+++ b/crypto/crc32c_generic.c
@@ -195,19 +195,23 @@ static struct shash_alg algs[] = {{
 	.base.cra_ctxsize	= sizeof(struct chksum_ctx),
 	.base.cra_module	= THIS_MODULE,
 	.base.cra_init		= crc32c_cra_init,
 }};
 
+static int num_algs;
+
 static int __init crc32c_mod_init(void)
 {
 	/* register the arch flavor only if it differs from the generic one */
-	return crypto_register_shashes(algs, 1 + IS_ENABLED(CONFIG_CRC32_ARCH));
+	num_algs = 1 + ((crc32_optimizations & CRC32C_OPTIMIZATION) != 0);
+
+	return crypto_register_shashes(algs, num_algs);
 }
 
 static void __exit crc32c_mod_fini(void)
 {
-	crypto_unregister_shashes(algs, 1 + IS_ENABLED(CONFIG_CRC32_ARCH));
+	crypto_unregister_shashes(algs, num_algs);
 }
 
 subsys_initcall(crc32c_mod_init);
 module_exit(crc32c_mod_fini);
 
-- 
2.47.0



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

WARNING: multiple messages have this Message-ID (diff)
From: Eric Biggers <ebiggers@kernel.org>
To: linux-kernel@vger.kernel.org
Cc: linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-crypto@vger.kernel.org, linux-ext4@vger.kernel.org,
	linux-f2fs-devel@lists.sourceforge.net,
	linux-mips@vger.kernel.org, linux-riscv@lists.infradead.org,
	linux-s390@vger.kernel.org, linux-scsi@vger.kernel.org,
	linuxppc-dev@lists.ozlabs.org, loongarch@lists.linux.dev,
	sparclinux@vger.kernel.org, x86@kernel.org
Subject: [PATCH v2 04/18] crypto: crc32 - don't unnecessarily register arch algorithms
Date: Fri, 25 Oct 2024 12:14:40 -0700	[thread overview]
Message-ID: <20241025191454.72616-5-ebiggers@kernel.org> (raw)
In-Reply-To: <20241025191454.72616-1-ebiggers@kernel.org>

From: Eric Biggers <ebiggers@google.com>

Instead of registering the crc32-$arch and crc32c-$arch algorithms if
the arch-specific code was built, only register them when that code was
built *and* is not falling back to the base implementation at runtime.

This avoids confusing users like btrfs which checks the shash driver
name to determine whether it is crc32c-generic.

(It would also make sense to change btrfs to test the crc32_optimization
flags itself, so that it doesn't have to use the weird hack of parsing
the driver name.  This change still makes sense either way though.)

Signed-off-by: Eric Biggers <ebiggers@google.com>
---
 crypto/crc32_generic.c  | 8 ++++++--
 crypto/crc32c_generic.c | 8 ++++++--
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/crypto/crc32_generic.c b/crypto/crc32_generic.c
index cc064ea8240e..cecd01e4d6e6 100644
--- a/crypto/crc32_generic.c
+++ b/crypto/crc32_generic.c
@@ -155,19 +155,23 @@ static struct shash_alg algs[] = {{
 	.base.cra_ctxsize	= sizeof(u32),
 	.base.cra_module	= THIS_MODULE,
 	.base.cra_init		= crc32_cra_init,
 }};
 
+static int num_algs;
+
 static int __init crc32_mod_init(void)
 {
 	/* register the arch flavor only if it differs from the generic one */
-	return crypto_register_shashes(algs, 1 + IS_ENABLED(CONFIG_CRC32_ARCH));
+	num_algs = 1 + ((crc32_optimizations & CRC32_LE_OPTIMIZATION) != 0);
+
+	return crypto_register_shashes(algs, num_algs);
 }
 
 static void __exit crc32_mod_fini(void)
 {
-	crypto_unregister_shashes(algs, 1 + IS_ENABLED(CONFIG_CRC32_ARCH));
+	crypto_unregister_shashes(algs, num_algs);
 }
 
 subsys_initcall(crc32_mod_init);
 module_exit(crc32_mod_fini);
 
diff --git a/crypto/crc32c_generic.c b/crypto/crc32c_generic.c
index 04b03d825cf4..47d694da9d4a 100644
--- a/crypto/crc32c_generic.c
+++ b/crypto/crc32c_generic.c
@@ -195,19 +195,23 @@ static struct shash_alg algs[] = {{
 	.base.cra_ctxsize	= sizeof(struct chksum_ctx),
 	.base.cra_module	= THIS_MODULE,
 	.base.cra_init		= crc32c_cra_init,
 }};
 
+static int num_algs;
+
 static int __init crc32c_mod_init(void)
 {
 	/* register the arch flavor only if it differs from the generic one */
-	return crypto_register_shashes(algs, 1 + IS_ENABLED(CONFIG_CRC32_ARCH));
+	num_algs = 1 + ((crc32_optimizations & CRC32C_OPTIMIZATION) != 0);
+
+	return crypto_register_shashes(algs, num_algs);
 }
 
 static void __exit crc32c_mod_fini(void)
 {
-	crypto_unregister_shashes(algs, 1 + IS_ENABLED(CONFIG_CRC32_ARCH));
+	crypto_unregister_shashes(algs, num_algs);
 }
 
 subsys_initcall(crc32c_mod_init);
 module_exit(crc32c_mod_fini);
 
-- 
2.47.0


_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv

  parent reply	other threads:[~2024-10-25 19:15 UTC|newest]

Thread overview: 122+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-10-25 19:14 [PATCH v2 00/18] Wire up CRC32 library functions to arch-optimized code Eric Biggers
2024-10-25 19:14 ` Eric Biggers
2024-10-25 19:14 ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-10-25 19:14 ` [PATCH v2 01/18] lib/crc32: drop leading underscores from __crc32c_le_base Eric Biggers
2024-10-25 19:14   ` Eric Biggers
2024-10-25 19:14   ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-10-25 19:14 ` [PATCH v2 02/18] lib/crc32: improve support for arch-specific overrides Eric Biggers
2024-10-25 19:14   ` Eric Biggers
2024-10-25 19:14   ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-10-25 19:14 ` [PATCH v2 03/18] lib/crc32: expose whether the lib is really optimized at runtime Eric Biggers
2024-10-25 19:14   ` Eric Biggers
2024-10-25 19:14   ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-10-25 20:32   ` Ard Biesheuvel
2024-10-25 20:32     ` Ard Biesheuvel
2024-10-25 20:32     ` [f2fs-dev] " Ard Biesheuvel via Linux-f2fs-devel
2024-10-25 21:32     ` Eric Biggers
2024-10-25 21:32       ` Eric Biggers
2024-10-25 21:32       ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-10-25 21:37       ` Ard Biesheuvel
2024-10-25 21:37         ` Ard Biesheuvel
2024-10-25 21:37         ` [f2fs-dev] " Ard Biesheuvel via Linux-f2fs-devel
2024-10-25 22:31         ` Eric Biggers
2024-10-25 22:31           ` Eric Biggers
2024-10-25 22:31           ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-10-25 19:14 ` Eric Biggers [this message]
2024-10-25 19:14   ` [PATCH v2 04/18] crypto: crc32 - don't unnecessarily register arch algorithms Eric Biggers
2024-10-25 19:14   ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-10-25 20:47   ` Ard Biesheuvel
2024-10-25 20:47     ` Ard Biesheuvel
2024-10-25 20:47     ` [f2fs-dev] " Ard Biesheuvel via Linux-f2fs-devel
2024-10-25 22:02     ` Eric Biggers
2024-10-25 22:02       ` Eric Biggers
2024-10-25 22:02       ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-10-26  4:09       ` Eric Biggers
2024-10-26  4:09         ` Eric Biggers
2024-10-26  4:09         ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-10-27  8:14         ` Ard Biesheuvel
2024-10-27  8:14           ` Ard Biesheuvel
2024-10-27  8:14           ` [f2fs-dev] " Ard Biesheuvel via Linux-f2fs-devel
2024-11-02  9:45         ` Herbert Xu
2024-11-02  9:45           ` Herbert Xu
2024-11-02  9:45           ` [f2fs-dev] " Herbert Xu via Linux-f2fs-devel
2024-11-02  9:58           ` Ard Biesheuvel
2024-11-02  9:58             ` Ard Biesheuvel
2024-11-02  9:58             ` [f2fs-dev] " Ard Biesheuvel via Linux-f2fs-devel
2024-11-02 10:19             ` Herbert Xu
2024-11-02 10:19               ` Herbert Xu
2024-11-02 10:19               ` [f2fs-dev] " Herbert Xu via Linux-f2fs-devel
2024-11-02 10:46               ` Ard Biesheuvel
2024-11-02 10:46                 ` Ard Biesheuvel
2024-11-02 10:46                 ` [f2fs-dev] " Ard Biesheuvel via Linux-f2fs-devel
2024-11-02 11:05                 ` Ard Biesheuvel
2024-11-02 11:05                   ` Ard Biesheuvel
2024-11-02 11:05                   ` [f2fs-dev] " Ard Biesheuvel via Linux-f2fs-devel
2024-11-02 11:08                   ` Herbert Xu
2024-11-02 11:08                     ` Herbert Xu
2024-11-02 11:08                     ` [f2fs-dev] " Herbert Xu via Linux-f2fs-devel
2024-11-02 16:36                     ` Eric Biggers
2024-11-02 16:36                       ` Eric Biggers
2024-11-02 16:36                       ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-11-02 16:46                       ` Ard Biesheuvel
2024-11-02 16:46                         ` Ard Biesheuvel
2024-11-02 16:46                         ` [f2fs-dev] " Ard Biesheuvel via Linux-f2fs-devel
2024-11-02 17:21                       ` Milan Broz
2024-11-02 17:21                         ` Milan Broz
2024-11-02 17:21                         ` [f2fs-dev] " Milan Broz
2024-10-25 19:14 ` [PATCH v2 05/18] arm/crc32: expose CRC32 functions through lib Eric Biggers
2024-10-25 19:14   ` Eric Biggers
2024-10-25 19:14   ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-10-25 19:14 ` [PATCH v2 06/18] loongarch/crc32: " Eric Biggers
2024-10-25 19:14   ` Eric Biggers
2024-10-25 19:14   ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-11-03 13:36   ` WangYuli
2024-11-03 13:36     ` WangYuli
2024-11-03 13:36     ` [f2fs-dev] " WangYuli
2024-11-03 13:57     ` Eric Biggers
2024-11-03 13:57       ` Eric Biggers
2024-11-03 13:57       ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-11-04  2:34       ` WangYuli
2024-11-04  2:34         ` WangYuli
2024-10-25 19:14 ` [PATCH v2 07/18] mips/crc32: " Eric Biggers
2024-10-25 19:14   ` Eric Biggers
2024-10-25 19:14   ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-10-25 19:14 ` [PATCH v2 08/18] powerpc/crc32: " Eric Biggers
2024-10-25 19:14   ` Eric Biggers
2024-10-25 19:14   ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-10-25 19:14 ` [PATCH v2 09/18] s390/crc32: " Eric Biggers
2024-10-25 19:14   ` Eric Biggers
2024-10-25 19:14   ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-10-25 19:14 ` [PATCH v2 10/18] sparc/crc32: " Eric Biggers
2024-10-25 19:14   ` Eric Biggers
2024-10-25 19:14   ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-10-25 19:14 ` [PATCH v2 11/18] x86/crc32: update prototype for crc_pcl() Eric Biggers
2024-10-25 19:14   ` Eric Biggers
2024-10-25 19:14   ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-10-25 19:14 ` [PATCH v2 12/18] x86/crc32: update prototype for crc32_pclmul_le_16() Eric Biggers
2024-10-25 19:14   ` Eric Biggers
2024-10-25 19:14   ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-10-25 19:14 ` [PATCH v2 13/18] x86/crc32: expose CRC32 functions through lib Eric Biggers
2024-10-25 19:14   ` Eric Biggers
2024-10-25 19:14   ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-10-25 19:14 ` [PATCH v2 14/18] lib/crc32: make crc32c() go directly to lib Eric Biggers
2024-10-25 19:14   ` Eric Biggers
2024-10-25 19:14   ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-10-25 19:14 ` [PATCH v2 15/18] ext4: switch to using the crc32c library Eric Biggers
2024-10-25 19:14   ` Eric Biggers
2024-10-25 19:14   ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-11-02 22:26   ` Theodore Ts'o
2024-11-02 22:26     ` Theodore Ts'o
2024-11-02 22:26     ` [f2fs-dev] " Theodore Ts'o
2024-10-25 19:14 ` [PATCH v2 16/18] jbd2: " Eric Biggers
2024-10-25 19:14   ` Eric Biggers
2024-10-25 19:14   ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-10-25 19:14 ` [PATCH v2 17/18] f2fs: switch to using the crc32 library Eric Biggers
2024-10-25 19:14   ` Eric Biggers
2024-10-25 19:14   ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-10-25 19:14 ` [PATCH v2 18/18] scsi: target: iscsi: switch to using the crc32c library Eric Biggers
2024-10-25 19:14   ` Eric Biggers
2024-10-25 19:14   ` [f2fs-dev] " Eric Biggers via Linux-f2fs-devel
2024-10-25 22:14   ` Ard Biesheuvel
2024-10-25 22:14     ` Ard Biesheuvel
2024-10-25 22:14     ` [f2fs-dev] " Ard Biesheuvel via Linux-f2fs-devel

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=20241025191454.72616-5-ebiggers@kernel.org \
    --to=ebiggers@kernel.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-crypto@vger.kernel.org \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-f2fs-devel@lists.sourceforge.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mips@vger.kernel.org \
    --cc=linux-riscv@lists.infradead.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=loongarch@lists.linux.dev \
    --cc=sparclinux@vger.kernel.org \
    --cc=x86@kernel.org \
    /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.