]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
gfs2: Pass glock holder to gfs2_file_direct_{read,write}
authorAndreas Gruenbacher <agruenba@redhat.com>
Mon, 29 Jun 2020 22:47:15 +0000 (17:47 -0500)
committerAndreas Gruenbacher <agruenba@redhat.com>
Mon, 3 Aug 2020 11:20:13 +0000 (13:20 +0200)
Pass a pointer to the existing glock holder from
gfs2_file_{read,write}_iter to gfs2_file_direct_{read,write}
to save some stack space.

Suggested-by: Matthew Wilcox <willy@infradead.org>
Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
fs/gfs2/file.c

index bebde537ac8cf26d3329b817dccfb356f6e4e2c3..847adb97380d35ea802fbdfb723aee7c6fc14830 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;
 
@@ -837,9 +837,9 @@ static ssize_t gfs2_file_direct_write(struct kiocb *iocb, struct iov_iter *from)
                           is_sync_kiocb(iocb));
 
 out:
-       gfs2_glock_dq(&gh);
+       gfs2_glock_dq(gh);
 out_uninit:
-       gfs2_holder_uninit(&gh);
+       gfs2_holder_uninit(gh);
        return ret;
 }
 
@@ -851,7 +851,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 +900,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 +929,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;