From: Simon Glass <simon.glass@canonical.com>
The inode_operations structs contain function pointers for write
operations (create, unlink, mkdir, rename, setattr, etc.). Even when
CONFIG_EXT4_WRITE is disabled, these function pointers cause the linker
to include much of the write-related code.
Add an EXT4_WR_OP() macro that returns the function pointer when
CONFIG_EXT4_WRITE is enabled, or NULL when disabled. Apply this macro
to write operation entries in structs ext4_dir_inode_operations,
ext4_special_inode_operations, ext4_file_inode_operations and the
symlink inode_operations structs.
This reduces ext4l code size by about 15K on Thumb2 when write-support
is disabled.
Co-developed-by: Claude Opus 4.5 <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
---
fs/ext4l/ext4.h | 11 +++++++++++
fs/ext4l/file.c | 2 +-
fs/ext4l/namei.c | 28 ++++++++++++++--------------
fs/ext4l/symlink.c | 6 +++---
4 files changed, 29 insertions(+), 18 deletions(-)
@@ -22,6 +22,17 @@
#include <linux/jbd2.h>
#include <linux/compiler.h>
+/*
+ * Macro for write operation function pointers in inode_operations structs.
+ * When CONFIG_EXT4_WRITE is disabled, these return NULL so the linker
+ * doesn't pull in the write functions.
+ */
+#ifdef CONFIG_EXT4_WRITE
+#define EXT4_WR_OP(func) (func)
+#else
+#define EXT4_WR_OP(func) NULL
+#endif
+
/*
* The fourth extended filesystem constants/structures
*/
@@ -966,7 +966,7 @@ const struct file_operations ext4_file_operations = {
/* U-Boot simplified inode operations */
const struct inode_operations ext4_file_inode_operations = {
- .setattr = ext4_setattr,
+ .setattr = EXT4_WR_OP(ext4_setattr),
.getattr = ext4_file_getattr,
.listxattr = ext4_listxattr,
.fiemap = ext4_fiemap,
@@ -4199,30 +4199,30 @@ static int ext4_rename2(struct mnt_idmap *idmap,
* directories can handle most operations...
*/
const struct inode_operations ext4_dir_inode_operations = {
- .create = ext4_create,
+ .create = EXT4_WR_OP(ext4_create),
.lookup = ext4_lookup,
- .link = ext4_link,
- .unlink = ext4_unlink,
- .symlink = ext4_symlink,
- .mkdir = ext4_mkdir,
- .rmdir = ext4_rmdir,
- .mknod = ext4_mknod,
- .tmpfile = ext4_tmpfile,
- .rename = ext4_rename2,
- .setattr = ext4_setattr,
+ .link = EXT4_WR_OP(ext4_link),
+ .unlink = EXT4_WR_OP(ext4_unlink),
+ .symlink = EXT4_WR_OP(ext4_symlink),
+ .mkdir = EXT4_WR_OP(ext4_mkdir),
+ .rmdir = EXT4_WR_OP(ext4_rmdir),
+ .mknod = EXT4_WR_OP(ext4_mknod),
+ .tmpfile = EXT4_WR_OP(ext4_tmpfile),
+ .rename = EXT4_WR_OP(ext4_rename2),
+ .setattr = EXT4_WR_OP(ext4_setattr),
.getattr = ext4_getattr,
.listxattr = ext4_listxattr,
.get_inode_acl = ext4_get_acl,
- .set_acl = ext4_set_acl,
+ .set_acl = EXT4_WR_OP(ext4_set_acl),
.fiemap = ext4_fiemap,
.fileattr_get = ext4_fileattr_get,
- .fileattr_set = ext4_fileattr_set,
+ .fileattr_set = EXT4_WR_OP(ext4_fileattr_set),
};
const struct inode_operations ext4_special_inode_operations = {
- .setattr = ext4_setattr,
+ .setattr = EXT4_WR_OP(ext4_setattr),
.getattr = ext4_getattr,
.listxattr = ext4_listxattr,
.get_inode_acl = ext4_get_acl,
- .set_acl = ext4_set_acl,
+ .set_acl = EXT4_WR_OP(ext4_set_acl),
};
@@ -115,21 +115,21 @@ static const char *ext4_get_link(struct dentry *dentry, struct inode *inode,
const struct inode_operations ext4_encrypted_symlink_inode_operations = {
.get_link = ext4_encrypted_get_link,
- .setattr = ext4_setattr,
+ .setattr = EXT4_WR_OP(ext4_setattr),
.getattr = ext4_encrypted_symlink_getattr,
.listxattr = ext4_listxattr,
};
const struct inode_operations ext4_symlink_inode_operations = {
.get_link = ext4_get_link,
- .setattr = ext4_setattr,
+ .setattr = EXT4_WR_OP(ext4_setattr),
.getattr = ext4_getattr,
.listxattr = ext4_listxattr,
};
const struct inode_operations ext4_fast_symlink_inode_operations = {
.get_link = simple_get_link,
- .setattr = ext4_setattr,
+ .setattr = EXT4_WR_OP(ext4_setattr),
.getattr = ext4_getattr,
.listxattr = ext4_listxattr,
};