* [PATCH v3] fuse: fix stat call on 32 bit platforms
@ 2012-05-10 15:49 Pavel Shilovsky
2012-05-14 15:14 ` [fuse-devel] " Miklos Szeredi
0 siblings, 1 reply; 2+ messages in thread
From: Pavel Shilovsky @ 2012-05-10 15:49 UTC (permalink / raw)
To: fuse-devel, linux-fsdevel
Now we store attr->ino at inode->i_ino, return attr->ino at the
first time and then return inode->i_ino if the attribute timeout
isn't expired. That's wrong on 32 bit platforms because attr->ino
is 64 bit and inode->i_ino is 32 bit in this case.
Fix this by saving 64 bit ino in fuse_inode structure and returning
it every time we call getattr. Also squash attr->ino into inode->i_ino
explicitly.
Signed-off-by: Pavel Shilovsky <piastry@etersoft.ru>
---
fs/fuse/dir.c | 3 ++-
fs/fuse/fuse_i.h | 3 +++
fs/fuse/inode.c | 17 ++++++++++++++++-
3 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
index df5ac04..b260c16 100644
--- a/fs/fuse/dir.c
+++ b/fs/fuse/dir.c
@@ -776,7 +776,7 @@ static void fuse_fillattr(struct inode *inode, struct fuse_attr *attr,
struct kstat *stat)
{
stat->dev = inode->i_sb->s_dev;
- stat->ino = attr->ino;
+ stat->ino = get_fuse_inode(inode)->ino;
stat->mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
stat->nlink = attr->nlink;
stat->uid = attr->uid;
@@ -863,6 +863,7 @@ int fuse_update_attributes(struct inode *inode, struct kstat *stat,
if (stat) {
generic_fillattr(inode, stat);
stat->mode = fi->orig_i_mode;
+ stat->ino = fi->ino;
}
}
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
index 572cefc..e2fefdf 100644
--- a/fs/fuse/fuse_i.h
+++ b/fs/fuse/fuse_i.h
@@ -100,6 +100,9 @@ struct fuse_inode {
/** List of writepage requestst (pending or sent) */
struct list_head writepages;
+
+ /** 64 bit inode number */
+ u64 ino;
};
struct fuse_conn;
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
index 26783eb..c5a5c4c 100644
--- a/fs/fuse/inode.c
+++ b/fs/fuse/inode.c
@@ -91,6 +91,7 @@ static struct inode *fuse_alloc_inode(struct super_block *sb)
fi->nlookup = 0;
fi->attr_version = 0;
fi->writectr = 0;
+ fi->ino = 0;
INIT_LIST_HEAD(&fi->write_files);
INIT_LIST_HEAD(&fi->queued_writes);
INIT_LIST_HEAD(&fi->writepages);
@@ -139,6 +140,18 @@ static int fuse_remount_fs(struct super_block *sb, int *flags, char *data)
return 0;
}
+/*
+ * ino_t is 32-bits on 32-bit arch. We have to squash the 64-bit value down
+ * so that it will fit.
+ */
+static ino_t fuse_uniqueid_to_ino(u64 uniqueid)
+{
+ ino_t ino = (ino_t) uniqueid;
+ if (sizeof(ino_t) < sizeof(u64))
+ ino ^= uniqueid >> (sizeof(u64) - sizeof(ino_t)) * 8;
+ return ino;
+}
+
void fuse_change_attributes_common(struct inode *inode, struct fuse_attr *attr,
u64 attr_valid)
{
@@ -148,7 +161,7 @@ void fuse_change_attributes_common(struct inode *inode, struct fuse_attr *attr,
fi->attr_version = ++fc->attr_version;
fi->i_time = attr_valid;
- inode->i_ino = attr->ino;
+ inode->i_ino = fuse_uniqueid_to_ino(attr->ino);
inode->i_mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
set_nlink(inode, attr->nlink);
inode->i_uid = attr->uid;
@@ -174,6 +187,8 @@ void fuse_change_attributes_common(struct inode *inode, struct fuse_attr *attr,
fi->orig_i_mode = inode->i_mode;
if (!(fc->flags & FUSE_DEFAULT_PERMISSIONS))
inode->i_mode &= ~S_ISVTX;
+
+ fi->ino = attr->ino;
}
void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr,
--
1.7.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [fuse-devel] [PATCH v3] fuse: fix stat call on 32 bit platforms
2012-05-10 15:49 [PATCH v3] fuse: fix stat call on 32 bit platforms Pavel Shilovsky
@ 2012-05-14 15:14 ` Miklos Szeredi
0 siblings, 0 replies; 2+ messages in thread
From: Miklos Szeredi @ 2012-05-14 15:14 UTC (permalink / raw)
To: Pavel Shilovsky; +Cc: fuse-devel, linux-fsdevel
Pavel Shilovsky <piastry@etersoft.ru> writes:
> Now we store attr->ino at inode->i_ino, return attr->ino at the
> first time and then return inode->i_ino if the attribute timeout
> isn't expired. That's wrong on 32 bit platforms because attr->ino
> is 64 bit and inode->i_ino is 32 bit in this case.
>
> Fix this by saving 64 bit ino in fuse_inode structure and returning
> it every time we call getattr. Also squash attr->ino into inode->i_ino
> explicitly.
>
> Signed-off-by: Pavel Shilovsky <piastry@etersoft.ru>
Thanks, applied with minor modifications.
Miklos
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2012-05-14 15:14 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-05-10 15:49 [PATCH v3] fuse: fix stat call on 32 bit platforms Pavel Shilovsky
2012-05-14 15:14 ` [fuse-devel] " Miklos Szeredi
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).