|
@@ -629,7 +629,8 @@ static void fuse_read_update_size(struct inode *inode, loff_t size,
|
|
struct fuse_inode *fi = get_fuse_inode(inode);
|
|
struct fuse_inode *fi = get_fuse_inode(inode);
|
|
|
|
|
|
spin_lock(&fc->lock);
|
|
spin_lock(&fc->lock);
|
|
- if (attr_ver == fi->attr_version && size < inode->i_size) {
|
|
|
|
|
|
+ if (attr_ver == fi->attr_version && size < inode->i_size &&
|
|
|
|
+ !test_bit(FUSE_I_SIZE_UNSTABLE, &fi->state)) {
|
|
fi->attr_version = ++fc->attr_version;
|
|
fi->attr_version = ++fc->attr_version;
|
|
i_size_write(inode, size);
|
|
i_size_write(inode, size);
|
|
}
|
|
}
|
|
@@ -1032,12 +1033,16 @@ static ssize_t fuse_perform_write(struct file *file,
|
|
{
|
|
{
|
|
struct inode *inode = mapping->host;
|
|
struct inode *inode = mapping->host;
|
|
struct fuse_conn *fc = get_fuse_conn(inode);
|
|
struct fuse_conn *fc = get_fuse_conn(inode);
|
|
|
|
+ struct fuse_inode *fi = get_fuse_inode(inode);
|
|
int err = 0;
|
|
int err = 0;
|
|
ssize_t res = 0;
|
|
ssize_t res = 0;
|
|
|
|
|
|
if (is_bad_inode(inode))
|
|
if (is_bad_inode(inode))
|
|
return -EIO;
|
|
return -EIO;
|
|
|
|
|
|
|
|
+ if (inode->i_size < pos + iov_iter_count(ii))
|
|
|
|
+ set_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
|
|
|
|
+
|
|
do {
|
|
do {
|
|
struct fuse_req *req;
|
|
struct fuse_req *req;
|
|
ssize_t count;
|
|
ssize_t count;
|
|
@@ -1073,6 +1078,7 @@ static ssize_t fuse_perform_write(struct file *file,
|
|
if (res > 0)
|
|
if (res > 0)
|
|
fuse_write_update_size(inode, pos);
|
|
fuse_write_update_size(inode, pos);
|
|
|
|
|
|
|
|
+ clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->state);
|
|
fuse_invalidate_attr(inode);
|
|
fuse_invalidate_attr(inode);
|
|
|
|
|
|
return res > 0 ? res : err;
|
|
return res > 0 ? res : err;
|