|
@@ -602,28 +602,7 @@ void gfs2_free_clones(struct gfs2_rgrpd *rgd)
|
|
|
*/
|
|
|
int gfs2_rsqa_alloc(struct gfs2_inode *ip)
|
|
|
{
|
|
|
- int error = 0;
|
|
|
-
|
|
|
- down_write(&ip->i_rw_mutex);
|
|
|
- if (ip->i_res)
|
|
|
- goto out;
|
|
|
-
|
|
|
- ip->i_res = kmem_cache_zalloc(gfs2_rsrv_cachep, GFP_NOFS);
|
|
|
- if (!ip->i_res) {
|
|
|
- error = -ENOMEM;
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
- 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;
|
|
|
+ return gfs2_qa_alloc(ip);
|
|
|
}
|
|
|
|
|
|
static void dump_rs(struct seq_file *seq, const struct gfs2_blkreserv *rs)
|
|
@@ -693,15 +672,12 @@ void gfs2_rs_deltree(struct gfs2_blkreserv *rs)
|
|
|
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))) {
|
|
|
- gfs2_rs_deltree(ip->i_res);
|
|
|
- BUG_ON(ip->i_res->rs_free);
|
|
|
- kmem_cache_free(gfs2_rsrv_cachep, ip->i_res);
|
|
|
- ip->i_res = NULL;
|
|
|
-
|
|
|
- gfs2_qa_delete(ip);
|
|
|
+ if ((wcount == NULL) || (atomic_read(wcount) <= 1)) {
|
|
|
+ gfs2_rs_deltree(&ip->i_res);
|
|
|
+ BUG_ON(ip->i_res.rs_free);
|
|
|
}
|
|
|
up_write(&ip->i_rw_mutex);
|
|
|
+ gfs2_qa_delete(ip, wcount);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -1465,7 +1441,7 @@ static void rs_insert(struct gfs2_inode *ip)
|
|
|
{
|
|
|
struct rb_node **newn, *parent = NULL;
|
|
|
int rc;
|
|
|
- struct gfs2_blkreserv *rs = ip->i_res;
|
|
|
+ struct gfs2_blkreserv *rs = &ip->i_res;
|
|
|
struct gfs2_rgrpd *rgd = rs->rs_rbm.rgd;
|
|
|
u64 fsblock = gfs2_rbm_to_block(&rs->rs_rbm);
|
|
|
|
|
@@ -1512,7 +1488,7 @@ static void rg_mblk_search(struct gfs2_rgrpd *rgd, struct gfs2_inode *ip,
|
|
|
{
|
|
|
struct gfs2_rbm rbm = { .rgd = rgd, };
|
|
|
u64 goal;
|
|
|
- struct gfs2_blkreserv *rs = ip->i_res;
|
|
|
+ struct gfs2_blkreserv *rs = &ip->i_res;
|
|
|
u32 extlen;
|
|
|
u32 free_blocks = rgd->rd_free_clone - rgd->rd_reserved;
|
|
|
int ret;
|
|
@@ -1583,7 +1559,7 @@ static u64 gfs2_next_unreserved_block(struct gfs2_rgrpd *rgd, u64 block,
|
|
|
}
|
|
|
|
|
|
if (n) {
|
|
|
- while ((rs_cmp(block, length, rs) == 0) && (ip->i_res != rs)) {
|
|
|
+ while ((rs_cmp(block, length, rs) == 0) && (&ip->i_res != rs)) {
|
|
|
block = gfs2_rbm_to_block(&rs->rs_rbm) + rs->rs_free;
|
|
|
n = n->rb_right;
|
|
|
if (n == NULL)
|
|
@@ -1993,7 +1969,7 @@ int gfs2_inplace_reserve(struct gfs2_inode *ip, struct gfs2_alloc_parms *ap)
|
|
|
{
|
|
|
struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
|
|
|
struct gfs2_rgrpd *begin = NULL;
|
|
|
- struct gfs2_blkreserv *rs = ip->i_res;
|
|
|
+ struct gfs2_blkreserv *rs = &ip->i_res;
|
|
|
int error = 0, rg_locked, flags = 0;
|
|
|
u64 last_unlinked = NO_BLOCK;
|
|
|
int loops = 0;
|
|
@@ -2122,7 +2098,7 @@ next_rgrp:
|
|
|
|
|
|
void gfs2_inplace_release(struct gfs2_inode *ip)
|
|
|
{
|
|
|
- struct gfs2_blkreserv *rs = ip->i_res;
|
|
|
+ struct gfs2_blkreserv *rs = &ip->i_res;
|
|
|
|
|
|
if (rs->rs_rgd_gh.gh_gl)
|
|
|
gfs2_glock_dq_uninit(&rs->rs_rgd_gh);
|
|
@@ -2276,7 +2252,7 @@ static void gfs2_rgrp_error(struct gfs2_rgrpd *rgd)
|
|
|
static void gfs2_adjust_reservation(struct gfs2_inode *ip,
|
|
|
const struct gfs2_rbm *rbm, unsigned len)
|
|
|
{
|
|
|
- struct gfs2_blkreserv *rs = ip->i_res;
|
|
|
+ struct gfs2_blkreserv *rs = &ip->i_res;
|
|
|
struct gfs2_rgrpd *rgd = rbm->rgd;
|
|
|
unsigned rlen;
|
|
|
u64 block;
|
|
@@ -2319,8 +2295,8 @@ static void gfs2_set_alloc_start(struct gfs2_rbm *rbm,
|
|
|
{
|
|
|
u64 goal;
|
|
|
|
|
|
- if (gfs2_rs_active(ip->i_res)) {
|
|
|
- *rbm = ip->i_res->rs_rbm;
|
|
|
+ if (gfs2_rs_active(&ip->i_res)) {
|
|
|
+ *rbm = ip->i_res.rs_rbm;
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -2374,7 +2350,7 @@ int gfs2_alloc_blocks(struct gfs2_inode *ip, u64 *bn, unsigned int *nblocks,
|
|
|
gfs2_alloc_extent(&rbm, dinode, nblocks);
|
|
|
block = gfs2_rbm_to_block(&rbm);
|
|
|
rbm.rgd->rd_last_alloc = block - rbm.rgd->rd_data0;
|
|
|
- if (gfs2_rs_active(ip->i_res))
|
|
|
+ if (gfs2_rs_active(&ip->i_res))
|
|
|
gfs2_adjust_reservation(ip, &rbm, *nblocks);
|
|
|
ndata = *nblocks;
|
|
|
if (dinode)
|