summaryrefslogtreecommitdiff
path: root/fs/gfs2/ops_file.c
diff options
context:
space:
mode:
authorSteven Whitehouse <swhiteho@redhat.com>2008-01-10 15:18:55 +0000
committerSteven Whitehouse <swhiteho@redhat.com>2008-01-25 08:18:25 +0000
commit6dbd822487d0a9f14432cb4680415b80656b63a2 (patch)
treef0391d598c27cd7c39c67cfa13799a784f4c389a /fs/gfs2/ops_file.c
parentac39aadd0440ae696e6dacaa8006ce1737b17008 (diff)
downloadlwn-6dbd822487d0a9f14432cb4680415b80656b63a2.tar.gz
lwn-6dbd822487d0a9f14432cb4680415b80656b63a2.zip
[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_file.c')
-rw-r--r--fs/gfs2/ops_file.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/fs/gfs2/ops_file.c b/fs/gfs2/ops_file.c
index 597f7ff2bc11..d7f4726ae0ce 100644
--- a/fs/gfs2/ops_file.c
+++ b/fs/gfs2/ops_file.c
@@ -364,9 +364,11 @@ static int gfs2_page_mkwrite(struct vm_area_struct *vma, struct page *page)
ret = gfs2_write_alloc_required(ip, pos, PAGE_CACHE_SIZE, &alloc_required);
if (ret || !alloc_required)
goto out_unlock;
-
- ip->i_alloc.al_requested = 0;
+ ret = -ENOMEM;
al = gfs2_alloc_get(ip);
+ if (al == NULL)
+ goto out_unlock;
+
ret = gfs2_quota_lock(ip, NO_QUOTA_CHANGE, NO_QUOTA_CHANGE);
if (ret)
goto out_alloc_put;