aboutsummaryrefslogtreecommitdiffstats
path: root/fs/fuse/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/fuse/file.c')
-rw-r--r--fs/fuse/file.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index 823f84a69733..b83d7d86b527 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -993,9 +993,6 @@ static ssize_t fuse_direct_io(struct file *file, const char __user *buf,
993 ssize_t res = 0; 993 ssize_t res = 0;
994 struct fuse_req *req; 994 struct fuse_req *req;
995 995
996 if (is_bad_inode(inode))
997 return -EIO;
998
999 req = fuse_get_req(fc); 996 req = fuse_get_req(fc);
1000 if (IS_ERR(req)) 997 if (IS_ERR(req))
1001 return PTR_ERR(req); 998 return PTR_ERR(req);
@@ -1038,12 +1035,8 @@ static ssize_t fuse_direct_io(struct file *file, const char __user *buf,
1038 } 1035 }
1039 } 1036 }
1040 fuse_put_request(fc, req); 1037 fuse_put_request(fc, req);
1041 if (res > 0) { 1038 if (res > 0)
1042 if (write)
1043 fuse_write_update_size(inode, pos);
1044 *ppos = pos; 1039 *ppos = pos;
1045 }
1046 fuse_invalidate_attr(inode);
1047 1040
1048 return res; 1041 return res;
1049} 1042}
@@ -1051,7 +1044,17 @@ static ssize_t fuse_direct_io(struct file *file, const char __user *buf,
1051static ssize_t fuse_direct_read(struct file *file, char __user *buf, 1044static ssize_t fuse_direct_read(struct file *file, char __user *buf,
1052 size_t count, loff_t *ppos) 1045 size_t count, loff_t *ppos)
1053{ 1046{
1054 return fuse_direct_io(file, buf, count, ppos, 0); 1047 ssize_t res;
1048 struct inode *inode = file->f_path.dentry->d_inode;
1049
1050 if (is_bad_inode(inode))
1051 return -EIO;
1052
1053 res = fuse_direct_io(file, buf, count, ppos, 0);
1054
1055 fuse_invalidate_attr(inode);
1056
1057 return res;
1055} 1058}
1056 1059
1057static ssize_t fuse_direct_write(struct file *file, const char __user *buf, 1060static ssize_t fuse_direct_write(struct file *file, const char __user *buf,
@@ -1059,12 +1062,22 @@ static ssize_t fuse_direct_write(struct file *file, const char __user *buf,
1059{ 1062{
1060 struct inode *inode = file->f_path.dentry->d_inode; 1063 struct inode *inode = file->f_path.dentry->d_inode;
1061 ssize_t res; 1064 ssize_t res;
1065
1066 if (is_bad_inode(inode))
1067 return -EIO;
1068
1062 /* Don't allow parallel writes to the same file */ 1069 /* Don't allow parallel writes to the same file */
1063 mutex_lock(&inode->i_mutex); 1070 mutex_lock(&inode->i_mutex);
1064 res = generic_write_checks(file, ppos, &count, 0); 1071 res = generic_write_checks(file, ppos, &count, 0);
1065 if (!res) 1072 if (!res) {
1066 res = fuse_direct_io(file, buf, count, ppos, 1); 1073 res = fuse_direct_io(file, buf, count, ppos, 1);
1074 if (res > 0)
1075 fuse_write_update_size(inode, *ppos);
1076 }
1067 mutex_unlock(&inode->i_mutex); 1077 mutex_unlock(&inode->i_mutex);
1078
1079 fuse_invalidate_attr(inode);
1080
1068 return res; 1081 return res;
1069} 1082}
1070 1083