diff options
Diffstat (limited to 'fs/fuse/inode.c')
| -rw-r--r-- | fs/fuse/inode.c | 16 | 
1 files changed, 16 insertions, 0 deletions
| diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 67c2318bfc42..7ddfd2b3cc9c 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c @@ -289,6 +289,11 @@ void fuse_change_attributes_common(struct inode *inode, struct fuse_attr *attr,  		}  	} +	if (attr->blksize) +		fi->cached_i_blkbits = ilog2(attr->blksize); +	else +		fi->cached_i_blkbits = fc->blkbits; +  	/*  	 * Don't set the sticky bit in i_mode, unless we want the VFS  	 * to check permissions.  This prevents failures due to the @@ -1805,10 +1810,21 @@ int fuse_fill_super_common(struct super_block *sb, struct fuse_fs_context *ctx)  		err = -EINVAL;  		if (!sb_set_blocksize(sb, ctx->blksize))  			goto err; +		/* +		 * This is a workaround until fuse hooks into iomap for reads. +		 * Use PAGE_SIZE for the blocksize else if the writeback cache +		 * is enabled, buffered writes go through iomap and a read may +		 * overwrite partially written data if blocksize < PAGE_SIZE +		 */ +		fc->blkbits = sb->s_blocksize_bits; +		if (ctx->blksize != PAGE_SIZE && +		    !sb_set_blocksize(sb, PAGE_SIZE)) +			goto err;  #endif  	} else {  		sb->s_blocksize = PAGE_SIZE;  		sb->s_blocksize_bits = PAGE_SHIFT; +		fc->blkbits = sb->s_blocksize_bits;  	}  	sb->s_subtype = ctx->subtype; | 
