From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752851AbcFVOfa (ORCPT ); Wed, 22 Jun 2016 10:35:30 -0400 Received: from mail-wm0-f45.google.com ([74.125.82.45]:37123 "EHLO mail-wm0-f45.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752784AbcFVOfV (ORCPT ); Wed, 22 Jun 2016 10:35:21 -0400 From: Miklos Szeredi To: Al Viro Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [PATCH 5/8] fuse: don't use ->d_time Date: Wed, 22 Jun 2016 16:35:07 +0200 Message-Id: <1466606110-24297-6-git-send-email-mszeredi@redhat.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1466606110-24297-1-git-send-email-mszeredi@redhat.com> References: <1466606110-24297-1-git-send-email-mszeredi@redhat.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Store in memory pointed to by ->d_fsdata. Use ->d_allocate() to allocate the storage. We could cast ->d_fsdata directly on 64bit archs, but I don't think this is worth the extra complexity. Signed-off-by: Miklos Szeredi --- fs/fuse/dir.c | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index ccd4971cc6c1..1a1dabb72036 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -37,37 +37,20 @@ static void fuse_advise_use_readdirplus(struct inode *dir) set_bit(FUSE_I_ADVISE_RDPLUS, &fi->state); } -#if BITS_PER_LONG >= 64 static inline void fuse_dentry_settime(struct dentry *entry, u64 time) { - entry->d_time = time; + *(u64 *) entry->d_fsdata = time; } static inline u64 fuse_dentry_time(struct dentry *entry) { - return entry->d_time; + return *(u64 *) entry->d_fsdata; } -#else -/* - * On 32 bit archs store the high 32 bits of time in d_fsdata - */ -static void fuse_dentry_settime(struct dentry *entry, u64 time) -{ - entry->d_time = time; - entry->d_fsdata = (void *) (unsigned long) (time >> 32); -} - -static u64 fuse_dentry_time(struct dentry *entry) -{ - return (u64) entry->d_time + - ((u64) (unsigned long) entry->d_fsdata << 32); -} -#endif /* * FUSE caches dentries and attributes with separate timeout. The * time in jiffies until the dentry/attributes are valid is stored in - * dentry->d_time and fuse_inode->i_time respectively. + * dentry->d_fsdata and fuse_inode->i_time respectively. */ /* @@ -272,8 +255,21 @@ static int invalid_nodeid(u64 nodeid) return !nodeid || nodeid == FUSE_ROOT_ID; } +static int fuse_dentry_allocate(struct dentry *dentry) +{ + dentry->d_fsdata = kzalloc(sizeof(u64), GFP_KERNEL); + + return dentry->d_fsdata ? 0 : -ENOMEM; +} +static void fuse_dentry_release(struct dentry *dentry) +{ + kfree(dentry->d_fsdata); +} + const struct dentry_operations fuse_dentry_operations = { .d_revalidate = fuse_dentry_revalidate, + .d_allocate = fuse_dentry_allocate, + .d_release = fuse_dentry_release, }; int fuse_valid_type(int m) -- 2.5.5