mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
fuse: remove fc->blkbits workaround for partial writes
Now that fuse is integrated with iomap for read/readahead, we can remove
the workaround that was added in commit bd24d2108e ("fuse: fix fuseblk
i_blkbits for iomap partial writes"), which was previously needed to
avoid a race condition where an iomap partial write may be overwritten
by a read if blocksize < PAGE_SIZE. Now that fuse does iomap
read/readahead, this is protected against since there is granular
uptodate tracking of blocks, which means this workaround can be removed.
Signed-off-by: Joanne Koong <joannelkoong@gmail.com>
Tested-by: syzbot@syzkaller.appspotmail.com
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
committed by
Christian Brauner
parent
4ea907108a
commit
93570c652b
@@ -1192,7 +1192,7 @@ static void fuse_fillattr(struct mnt_idmap *idmap, struct inode *inode,
|
||||
if (attr->blksize != 0)
|
||||
blkbits = ilog2(attr->blksize);
|
||||
else
|
||||
blkbits = fc->blkbits;
|
||||
blkbits = inode->i_sb->s_blocksize_bits;
|
||||
|
||||
stat->blksize = 1 << blkbits;
|
||||
}
|
||||
|
||||
@@ -981,14 +981,6 @@ struct fuse_conn {
|
||||
/* Request timeout (in jiffies). 0 = no timeout */
|
||||
unsigned int req_timeout;
|
||||
} timeout;
|
||||
|
||||
/*
|
||||
* This is a workaround until fuse uses iomap for reads.
|
||||
* For fuseblk servers, this represents the blocksize passed in at
|
||||
* mount time and for regular fuse servers, this is equivalent to
|
||||
* inode->i_blkbits.
|
||||
*/
|
||||
u8 blkbits;
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
@@ -291,7 +291,7 @@ 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;
|
||||
fi->cached_i_blkbits = inode->i_sb->s_blocksize_bits;
|
||||
|
||||
/*
|
||||
* Don't set the sticky bit in i_mode, unless we want the VFS
|
||||
@@ -1838,22 +1838,11 @@ 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
|
||||
fc->sync_fs = 1;
|
||||
} else {
|
||||
sb->s_blocksize = PAGE_SIZE;
|
||||
sb->s_blocksize_bits = PAGE_SHIFT;
|
||||
fc->blkbits = sb->s_blocksize_bits;
|
||||
}
|
||||
|
||||
sb->s_subtype = ctx->subtype;
|
||||
|
||||
Reference in New Issue
Block a user