diff options
author | Bob Peterson <rpeterso@redhat.com> | 2015-10-26 16:40:28 +0100 |
---|---|---|
committer | Bob Peterson <rpeterso@redhat.com> | 2015-11-24 15:38:44 +0100 |
commit | b54e9a0b92d44843f6719ae22b0f6daf5b9b23b4 (patch) | |
tree | c0e4f124cdd1208f046fc0fc19c090cc3204e6f3 /fs/gfs2/rgrp.c | |
parent | gfs2: Extended attribute readahead optimization (diff) | |
download | linux-b54e9a0b92d44843f6719ae22b0f6daf5b9b23b4.tar.xz linux-b54e9a0b92d44843f6719ae22b0f6daf5b9b23b4.zip |
GFS2: Extract quota data from reservations structure (revert 5407e24)
This patch basically reverts the majority of patch 5407e24.
That patch eliminated the gfs2_qadata structure in favor of just
using the reservations structure. The problem with doing that is that
it increases the size of the reservations structure. That is not an
issue until it comes time to fold the reservations structure into the
inode in memory so we know it's always there. By separating out the
quota structure again, we aren't punishing the non-quota users by
making all the inodes bigger, requiring more slab space. This patch
creates a new slab area to allocate the quota stuff so it's managed
a little more sanely.
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
Diffstat (limited to 'fs/gfs2/rgrp.c')
-rw-r--r-- | fs/gfs2/rgrp.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c index ac0a65d94a7e..cb30748e7b19 100644 --- a/fs/gfs2/rgrp.c +++ b/fs/gfs2/rgrp.c @@ -596,10 +596,11 @@ void gfs2_free_clones(struct gfs2_rgrpd *rgd) } /** - * gfs2_rs_alloc - make sure we have a reservation assigned to the inode + * gfs2_rsqa_alloc - make sure we have a reservation assigned to the inode + * plus a quota allocations data structure, if necessary * @ip: the inode for this reservation */ -int gfs2_rs_alloc(struct gfs2_inode *ip) +int gfs2_rsqa_alloc(struct gfs2_inode *ip) { int error = 0; @@ -614,6 +615,12 @@ int gfs2_rs_alloc(struct gfs2_inode *ip) } RB_CLEAR_NODE(&ip->i_res->rs_node); + error = gfs2_qa_alloc(ip); + if (error) { + kmem_cache_free(gfs2_rsrv_cachep, ip->i_res); + ip->i_res = NULL; + } + out: up_write(&ip->i_rw_mutex); return error; @@ -678,12 +685,12 @@ void gfs2_rs_deltree(struct gfs2_blkreserv *rs) } /** - * gfs2_rs_delete - delete a multi-block reservation + * gfs2_rsqa_delete - delete a multi-block reservation and quota allocation * @ip: The inode for this reservation * @wcount: The inode's write count, or NULL * */ -void gfs2_rs_delete(struct gfs2_inode *ip, atomic_t *wcount) +void gfs2_rsqa_delete(struct gfs2_inode *ip, atomic_t *wcount) { down_write(&ip->i_rw_mutex); if (ip->i_res && ((wcount == NULL) || (atomic_read(wcount) <= 1))) { @@ -691,6 +698,8 @@ void gfs2_rs_delete(struct gfs2_inode *ip, atomic_t *wcount) BUG_ON(ip->i_res->rs_free); kmem_cache_free(gfs2_rsrv_cachep, ip->i_res); ip->i_res = NULL; + + gfs2_qa_delete(ip); } up_write(&ip->i_rw_mutex); } |