Re: [PATCH 04/12] fs: Generic infrastructure for optional inode fields

Andreas Dilger <[email protected]>
Newsgroups gmane.comp.file-systems.jfs.general
Message-ID <3BFF1023-E198-4797-A96A-EA158137157E__27895.8444753245$1412201425$gmane$org@dilger.ca>
On Oct 1, 2014, at 1:31 PM, Jan Kara <[email protected]> wrote:
> There are parts of struct inode which are used only by a few filesystems
> (e.g. i_dquot pointers, i_mapping->private_list, ...). Thus all the
> other filesystems are just wasting memory with these fields. On the
> other hand it isn't simple to just move these fields to filesystem
> specific part of inode because there is generic code which needs to peek
> into the fields and it is cumbersome to provide helpers into which fs
> has to stuff the field it is storing elsewhere.
> 
> We create a simple infrastructure which allows for optional inode fields
> stored in the fs-specific part of the inode. Accessing these fields has
> a slightly worse performance as we have to lookup their offset in the
> offset table stored in the superblock but in most cases this is
> acceptable. Notably, this offset-table mechanism is faster than having
> fs-specific hook functions which would need to be called to provide
> pointers to desired fields.
> 
> Signed-off-by: Jan Kara <[email protected]>
> ---
> include/linux/fs.h | 24 ++++++++++++++++++++++++
> 1 file changed, 24 insertions(+)
> 
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index 94187721ad41..977f8fb6ca88 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -615,6 +615,11 @@ struct inode {
> 	void			*i_private; /* fs or device private pointer */
> };
> 
> +/* Optional inode fields (stored in filesystems inode if the fs needs them) */
> +enum {

This should be a named enum, like "enum inode_field" or similar, so it
can be referenced below.

> +	IF_FIELD_NR	/* Number of optional inode fields */
> +};
> +
> static inline int inode_unhashed(struct inode *inode)
> {
> 	return hlist_unhashed(&inode->i_hash);
> @@ -1236,6 +1241,11 @@ struct super_block {
> 	void 			*s_fs_info;	/* Filesystem private info */
> 	unsigned int		s_max_links;
> 	fmode_t			s_mode;
> +	/*
> +	 * We could have here just a pointer to the offsets array but this
> +	 * way we save one dereference when looking up field offsets
> +	 */
> +	int			s_inode_fields[IF_FIELD_NR];
> 
> 	/* Granularity of c/m/atime in ns.
> 	   Cannot be worse than a second */
> @@ -1286,6 +1296,20 @@ struct super_block {
> 	struct rcu_head		rcu;
> };
> 
> +static inline void *inode_field(const struct inode *inode, int field)

This should use "enum inode_field" instead of int, so the compiler could
warn about invalid parameter values.  It might make sense to add a check:

        if (field < IF_FIELD_NR)

but I'm not sure if the overhead is worthwhile, unless it can always be
resolved at compile time.  That might be possible since this is a static
inline function.

Cheers, Andreas

> +{
> +	int offset = inode->i_sb->s_inode_fields[field];
> +
> +	if (!offset)	/* Field not present? */
> +		return NULL;

> +	return ((char *)inode) + offset;
> +}
> +
> +static inline void sb_init_inode_fields(struct super_block *sb, int *fields)
> +{
> +	memcpy(sb->s_inode_fields, fields, sizeof(int) * IF_FIELD_NR);
> +}
> +
> extern struct timespec current_fs_time(struct super_block *sb);
> 
> /*
> -- 
> 1.8.1.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
> the body of a message to [email protected]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


Cheers, Andreas

------------------------------------------------------------------------------
Meet PCI DSS 3.0 Compliance Requirements with EventLog Analyzer
Achieve PCI DSS 3.0 Compliant Status with Out-of-the-box PCI DSS Reports
Are you Audit-Ready for PCI DSS 3.0 Compliance? Download White paper
Comply to PCI DSS 3.0 Requirement 10 and 11.5 with EventLog Analyzer
http://pubads.g.doubleclick.net/gampad/clk?id=154622311&iu=/4140/ostg.clktrk

_______________________________________________
Jfs-discussion mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jfs-discussion
signature.asc (application/pgp-signature, 833 B)
-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - http://gpgtools.org

iQIVAwUBVCxsq3Kl2rkXzB/gAQK7DhAAg3ag4acKmQyynoKDAwfPBBgZ5l/zZ1PP
rpSmjKWN2iqW0CuA8fZqLBzJqSH7p1SKznutS+ivQfrMicLjy0fnwY30YddBmoeZ
2p29hh1F1g1cWTdw8JeQB+VrJcvXKGIAIskysYUuF5bix6Btltp/TjAHOTV8xS0O
sK7ZCRt6foheGufOQdfiuTWRJyloy8RyL4FOVn/UFGeuU7t9Ynh78wM+Qx/LrSQT
5ZnpFcE3GIFNKcn7SKhAkfve4KqFji1EzMutWmhkJRt14AGYE+kwrBlvZM+F+Xex
Pt+z0p/K5xMDiTFPsqFOITpHbx1QUoLVhXFsgb1+3HoYMTiJX+yYj3QDI9Ac0+kq
PcuYJ3RAfW/FHAiZ2GAeCDLwDFA44+/n77hsrWWi/3ne3G1de8o/fDhM5W5gWsBP
u6pFEv5Fu8912YbmBvJecMYpMr6VQbsm+BMm6HwZx4IYcqgNde87ZlYGfs4svSzY
QBNas2XXwWUR9pdnWyqdraQODQbAoPTqH9KIMveUh01HNffh6dU40/6Q/lZXg/wE
hvIV45qBTdF88aEaBDDAUT5Jgr8I+9YrFHgVAwhwGAXZvaPpVGC1MqIU4Pcypl3o
79a1zmZK0msglR0NA0PN+kr6nsCvpjNg23UwzSLJBP0HZEOiHDShDZrydsaXRxG8
iSQpGDVjxhg=
=ONs2
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.