4 May 2012 11:57
[PATCH v2] fuse: fix stat call on 32 bit platforms
Pavel Shilovsky <piastry <at> etersoft.ru>
2012-05-04 09:57:53 GMT
2012-05-04 09:57:53 GMT
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 squashing attr->ino into inode->i_ino and returning
the last one all the time we call getattr.
Signed-off-by: Pavel Shilovsky <piastry <at> etersoft.ru>
---
fs/fuse/dir.c | 2 +-
fs/fuse/inode.c | 14 +++++++++++++-
2 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
index df5ac04..30c3976 100644
--- a/fs/fuse/dir.c
+++ b/fs/fuse/dir.c
<at> <at> -776,7 +776,7 <at> <at> 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 = inode->i_ino;
stat->mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
stat->nlink = attr->nlink;
stat->uid = attr->uid;
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
index 26783eb..6c2a272 100644
--- a/fs/fuse/inode.c
+++ b/fs/fuse/inode.c
<at> <at> -139,6 +139,18 <at> <at> 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)
{
<at> <at> -148,7 +160,7 <at> <at> 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;
--
--
1.7.1
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo <at> vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
RSS Feed