diff options
author | Steven Whitehouse <swhiteho@redhat.com> | 2013-12-06 10:16:14 +0000 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2014-01-03 10:00:31 +0000 |
commit | 7005c3e4ae42858dbb695b2d03d340af799b1f1b (patch) | |
tree | 25e3ce7a1dccb1784ca1b09f03a0382265b82370 /fs/gfs2/glops.c | |
parent | 7de41d36ff5885141a16c74a044936cf878c770f (diff) | |
download | op-kernel-dev-7005c3e4ae42858dbb695b2d03d340af799b1f1b.zip op-kernel-dev-7005c3e4ae42858dbb695b2d03d340af799b1f1b.tar.gz |
GFS2: Use range based functions for rgrp sync/invalidation
Each rgrp header is represented as a single extent on disk, so we
can calculate the position within the address space, since we are
using address spaces mapped 1:1 to the disk. This means that it
is possible to use the range based versions of filemap_fdatawrite/wait
and for invalidating the page cache.
Our eventual intent is to then be able to merge the address spaces
used for rgrps into a single address space, rather than to have
one for each glock, saving memory and reducing complexity.
Since during umount, the rgrp structures are disposed of before
the glocks, we need to store the extent information in the glock
so that is is available for a final invalidation. This patch uses
a field which is otherwise unused in rgrp glocks to do that, so
that we do not have to expand the size of a glock.
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2/glops.c')
-rw-r--r-- | fs/gfs2/glops.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c index f88dcd9..1b192c8d 100644 --- a/fs/gfs2/glops.c +++ b/fs/gfs2/glops.c @@ -142,8 +142,8 @@ static void rgrp_go_sync(struct gfs2_glock *gl) GLOCK_BUG_ON(gl, gl->gl_state != LM_ST_EXCLUSIVE); gfs2_log_flush(gl->gl_sbd, gl); - filemap_fdatawrite(metamapping); - error = filemap_fdatawait(metamapping); + filemap_fdatawrite_range(metamapping, gl->gl_vm.start, gl->gl_vm.end); + error = filemap_fdatawait_range(metamapping, gl->gl_vm.start, gl->gl_vm.end); mapping_set_error(metamapping, error); gfs2_ail_empty_gl(gl); @@ -170,7 +170,7 @@ static void rgrp_go_inval(struct gfs2_glock *gl, int flags) WARN_ON_ONCE(!(flags & DIO_METADATA)); gfs2_assert_withdraw(gl->gl_sbd, !atomic_read(&gl->gl_ail_count)); - truncate_inode_pages(mapping, 0); + truncate_inode_pages_range(mapping, gl->gl_vm.start, gl->gl_vm.end); if (gl->gl_object) { struct gfs2_rgrpd *rgd = (struct gfs2_rgrpd *)gl->gl_object; |