Commit 4c5c3010 authored by Andreas Gruenbacher's avatar Andreas Gruenbacher

gfs2: Pass glock holder to gfs2_file_direct_{read,write}

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: default avatarMatthew Wilcox <willy@infradead.org>
Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
parent 5deaf1f6
...@@ -781,39 +781,39 @@ static int gfs2_fsync(struct file *file, loff_t start, loff_t end, ...@@ -781,39 +781,39 @@ static int gfs2_fsync(struct file *file, loff_t start, loff_t end,
return ret ? ret : ret1; 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 file *file = iocb->ki_filp;
struct gfs2_inode *ip = GFS2_I(file->f_mapping->host); struct gfs2_inode *ip = GFS2_I(file->f_mapping->host);
size_t count = iov_iter_count(to); size_t count = iov_iter_count(to);
struct gfs2_holder gh;
ssize_t ret; ssize_t ret;
if (!count) if (!count)
return 0; /* skip atime */ return 0; /* skip atime */
gfs2_holder_init(ip->i_gl, LM_ST_DEFERRED, 0, &gh); gfs2_holder_init(ip->i_gl, LM_ST_DEFERRED, 0, gh);
ret = gfs2_glock_nq(&gh); ret = gfs2_glock_nq(gh);
if (ret) if (ret)
goto out_uninit; goto out_uninit;
ret = iomap_dio_rw(iocb, to, &gfs2_iomap_ops, NULL, ret = iomap_dio_rw(iocb, to, &gfs2_iomap_ops, NULL,
is_sync_kiocb(iocb)); is_sync_kiocb(iocb));
gfs2_glock_dq(&gh); gfs2_glock_dq(gh);
out_uninit: out_uninit:
gfs2_holder_uninit(&gh); gfs2_holder_uninit(gh);
return ret; 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 file *file = iocb->ki_filp;
struct inode *inode = file->f_mapping->host; struct inode *inode = file->f_mapping->host;
struct gfs2_inode *ip = GFS2_I(inode); struct gfs2_inode *ip = GFS2_I(inode);
size_t len = iov_iter_count(from); size_t len = iov_iter_count(from);
loff_t offset = iocb->ki_pos; loff_t offset = iocb->ki_pos;
struct gfs2_holder gh;
ssize_t ret; ssize_t ret;
/* /*
...@@ -824,8 +824,8 @@ static ssize_t gfs2_file_direct_write(struct kiocb *iocb, struct iov_iter *from) ...@@ -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 * unfortunately, have the option of only flushing a range like the
* VFS does. * VFS does.
*/ */
gfs2_holder_init(ip->i_gl, LM_ST_DEFERRED, 0, &gh); gfs2_holder_init(ip->i_gl, LM_ST_DEFERRED, 0, gh);
ret = gfs2_glock_nq(&gh); ret = gfs2_glock_nq(gh);
if (ret) if (ret)
goto out_uninit; goto out_uninit;
...@@ -837,9 +837,9 @@ static ssize_t gfs2_file_direct_write(struct kiocb *iocb, struct iov_iter *from) ...@@ -837,9 +837,9 @@ static ssize_t gfs2_file_direct_write(struct kiocb *iocb, struct iov_iter *from)
is_sync_kiocb(iocb)); is_sync_kiocb(iocb));
out: out:
gfs2_glock_dq(&gh); gfs2_glock_dq(gh);
out_uninit: out_uninit:
gfs2_holder_uninit(&gh); gfs2_holder_uninit(gh);
return ret; return ret;
} }
...@@ -851,7 +851,7 @@ static ssize_t gfs2_file_read_iter(struct kiocb *iocb, struct iov_iter *to) ...@@ -851,7 +851,7 @@ static ssize_t gfs2_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
ssize_t ret; ssize_t ret;
if (iocb->ki_flags & IOCB_DIRECT) { 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)) if (likely(ret != -ENOTBLK))
return ret; return ret;
iocb->ki_flags &= ~IOCB_DIRECT; iocb->ki_flags &= ~IOCB_DIRECT;
...@@ -900,13 +900,12 @@ static ssize_t gfs2_file_write_iter(struct kiocb *iocb, struct iov_iter *from) ...@@ -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 file *file = iocb->ki_filp;
struct inode *inode = file_inode(file); struct inode *inode = file_inode(file);
struct gfs2_inode *ip = GFS2_I(inode); struct gfs2_inode *ip = GFS2_I(inode);
struct gfs2_holder gh;
ssize_t ret; ssize_t ret;
gfs2_size_hint(file, iocb->ki_pos, iov_iter_count(from)); gfs2_size_hint(file, iocb->ki_pos, iov_iter_count(from));
if (iocb->ki_flags & IOCB_APPEND) { if (iocb->ki_flags & IOCB_APPEND) {
struct gfs2_holder gh;
ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, 0, &gh); ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, 0, &gh);
if (ret) if (ret)
return ret; return ret;
...@@ -930,7 +929,7 @@ static ssize_t gfs2_file_write_iter(struct kiocb *iocb, struct iov_iter *from) ...@@ -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; struct address_space *mapping = file->f_mapping;
ssize_t buffered, ret2; 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)) if (ret < 0 || !iov_iter_count(from))
goto out_unlock; goto out_unlock;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment