Merge tag 'trace-v5.11' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt...
[linux-2.6-microblaze.git] / fs / gfs2 / file.c
index bebde53..b39b339 100644 (file)
@@ -781,39 +781,39 @@ static int gfs2_fsync(struct file *file, loff_t start, loff_t end,
        return ret ? ret : ret1;
 }
 
-static ssize_t gfs2_file_direct_read(struct kiocb *iocb, struct iov_iter *to)
+static ssize_t gfs2_file_direct_read(struct kiocb *iocb, struct iov_iter *to,
+                                    struct gfs2_holder *gh)
 {
        struct file *file = iocb->ki_filp;
        struct gfs2_inode *ip = GFS2_I(file->f_mapping->host);
        size_t count = iov_iter_count(to);
-       struct gfs2_holder gh;
        ssize_t ret;
 
        if (!count)
                return 0; /* skip atime */
 
-       gfs2_holder_init(ip->i_gl, LM_ST_DEFERRED, 0, &gh);
-       ret = gfs2_glock_nq(&gh);
+       gfs2_holder_init(ip->i_gl, LM_ST_DEFERRED, 0, gh);
+       ret = gfs2_glock_nq(gh);
        if (ret)
                goto out_uninit;
 
        ret = iomap_dio_rw(iocb, to, &gfs2_iomap_ops, NULL,
                           is_sync_kiocb(iocb));
 
-       gfs2_glock_dq(&gh);
+       gfs2_glock_dq(gh);
 out_uninit:
-       gfs2_holder_uninit(&gh);
+       gfs2_holder_uninit(gh);
        return ret;
 }
 
-static ssize_t gfs2_file_direct_write(struct kiocb *iocb, struct iov_iter *from)
+static ssize_t gfs2_file_direct_write(struct kiocb *iocb, struct iov_iter *from,
+                                     struct gfs2_holder *gh)
 {
        struct file *file = iocb->ki_filp;
        struct inode *inode = file->f_mapping->host;
        struct gfs2_inode *ip = GFS2_I(inode);
        size_t len = iov_iter_count(from);
        loff_t offset = iocb->ki_pos;
-       struct gfs2_holder gh;
        ssize_t ret;
 
        /*
@@ -824,8 +824,8 @@ static ssize_t gfs2_file_direct_write(struct kiocb *iocb, struct iov_iter *from)
         * unfortunately, have the option of only flushing a range like the
         * VFS does.
         */
-       gfs2_holder_init(ip->i_gl, LM_ST_DEFERRED, 0, &gh);
-       ret = gfs2_glock_nq(&gh);
+       gfs2_holder_init(ip->i_gl, LM_ST_DEFERRED, 0, gh);
+       ret = gfs2_glock_nq(gh);
        if (ret)
                goto out_uninit;
 
@@ -835,11 +835,12 @@ static ssize_t gfs2_file_direct_write(struct kiocb *iocb, struct iov_iter *from)
 
        ret = iomap_dio_rw(iocb, from, &gfs2_iomap_ops, NULL,
                           is_sync_kiocb(iocb));
-
+       if (ret == -ENOTBLK)
+               ret = 0;
 out:
-       gfs2_glock_dq(&gh);
+       gfs2_glock_dq(gh);
 out_uninit:
-       gfs2_holder_uninit(&gh);
+       gfs2_holder_uninit(gh);
        return ret;
 }
 
@@ -851,7 +852,7 @@ static ssize_t gfs2_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
        ssize_t ret;
 
        if (iocb->ki_flags & IOCB_DIRECT) {
-               ret = gfs2_file_direct_read(iocb, to);
+               ret = gfs2_file_direct_read(iocb, to, &gh);
                if (likely(ret != -ENOTBLK))
                        return ret;
                iocb->ki_flags &= ~IOCB_DIRECT;
@@ -900,13 +901,12 @@ static ssize_t gfs2_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
        struct file *file = iocb->ki_filp;
        struct inode *inode = file_inode(file);
        struct gfs2_inode *ip = GFS2_I(inode);
+       struct gfs2_holder gh;
        ssize_t ret;
 
        gfs2_size_hint(file, iocb->ki_pos, iov_iter_count(from));
 
        if (iocb->ki_flags & IOCB_APPEND) {
-               struct gfs2_holder gh;
-
                ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, 0, &gh);
                if (ret)
                        return ret;
@@ -930,7 +930,7 @@ static ssize_t gfs2_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
                struct address_space *mapping = file->f_mapping;
                ssize_t buffered, ret2;
 
-               ret = gfs2_file_direct_write(iocb, from);
+               ret = gfs2_file_direct_write(iocb, from, &gh);
                if (ret < 0 || !iov_iter_count(from))
                        goto out_unlock;