Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 270000
b: refs/heads/master
c: 54335b1
h: refs/heads/master
v: v3
  • Loading branch information
Steven Whitehouse committed Oct 21, 2011
1 parent b515ceb commit 4279eba
Show file tree
Hide file tree
Showing 10 changed files with 45 additions and 46 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 8339ee543ece6e2dcc1bbd97d5350163c198cf00
refs/heads/master: 54335b1fca27b84baa75b1f45985d98262003837
2 changes: 1 addition & 1 deletion trunk/fs/gfs2/aops.c
Original file line number Diff line number Diff line change
Expand Up @@ -663,7 +663,7 @@ static int gfs2_write_begin(struct file *file, struct address_space *mapping,
if (&ip->i_inode == sdp->sd_rindex)
rblocks += 2 * RES_STATFS;
if (alloc_required)
rblocks += gfs2_rg_blocks(al);
rblocks += gfs2_rg_blocks(ip);

error = gfs2_trans_begin(sdp, rblocks,
PAGE_CACHE_SIZE/sdp->sd_sb.sb_bsize);
Expand Down
6 changes: 3 additions & 3 deletions trunk/fs/gfs2/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -397,7 +397,7 @@ static int gfs2_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
rblocks += data_blocks ? data_blocks : 1;
if (ind_blocks || data_blocks) {
rblocks += RES_STATFS + RES_QUOTA;
rblocks += gfs2_rg_blocks(al);
rblocks += gfs2_rg_blocks(ip);
}
ret = gfs2_trans_begin(sdp, rblocks, 0);
if (ret)
Expand Down Expand Up @@ -823,7 +823,7 @@ static void calc_max_reserv(struct gfs2_inode *ip, loff_t max, loff_t *len,
unsigned int *data_blocks, unsigned int *ind_blocks)
{
const struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
unsigned int max_blocks = ip->i_alloc->al_rgd->rd_free_clone;
unsigned int max_blocks = ip->i_rgd->rd_free_clone;
unsigned int tmp, max_data = max_blocks - 3 * (sdp->sd_max_height - 1);

for (tmp = max_data; tmp > sdp->sd_diptrs;) {
Expand Down Expand Up @@ -912,7 +912,7 @@ static long gfs2_fallocate(struct file *file, int mode, loff_t offset,
al->al_requested = data_blocks + ind_blocks;

rblocks = RES_DINODE + ind_blocks + RES_STATFS + RES_QUOTA +
RES_RG_HDR + gfs2_rg_blocks(al);
RES_RG_HDR + gfs2_rg_blocks(ip);
if (gfs2_is_jdata(ip))
rblocks += data_blocks ? data_blocks : 1;

Expand Down
3 changes: 1 addition & 2 deletions trunk/fs/gfs2/incore.h
Original file line number Diff line number Diff line change
Expand Up @@ -256,8 +256,6 @@ struct gfs2_alloc {
unsigned int al_line;
char *al_file;
struct gfs2_holder al_rgd_gh;
struct gfs2_rgrpd *al_rgd;

};

enum {
Expand All @@ -279,6 +277,7 @@ struct gfs2_inode {
struct gfs2_holder i_iopen_gh;
struct gfs2_holder i_gh; /* for prepare/commit_write only */
struct gfs2_alloc *i_alloc;
struct gfs2_rgrpd *i_rgd;
u64 i_goal; /* goal block for allocations */
struct rw_semaphore i_rw_mutex;
struct list_head i_trunc_list;
Expand Down
12 changes: 5 additions & 7 deletions trunk/fs/gfs2/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -583,7 +583,7 @@ static int link_dinode(struct gfs2_inode *dip, const struct qstr *name,
goto fail_quota_locks;

error = gfs2_trans_begin(sdp, sdp->sd_max_dirres +
al->al_rgd->rd_length +
dip->i_rgd->rd_length +
2 * RES_DINODE +
RES_STATFS + RES_QUOTA, 0);
if (error)
Expand Down Expand Up @@ -613,8 +613,7 @@ static int link_dinode(struct gfs2_inode *dip, const struct qstr *name,
gfs2_trans_end(sdp);

fail_ipreserv:
if (dip->i_alloc->al_rgd)
gfs2_inplace_release(dip);
gfs2_inplace_release(dip);

fail_quota_locks:
gfs2_quota_unlock(dip);
Expand Down Expand Up @@ -731,8 +730,7 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
brelse(bh);

gfs2_trans_end(sdp);
if (dip->i_alloc->al_rgd)
gfs2_inplace_release(dip);
gfs2_inplace_release(dip);
gfs2_quota_unlock(dip);
gfs2_alloc_put(dip);
mark_inode_dirty(inode);
Expand Down Expand Up @@ -896,7 +894,7 @@ static int gfs2_link(struct dentry *old_dentry, struct inode *dir,
goto out_gunlock_q;

error = gfs2_trans_begin(sdp, sdp->sd_max_dirres +
gfs2_rg_blocks(al) +
gfs2_rg_blocks(dip) +
2 * RES_DINODE + RES_STATFS +
RES_QUOTA, 0);
if (error)
Expand Down Expand Up @@ -1371,7 +1369,7 @@ static int gfs2_rename(struct inode *odir, struct dentry *odentry,
goto out_gunlock_q;

error = gfs2_trans_begin(sdp, sdp->sd_max_dirres +
gfs2_rg_blocks(al) +
gfs2_rg_blocks(ndip) +
4 * RES_DINODE + 4 * RES_LEAF +
RES_STATFS + RES_QUOTA + 4, 0);
if (error)
Expand Down
4 changes: 2 additions & 2 deletions trunk/fs/gfs2/quota.c
Original file line number Diff line number Diff line change
Expand Up @@ -813,7 +813,7 @@ static int do_sync(unsigned int num_qd, struct gfs2_quota_data **qda)
goto out_alloc;

if (nalloc)
blocks += gfs2_rg_blocks(al) + nalloc * ind_blocks + RES_STATFS;
blocks += gfs2_rg_blocks(ip) + nalloc * ind_blocks + RES_STATFS;

error = gfs2_trans_begin(sdp, blocks, 0);
if (error)
Expand Down Expand Up @@ -1598,7 +1598,7 @@ static int gfs2_set_dqblk(struct super_block *sb, int type, qid_t id,
error = gfs2_inplace_reserve(ip);
if (error)
goto out_alloc;
blocks += gfs2_rg_blocks(al);
blocks += gfs2_rg_blocks(ip);
}

/* Some quotas span block boundaries and can update two blocks,
Expand Down
51 changes: 25 additions & 26 deletions trunk/fs/gfs2/rgrp.c
Original file line number Diff line number Diff line change
Expand Up @@ -882,24 +882,21 @@ struct gfs2_alloc *gfs2_alloc_get(struct gfs2_inode *ip)
/**
* try_rgrp_fit - See if a given reservation will fit in a given RG
* @rgd: the RG data
* @al: the struct gfs2_alloc structure describing the reservation
* @ip: the inode
*
* If there's room for the requested blocks to be allocated from the RG:
* Sets the $al_rgd field in @al.
*
* Returns: 1 on success (it fits), 0 on failure (it doesn't fit)
*/

static int try_rgrp_fit(struct gfs2_rgrpd *rgd, struct gfs2_alloc *al)
static int try_rgrp_fit(const struct gfs2_rgrpd *rgd, const struct gfs2_inode *ip)
{
const struct gfs2_alloc *al = ip->i_alloc;

if (rgd->rd_flags & (GFS2_RGF_NOALLOC | GFS2_RDF_ERROR))
return 0;

if (rgd->rd_free_clone >= al->al_requested) {
al->al_rgd = rgd;
if (rgd->rd_free_clone >= al->al_requested)
return 1;
}

return 0;
}

Expand Down Expand Up @@ -985,7 +982,10 @@ static int get_local_rgrp(struct gfs2_inode *ip, u64 *last_unlinked)
int error, rg_locked;
int loops = 0;

rgd = begin = gfs2_blk2rgrpd(sdp, ip->i_goal);
if (ip->i_rgd && rgrp_contains_block(ip->i_rgd, ip->i_goal))
rgd = begin = ip->i_rgd;
else
rgd = begin = gfs2_blk2rgrpd(sdp, ip->i_goal);

if (rgd == NULL)
return -EBADSLT;
Expand All @@ -1002,8 +1002,10 @@ static int get_local_rgrp(struct gfs2_inode *ip, u64 *last_unlinked)
}
switch (error) {
case 0:
if (try_rgrp_fit(rgd, al))
if (try_rgrp_fit(rgd, ip)) {
ip->i_rgd = rgd;
return 0;
}
if (rgd->rd_flags & GFS2_RDF_CHECK)
try_rgrp_unlink(rgd, last_unlinked, ip->i_no_addr);
if (!rg_locked)
Expand All @@ -1014,7 +1016,6 @@ static int get_local_rgrp(struct gfs2_inode *ip, u64 *last_unlinked)
if (rgd == begin)
loops++;
break;

default:
return error;
}
Expand Down Expand Up @@ -1042,21 +1043,20 @@ int gfs2_inplace_reserve_i(struct gfs2_inode *ip,
if (gfs2_assert_warn(sdp, al->al_requested))
return -EINVAL;

try_again:
do {
error = get_local_rgrp(ip, &last_unlinked);
/* If there is no space, flushing the log may release some */
if (error) {
if (ip == GFS2_I(sdp->sd_rindex) &&
!sdp->sd_rindex_uptodate) {
error = gfs2_ri_update(ip);
if (error)
return error;
goto try_again;
}
gfs2_log_flush(sdp, NULL);
if (error != -ENOSPC)
break;
/* Check that fs hasn't grown if writing to rindex */
if (ip == GFS2_I(sdp->sd_rindex) && !sdp->sd_rindex_uptodate) {
error = gfs2_ri_update(ip);
if (error)
break;
continue;
}
} while (error && tries++ < 3);
/* Flushing the log may release space */
gfs2_log_flush(sdp, NULL);
} while (tries++ < 3);

if (error)
return error;
Expand Down Expand Up @@ -1086,7 +1086,6 @@ void gfs2_inplace_release(struct gfs2_inode *ip)
al->al_alloced, al->al_requested, al->al_file,
al->al_line);

al->al_rgd = NULL;
if (al->al_rgd_gh.gh_gl)
gfs2_glock_dq_uninit(&al->al_rgd_gh);
}
Expand Down Expand Up @@ -1339,7 +1338,7 @@ int gfs2_alloc_block(struct gfs2_inode *ip, u64 *bn, unsigned int *n)
if (al == NULL)
return -ECANCELED;

rgd = al->al_rgd;
rgd = ip->i_rgd;

if (rgrp_contains_block(rgd, ip->i_goal))
goal = ip->i_goal - rgd->rd_data0;
Expand Down Expand Up @@ -1398,7 +1397,7 @@ int gfs2_alloc_di(struct gfs2_inode *dip, u64 *bn, u64 *generation)
{
struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
struct gfs2_alloc *al = dip->i_alloc;
struct gfs2_rgrpd *rgd = al->al_rgd;
struct gfs2_rgrpd *rgd = dip->i_rgd;
u32 blk;
u64 block;
unsigned int n = 1;
Expand Down
1 change: 1 addition & 0 deletions trunk/fs/gfs2/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -1574,6 +1574,7 @@ static struct inode *gfs2_alloc_inode(struct super_block *sb)
if (ip) {
ip->i_flags = 0;
ip->i_gl = NULL;
ip->i_rgd = NULL;
}
return &ip->i_inode;
}
Expand Down
8 changes: 5 additions & 3 deletions trunk/fs/gfs2/trans.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,12 @@ struct gfs2_glock;

/* reserve either the number of blocks to be allocated plus the rg header
* block, or all of the blocks in the rg, whichever is smaller */
static inline unsigned int gfs2_rg_blocks(const struct gfs2_alloc *al)
static inline unsigned int gfs2_rg_blocks(const struct gfs2_inode *ip)
{
return (al->al_requested < al->al_rgd->rd_length)?
al->al_requested + 1 : al->al_rgd->rd_length;
const struct gfs2_alloc *al = ip->i_alloc;
if (al->al_requested < ip->i_rgd->rd_length)
return al->al_requested + 1;
return ip->i_rgd->rd_length;
}

extern int gfs2_trans_begin(struct gfs2_sbd *sdp, unsigned int blocks,
Expand Down
2 changes: 1 addition & 1 deletion trunk/fs/gfs2/xattr.c
Original file line number Diff line number Diff line change
Expand Up @@ -727,7 +727,7 @@ static int ea_alloc_skeleton(struct gfs2_inode *ip, struct gfs2_ea_request *er,
goto out_gunlock_q;

error = gfs2_trans_begin(GFS2_SB(&ip->i_inode),
blks + gfs2_rg_blocks(al) +
blks + gfs2_rg_blocks(ip) +
RES_DINODE + RES_STATFS + RES_QUOTA, 0);
if (error)
goto out_ipres;
Expand Down

0 comments on commit 4279eba

Please sign in to comment.