From patchwork Wed Oct 1 19:31:26 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kara X-Patchwork-Id: 5014151 Return-Path: X-Original-To: patchwork-ocfs2-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 6358EBEEA6 for ; Wed, 1 Oct 2014 19:32:40 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 7CDBD20263 for ; Wed, 1 Oct 2014 19:32:39 +0000 (UTC) Received: from userp1040.oracle.com (userp1040.oracle.com [156.151.31.81]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7D71F20165 for ; Wed, 1 Oct 2014 19:32:38 +0000 (UTC) Received: from acsinet22.oracle.com (acsinet22.oracle.com [141.146.126.238]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s91JWQWr032042 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 1 Oct 2014 19:32:27 GMT Received: from oss.oracle.com (oss-external.oracle.com [137.254.96.51]) by acsinet22.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s91JWQ0D025486 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Wed, 1 Oct 2014 19:32:26 GMT Received: from localhost ([127.0.0.1] helo=oss.oracle.com) by oss.oracle.com with esmtp (Exim 4.63) (envelope-from ) id 1XZPdS-0006mC-BN; Wed, 01 Oct 2014 12:32:26 -0700 Received: from ucsinet22.oracle.com ([156.151.31.94]) by oss.oracle.com with esmtp (Exim 4.63) (envelope-from ) id 1XZPcq-0006im-1d for ocfs2-devel@oss.oracle.com; Wed, 01 Oct 2014 12:31:48 -0700 Received: from aserp1060.oracle.com (aserp1060.oracle.com [141.146.126.71]) by ucsinet22.oracle.com (8.14.5+Sun/8.14.5) with ESMTP id s91JVlkE017134 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL) for ; Wed, 1 Oct 2014 19:31:47 GMT Received: from aserp2040.oracle.com (aserp2040.oracle.com [141.146.126.75]) by aserp1060.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s91JVkJY020018 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 1 Oct 2014 19:31:47 GMT Received: from pps.filterd (aserp2040.oracle.com [127.0.0.1]) by aserp2040.oracle.com (8.14.7/8.14.7) with SMTP id s91JVY2H018963 for ; Wed, 1 Oct 2014 19:31:46 GMT Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by aserp2040.oracle.com with ESMTP id 1prjttd1cw-1 (version=TLSv1/SSLv3 cipher=DHE-RSA-CAMELLIA256-SHA bits=256 verify=NOT) for ; Wed, 01 Oct 2014 19:31:46 +0000 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 93EEAAD35; Wed, 1 Oct 2014 19:31:42 +0000 (UTC) Received: by quack.suse.cz (Postfix, from userid 1000) id 2BE0381FC7; Wed, 1 Oct 2014 21:31:41 +0200 (CEST) From: Jan Kara To: linux-fsdevel@vger.kernel.org Date: Wed, 1 Oct 2014 21:31:26 +0200 Message-Id: <1412191894-9113-5-git-send-email-jack@suse.cz> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1412191894-9113-1-git-send-email-jack@suse.cz> References: <1412191894-9113-1-git-send-email-jack@suse.cz> X-ServerName: cantor2.suse.de X-Proofpoint-Virus-Version: vendor=nai engine=5600 definitions=7578 signatures=670531 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 spamscore=0 suspectscore=1 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1402240000 definitions=main-1410010191 Cc: Dave Kleikamp , jfs-discussion@lists.sourceforge.net, tytso@mit.edu, Jeff Mahoney , Mark Fasheh , Dave Chinner , reiserfs-devel@vger.kernel.org, xfs@oss.sgi.com, cluster-devel@redhat.com, Jan Kara , linux-ext4@vger.kernel.org, Steven Whitehouse , ocfs2-devel@oss.oracle.com Subject: [Ocfs2-devel] [PATCH 04/12] fs: Generic infrastructure for optional inode fields X-BeenThere: ocfs2-devel@oss.oracle.com X-Mailman-Version: 2.1.9 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ocfs2-devel-bounces@oss.oracle.com Errors-To: ocfs2-devel-bounces@oss.oracle.com X-Source-IP: acsinet22.oracle.com [141.146.126.238] X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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 --- 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 { + 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) +{ + 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); /*