]> Pileus Git - ~andy/linux/blobdiff - fs/fuse/file.c
memcg: update TODO list in Documentation
[~andy/linux] / fs / fuse / file.c
index e570081f9f76be0be1bc05deb9b260101d018b51..5c121fe19c5f9b6122b687cc14bbcd7b1bbe0dc9 100644 (file)
@@ -548,8 +548,7 @@ static void fuse_aio_complete(struct fuse_io_priv *io, int err, ssize_t pos)
                        res = io->bytes < 0 ? io->size : io->bytes;
 
                        if (!is_sync_kiocb(io->iocb)) {
-                               struct path *path = &io->iocb->ki_filp->f_path;
-                               struct inode *inode = path->dentry->d_inode;
+                               struct inode *inode = file_inode(io->iocb->ki_filp);
                                struct fuse_conn *fc = get_fuse_conn(inode);
                                struct fuse_inode *fi = get_fuse_inode(inode);
 
@@ -2470,13 +2469,16 @@ static long fuse_file_fallocate(struct file *file, int mode, loff_t offset,
                .mode = mode
        };
        int err;
+       bool lock_inode = !(mode & FALLOC_FL_KEEP_SIZE) ||
+                          (mode & FALLOC_FL_PUNCH_HOLE);
 
        if (fc->no_fallocate)
                return -EOPNOTSUPP;
 
-       if (mode & FALLOC_FL_PUNCH_HOLE) {
+       if (lock_inode) {
                mutex_lock(&inode->i_mutex);
-               fuse_set_nowrite(inode);
+               if (mode & FALLOC_FL_PUNCH_HOLE)
+                       fuse_set_nowrite(inode);
        }
 
        req = fuse_get_req_nopages(fc);
@@ -2511,8 +2513,9 @@ static long fuse_file_fallocate(struct file *file, int mode, loff_t offset,
        fuse_invalidate_attr(inode);
 
 out:
-       if (mode & FALLOC_FL_PUNCH_HOLE) {
-               fuse_release_nowrite(inode);
+       if (lock_inode) {
+               if (mode & FALLOC_FL_PUNCH_HOLE)
+                       fuse_release_nowrite(inode);
                mutex_unlock(&inode->i_mutex);
        }