diff options
author | Steven Whitehouse <swhiteho@redhat.com> | 2008-01-10 10:18:55 -0500 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2008-01-25 03:18:25 -0500 |
commit | 6dbd822487d0a9f14432cb4680415b80656b63a2 (patch) | |
tree | f0391d598c27cd7c39c67cfa13799a784f4c389a /fs/gfs2/ops_address.c | |
parent | ac39aadd0440ae696e6dacaa8006ce1737b17008 (diff) |
[GFS2] Reduce inode size by moving i_alloc out of line
It is possible to reduce the size of GFS2 inodes by taking the i_alloc
structure out of the gfs2_inode. This patch allocates the i_alloc
structure whenever its needed, and frees it afterward. This decreases
the amount of low memory we use at the expense of requiring a memory
allocation for each page or partial page that we write. A quick test
with postmark shows that the overhead is not measurable and I also note
that OCFS2 use the same approach.
In the future I'd like to solve the problem by shrinking down the size
of the members of the i_alloc structure, but for now, this reduces the
immediate problem of using too much low-memory on x86 and doesn't add
too much overhead.
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2/ops_address.c')
-rw-r--r-- | fs/gfs2/ops_address.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/fs/gfs2/ops_address.c b/fs/gfs2/ops_address.c index 37406a379e7a..38dbe99a30ed 100644 --- a/fs/gfs2/ops_address.c +++ b/fs/gfs2/ops_address.c | |||
@@ -646,7 +646,6 @@ static int gfs2_write_begin(struct file *file, struct address_space *mapping, | |||
646 | if (error) | 646 | if (error) |
647 | goto out_unlock; | 647 | goto out_unlock; |
648 | 648 | ||
649 | ip->i_alloc.al_requested = 0; | ||
650 | if (alloc_required) { | 649 | if (alloc_required) { |
651 | al = gfs2_alloc_get(ip); | 650 | al = gfs2_alloc_get(ip); |
652 | 651 | ||
@@ -823,7 +822,7 @@ static int gfs2_write_end(struct file *file, struct address_space *mapping, | |||
823 | struct gfs2_inode *ip = GFS2_I(inode); | 822 | struct gfs2_inode *ip = GFS2_I(inode); |
824 | struct gfs2_sbd *sdp = GFS2_SB(inode); | 823 | struct gfs2_sbd *sdp = GFS2_SB(inode); |
825 | struct buffer_head *dibh; | 824 | struct buffer_head *dibh; |
826 | struct gfs2_alloc *al = &ip->i_alloc; | 825 | struct gfs2_alloc *al = ip->i_alloc; |
827 | struct gfs2_dinode *di; | 826 | struct gfs2_dinode *di; |
828 | unsigned int from = pos & (PAGE_CACHE_SIZE - 1); | 827 | unsigned int from = pos & (PAGE_CACHE_SIZE - 1); |
829 | unsigned int to = from + len; | 828 | unsigned int to = from + len; |
@@ -861,7 +860,7 @@ static int gfs2_write_end(struct file *file, struct address_space *mapping, | |||
861 | brelse(dibh); | 860 | brelse(dibh); |
862 | gfs2_trans_end(sdp); | 861 | gfs2_trans_end(sdp); |
863 | failed: | 862 | failed: |
864 | if (al->al_requested) { | 863 | if (al) { |
865 | gfs2_inplace_release(ip); | 864 | gfs2_inplace_release(ip); |
866 | gfs2_quota_unlock(ip); | 865 | gfs2_quota_unlock(ip); |
867 | gfs2_alloc_put(ip); | 866 | gfs2_alloc_put(ip); |