From: Ben Myers <bpm@sgi.com>
To: linux-fsdevel@vger.kernel.org
Cc: tinguely@sgi.com, olaf@sgi.com, xfs@oss.sgi.com
Subject: [PATCH 10/10] xfs: implement demand load of utf8norm.ko
Date: Thu, 18 Sep 2014 15:18:43 -0500 [thread overview]
Message-ID: <20140918201843.GM4482@sgi.com> (raw)
In-Reply-To: <20140918195650.GI19952@sgi.com>
From: Ben Myers <bpm@sgi.com>
The utf8 normalization module is large and there is no need to have it
loaded unless an xfs filesystem with utf8 enabled has been mounted.
This loads utf8norm.ko at mount time for filesystems that need
it. This is optional on CONFIG_XFS_UTF8_DEMAND_LOAD.
Signed-off-by: Ben Myers <bpm@sgi.com>
---
fs/xfs/Kconfig | 10 +++++
fs/xfs/libxfs/xfs_dir2.c | 9 ++++
fs/xfs/libxfs/xfs_utf8.c | 104 +++++++++++++++++++++++++++++++++++++++++++++++
fs/xfs/libxfs/xfs_utf8.h | 5 +++
fs/xfs/xfs_super.c | 6 +++
5 files changed, 134 insertions(+)
diff --git a/fs/xfs/Kconfig b/fs/xfs/Kconfig
index a847857..69efd85c 100644
--- a/fs/xfs/Kconfig
+++ b/fs/xfs/Kconfig
@@ -103,3 +103,13 @@ config XFS_UTF8
Say Y here to enable utf8 normalization support in XFS. You
will be able to mount and use filesystems created with the
utf8 mkfs.xfs option.
+
+config XFS_UTF8_DEMAND_LOAD
+ bool "XFS loads UTF-8 normalization module on demand"
+ depends on XFS_FS
+ depends on XFS_UTF8
+ help
+ Say Y here to enable on demand loading of the utf8
+ normalization module. This enables the large nomalization
+ module to remain unloaded until a filesystem with utf8 support
+ is mounted.
diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c
index e28736b..436738d 100644
--- a/fs/xfs/libxfs/xfs_dir2.c
+++ b/fs/xfs/libxfs/xfs_dir2.c
@@ -35,7 +35,9 @@
#include "xfs_error.h"
#include "xfs_trace.h"
#include "xfs_dinode.h"
+#ifdef CONFIG_XFS_UTF8
#include "xfs_utf8.h"
+#endif
struct xfs_name xfs_name_dotdot = { (unsigned char *)"..", 2, XFS_DIR3_FT_DIR };
@@ -159,6 +161,13 @@ xfs_da_mount(
if (xfs_sb_version_hasutf8(&mp->m_sb)) {
#ifdef CONFIG_XFS_UTF8
+#ifdef CONFIG_XFS_UTF8_DEMAND_LOAD
+ if (xfs_init_utf8_module(mp)) {
+ kmem_free(mp->m_dir_geo);
+ kmem_free(mp->m_attr_geo);
+ return -ENOSYS;
+ }
+#endif /* CONFIG_XFS_UTF8_DEMAND_LOAD */
if (xfs_sb_version_hasasciici(&mp->m_sb))
mp->m_dirnameops = &xfs_utf8_ci_nameops;
else
diff --git a/fs/xfs/libxfs/xfs_utf8.c b/fs/xfs/libxfs/xfs_utf8.c
index 75f2b3a..71978c8 100644
--- a/fs/xfs/libxfs/xfs_utf8.c
+++ b/fs/xfs/libxfs/xfs_utf8.c
@@ -44,6 +44,110 @@
#include "xfs_utf8.h"
#include <utf8norm/utf8norm.h>
+#ifdef CONFIG_XFS_UTF8_DEMAND_LOAD
+#include <linux/kmod.h>
+
+static DEFINE_SPINLOCK(utf8norm_lock);
+static int utf8norm_initialized;
+
+static const unsigned int (*utf8version_func)(void);
+static utf8data_t (*utf8nfkdi_func)(unsigned int);
+static utf8data_t (*utf8nfkdicf_func)(unsigned int);
+static ssize_t (*utf8nlen_func)(utf8data_t, const char *, size_t);
+static int (*utf8ncursor_func)(struct utf8cursor *, utf8data_t,
+ const char *, size_t);
+static int (*utf8byte_func)(struct utf8cursor *);
+
+static void
+xfs_put_utf8_module_locked(void)
+{
+ if (utf8version_func)
+ symbol_put(utf8version);
+
+ if (utf8nfkdi_func)
+ symbol_put(utf8nfkdi);
+
+ if (utf8nfkdicf_func)
+ symbol_put(utf8nfkdicf);
+
+ if (utf8nlen_func)
+ symbol_put(utf8nlen);
+
+ if (utf8ncursor_func)
+ symbol_put(utf8ncursor);
+
+ if (utf8byte_func)
+ symbol_put(utf8byte);
+}
+
+void
+xfs_put_utf8_module(void)
+{
+ spin_lock(&utf8norm_lock);
+ if (!utf8norm_initialized) {
+ spin_unlock(&utf8norm_lock);
+ return;
+ }
+ xfs_put_utf8_module_locked();
+ spin_unlock(&utf8norm_lock);
+}
+
+int
+xfs_init_utf8_module(struct xfs_mount *mp)
+{
+ request_module("utf8norm");
+
+ spin_lock(&utf8norm_lock);
+ if (utf8norm_initialized) {
+ spin_unlock(&utf8norm_lock);
+ return 0;
+ }
+
+ utf8version_func = symbol_get(utf8version);
+ if (!utf8version_func)
+ goto error;
+
+ utf8nfkdi_func = symbol_get(utf8nfkdi);
+ if (!utf8nfkdi_func)
+ goto error;
+
+ utf8nfkdicf_func = symbol_get(utf8nfkdicf);
+ if (!utf8nfkdicf_func)
+ goto error;
+
+ utf8nlen_func = symbol_get(utf8nlen);
+ if (!utf8nlen_func)
+ goto error;
+
+ utf8ncursor_func = symbol_get(utf8ncursor);
+ if (!utf8ncursor_func)
+ goto error;
+
+ utf8byte_func = symbol_get(utf8byte);
+ if (!utf8byte_func)
+ goto error;
+
+ utf8norm_initialized = 1;
+ spin_unlock(&utf8norm_lock);
+ return 0;
+error:
+ xfs_put_utf8_module_locked();
+ spin_unlock(&utf8norm_lock);
+ xfs_warn(mp,
+ "Failed to load utf8norm.ko which is required to "
+ "mount a filesystem with utf8 support.");
+ return -ENOSYS;
+}
+
+#define utf8version (*utf8version_func)
+#define utf8nfkdi (*utf8nfkdi_func)
+#define utf8nfkdicf (*utf8nfkdicf_func)
+#define utf8nlen (*utf8nlen_func)
+#define utf8ncursor (*utf8ncursor_func)
+#define utf8byte (*utf8byte_func)
+
+#endif /* CONFIG_XFS_UTF8_DEMAND_LOAD */
+
/*
* xfs nameops using nfkdi
*/
diff --git a/fs/xfs/libxfs/xfs_utf8.h b/fs/xfs/libxfs/xfs_utf8.h
index 97b6a91..9d1125a 100644
--- a/fs/xfs/libxfs/xfs_utf8.h
+++ b/fs/xfs/libxfs/xfs_utf8.h
@@ -22,4 +22,9 @@
extern struct xfs_nameops xfs_utf8_nameops;
extern struct xfs_nameops xfs_utf8_ci_nameops;
+#ifdef CONFIG_XFS_UTF8_DEMAND_LOAD
+extern int xfs_init_utf8_module(struct xfs_mount *);
+extern void xfs_put_utf8_module(void);
+#endif
+
#endif /* XFS_UTF8_H */
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
index b194652..050a949 100644
--- a/fs/xfs/xfs_super.c
+++ b/fs/xfs/xfs_super.c
@@ -47,6 +47,9 @@
#include "xfs_dinode.h"
#include "xfs_filestream.h"
#include "xfs_quota.h"
+#ifdef CONFIG_XFS_UTF8_DEMAND_LOAD
+#include "xfs_utf8.h"
+#endif
#include <linux/namei.h>
#include <linux/init.h>
@@ -1809,6 +1812,9 @@ exit_xfs_fs(void)
xfs_mru_cache_uninit();
xfs_destroy_workqueues();
xfs_destroy_zones();
+#ifdef CONFIG_XFS_UTF8_DEMAND_LOAD
+ xfs_put_utf8_module();
+#endif
}
module_init(init_xfs_fs);
--
1.7.12.4
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
next prev parent reply other threads:[~2014-09-18 20:18 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-18 19:56 [RFC v2] Unicode/UTF-8 support for XFS Ben Myers
2014-09-18 20:08 ` [PATCH 01/10] xfs: return the first match during case-insensitive lookup Ben Myers
2014-09-18 20:09 ` [PATCH 02/10] xfs: rename XFS_CMP_CASE to XFS_CMP_MATCH Ben Myers
2014-09-18 20:09 ` [PATCH 03/13] libxfs: add xfs_nameops.normhash Ben Myers
2014-09-18 20:10 ` [PATCH 04/10] xfs: change interface of xfs_nameops.normhash Ben Myers
2014-09-18 20:11 ` [PATCH 05/10] xfs: add a superblock feature bit to indicate UTF-8 support Ben Myers
2014-09-18 20:13 ` [PATCH 03/10] xfs: add xfs_nameops.normhash Ben Myers
2014-09-18 20:14 ` [PATCH 06/10] xfs: add unicode character database files Ben Myers
2014-09-22 20:54 ` Dave Chinner
2014-09-26 17:09 ` Christoph Hellwig
2014-09-18 20:15 ` [PATCH 07/10] xfs: add trie generator and supporting code for UTF-8 Ben Myers
2014-09-22 20:57 ` Dave Chinner
2014-09-23 18:57 ` Ben Myers
2014-09-26 17:10 ` Christoph Hellwig
2014-09-18 20:16 ` [PATCH 08/10] xfs: add xfs_nameops for utf8 and utf8+casefold Ben Myers
2014-09-18 20:17 ` [PATCH 09/10] xfs: apply utf-8 normalization rules to user extended attribute names Ben Myers
2014-09-18 20:18 ` Ben Myers [this message]
2014-09-18 20:31 ` [PATCH 00/13] xfsprogs: Unicode/UTF-8 support for XFS Ben Myers
2014-09-18 20:33 ` [PATCH 01/13] libxfs: return the first match during case-insensitive lookup Ben Myers
2014-09-18 20:33 ` [PATCH 02/13] libxfs: rename XFS_CMP_CASE to XFS_CMP_MATCH Ben Myers
2014-09-18 20:34 ` [PATCH 03/13] libxfs: add xfs_nameops.normhash Ben Myers
2014-09-18 20:35 ` [PATCH 04/13] libxfs: change interface of xfs_nameops.normhash Ben Myers
2014-09-18 20:36 ` [PATCH 05/13] libxfs: add a superblock feature bit to indicate UTF-8 support Ben Myers
2014-09-18 20:37 ` [PATCH 06/13] xfsprogs: add unicode character database files Ben Myers
2014-09-18 20:38 ` [PATCH 07/13] libxfs: add trie generator and supporting code for UTF-8 Ben Myers
2014-09-18 20:38 ` [PATCH 08/13] libxfs: add xfs_nameops for utf8 and utf8+casefold Ben Myers
2014-09-18 20:39 ` [PATCH 09/13] libxfs: apply utf-8 normalization rules to user extended attribute names Ben Myers
2014-09-18 20:40 ` [PATCH 10/13] xfsprogs: add utf8 support to growfs Ben Myers
2014-09-18 20:41 ` [PATCH 11/13] xfsprogs: add utf8 support to mkfs.xfs Ben Myers
2014-09-18 20:42 ` [PATCH 12/13] xfsprogs: add utf8 support to xfs_repair Ben Myers
2014-09-18 20:43 ` [PATCH 13/13] xfsprogs: add a preliminary test for utf8 support Ben Myers
2014-09-19 16:06 ` [PATCH 07a/13] xfsprogs: add trie generator for UTF-8 Ben Myers
2014-09-23 18:34 ` Roger Willcocks
2014-09-24 23:11 ` Ben Myers
2014-09-19 16:07 ` [PATCH 07b/13] libxfs: add supporting code " Ben Myers
2014-09-18 21:10 ` [RFC v2] Unicode/UTF-8 support for XFS Ben Myers
2014-09-18 21:24 ` Zach Brown
2014-09-18 22:23 ` Ben Myers
2014-09-19 16:03 ` [PATCH 07a/10] xfs: add trie generator for UTF-8 Ben Myers
2014-09-19 16:04 ` [PATCH 07b/10] xfs: add supporting code " Ben Myers
2014-09-22 14:55 ` [RFC v2] Unicode/UTF-8 support for XFS Andi Kleen
2014-09-22 18:41 ` Ben Myers
2014-09-22 19:29 ` Andi Kleen
2014-09-23 16:13 ` Olaf Weber
2014-09-23 20:15 ` Andi Kleen
2014-09-23 20:45 ` Ben Myers
2014-09-24 11:07 ` Olaf Weber
2014-09-26 14:06 ` Olaf Weber
2014-09-23 13:01 ` Olaf Weber
2014-09-23 20:02 ` Andi Kleen
2014-09-22 22:26 ` Dave Chinner
2014-09-24 13:21 ` Olaf Weber
2014-09-24 23:10 ` Dave Chinner
2014-09-25 13:33 ` Zuckerman, Boris
2014-09-26 14:50 ` Olaf Weber
2014-09-26 16:56 ` Christoph Hellwig
2014-09-26 17:04 ` Jeremy Allison
2014-09-26 17:06 ` Christoph Hellwig
2014-09-26 17:13 ` Jeremy Allison
2014-09-26 19:37 ` Olaf Weber
2014-09-26 19:46 ` Jeremy Allison
2014-09-26 20:03 ` Olaf Weber
2014-09-29 20:16 ` J. Bruce Fields
2014-09-29 11:06 ` Christoph Hellwig
2014-09-26 17:30 ` Ben Myers
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=20140918201843.GM4482@sgi.com \
--to=bpm@sgi.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=olaf@sgi.com \
--cc=tinguely@sgi.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox