fuse: fix blksize calculation
Don't use inode->i_blkbits which might be stale, instead calculate the blksize information from the freshly obtained attributes. Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
This commit is contained in:
parent
45c72cd73c
commit
203627bbc9
|
|
@ -775,6 +775,8 @@ static int fuse_link(struct dentry *entry, struct inode *newdir,
|
||||||
static void fuse_fillattr(struct inode *inode, struct fuse_attr *attr,
|
static void fuse_fillattr(struct inode *inode, struct fuse_attr *attr,
|
||||||
struct kstat *stat)
|
struct kstat *stat)
|
||||||
{
|
{
|
||||||
|
unsigned int blkbits;
|
||||||
|
|
||||||
stat->dev = inode->i_sb->s_dev;
|
stat->dev = inode->i_sb->s_dev;
|
||||||
stat->ino = attr->ino;
|
stat->ino = attr->ino;
|
||||||
stat->mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
|
stat->mode = (inode->i_mode & S_IFMT) | (attr->mode & 07777);
|
||||||
|
|
@ -790,7 +792,13 @@ static void fuse_fillattr(struct inode *inode, struct fuse_attr *attr,
|
||||||
stat->ctime.tv_nsec = attr->ctimensec;
|
stat->ctime.tv_nsec = attr->ctimensec;
|
||||||
stat->size = attr->size;
|
stat->size = attr->size;
|
||||||
stat->blocks = attr->blocks;
|
stat->blocks = attr->blocks;
|
||||||
stat->blksize = (1 << inode->i_blkbits);
|
|
||||||
|
if (attr->blksize != 0)
|
||||||
|
blkbits = ilog2(attr->blksize);
|
||||||
|
else
|
||||||
|
blkbits = inode->i_sb->s_blocksize_bits;
|
||||||
|
|
||||||
|
stat->blksize = 1 << blkbits;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fuse_do_getattr(struct inode *inode, struct kstat *stat,
|
static int fuse_do_getattr(struct inode *inode, struct kstat *stat,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue