diff options
Diffstat (limited to 'fs/gfs2')
-rw-r--r-- | fs/gfs2/aops.c | 2 | ||||
-rw-r--r-- | fs/gfs2/bmap.c | 2 | ||||
-rw-r--r-- | fs/gfs2/file.c | 4 | ||||
-rw-r--r-- | fs/gfs2/ops_inode.c | 6 | ||||
-rw-r--r-- | fs/gfs2/quota.c | 3 | ||||
-rw-r--r-- | fs/gfs2/trans.h | 8 | ||||
-rw-r--r-- | fs/gfs2/xattr.c | 2 |
7 files changed, 20 insertions, 7 deletions
diff --git a/fs/gfs2/aops.c b/fs/gfs2/aops.c index 180ef8a6de6b..1bf178831ae8 100644 --- a/fs/gfs2/aops.c +++ b/fs/gfs2/aops.c | |||
@@ -663,6 +663,8 @@ static int gfs2_write_begin(struct file *file, struct address_space *mapping, | |||
663 | rblocks += RES_STATFS + RES_QUOTA; | 663 | rblocks += RES_STATFS + RES_QUOTA; |
664 | if (&ip->i_inode == sdp->sd_rindex) | 664 | if (&ip->i_inode == sdp->sd_rindex) |
665 | rblocks += 2 * RES_STATFS; | 665 | rblocks += 2 * RES_STATFS; |
666 | if (alloc_required) | ||
667 | rblocks += gfs2_rg_blocks(al); | ||
666 | 668 | ||
667 | error = gfs2_trans_begin(sdp, rblocks, | 669 | error = gfs2_trans_begin(sdp, rblocks, |
668 | PAGE_CACHE_SIZE/sdp->sd_sb.sb_bsize); | 670 | PAGE_CACHE_SIZE/sdp->sd_sb.sb_bsize); |
diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index 04513e997df6..5476c066d4ee 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c | |||
@@ -1151,7 +1151,7 @@ static int do_grow(struct inode *inode, u64 size) | |||
1151 | goto do_grow_qunlock; | 1151 | goto do_grow_qunlock; |
1152 | } | 1152 | } |
1153 | 1153 | ||
1154 | error = gfs2_trans_begin(sdp, RES_DINODE + 1, 0); | 1154 | error = gfs2_trans_begin(sdp, RES_DINODE + RES_STATFS + RES_RG_BIT, 0); |
1155 | if (error) | 1155 | if (error) |
1156 | goto do_grow_release; | 1156 | goto do_grow_release; |
1157 | 1157 | ||
diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c index daadcd2e755f..237ee6a940df 100644 --- a/fs/gfs2/file.c +++ b/fs/gfs2/file.c | |||
@@ -382,8 +382,10 @@ static int gfs2_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) | |||
382 | rblocks = RES_DINODE + ind_blocks; | 382 | rblocks = RES_DINODE + ind_blocks; |
383 | if (gfs2_is_jdata(ip)) | 383 | if (gfs2_is_jdata(ip)) |
384 | rblocks += data_blocks ? data_blocks : 1; | 384 | rblocks += data_blocks ? data_blocks : 1; |
385 | if (ind_blocks || data_blocks) | 385 | if (ind_blocks || data_blocks) { |
386 | rblocks += RES_STATFS + RES_QUOTA; | 386 | rblocks += RES_STATFS + RES_QUOTA; |
387 | rblocks += gfs2_rg_blocks(al); | ||
388 | } | ||
387 | ret = gfs2_trans_begin(sdp, rblocks, 0); | 389 | ret = gfs2_trans_begin(sdp, rblocks, 0); |
388 | if (ret) | 390 | if (ret) |
389 | goto out_trans_fail; | 391 | goto out_trans_fail; |
diff --git a/fs/gfs2/ops_inode.c b/fs/gfs2/ops_inode.c index 98a94cfc2bb2..fba00171d915 100644 --- a/fs/gfs2/ops_inode.c +++ b/fs/gfs2/ops_inode.c | |||
@@ -219,7 +219,7 @@ static int gfs2_link(struct dentry *old_dentry, struct inode *dir, | |||
219 | goto out_gunlock_q; | 219 | goto out_gunlock_q; |
220 | 220 | ||
221 | error = gfs2_trans_begin(sdp, sdp->sd_max_dirres + | 221 | error = gfs2_trans_begin(sdp, sdp->sd_max_dirres + |
222 | al->al_rgd->rd_length + | 222 | gfs2_rg_blocks(al) + |
223 | 2 * RES_DINODE + RES_STATFS + | 223 | 2 * RES_DINODE + RES_STATFS + |
224 | RES_QUOTA, 0); | 224 | RES_QUOTA, 0); |
225 | if (error) | 225 | if (error) |
@@ -884,7 +884,7 @@ static int gfs2_rename(struct inode *odir, struct dentry *odentry, | |||
884 | goto out_gunlock_q; | 884 | goto out_gunlock_q; |
885 | 885 | ||
886 | error = gfs2_trans_begin(sdp, sdp->sd_max_dirres + | 886 | error = gfs2_trans_begin(sdp, sdp->sd_max_dirres + |
887 | al->al_rgd->rd_length + | 887 | gfs2_rg_blocks(al) + |
888 | 4 * RES_DINODE + 4 * RES_LEAF + | 888 | 4 * RES_DINODE + 4 * RES_LEAF + |
889 | RES_STATFS + RES_QUOTA + 4, 0); | 889 | RES_STATFS + RES_QUOTA + 4, 0); |
890 | if (error) | 890 | if (error) |
@@ -1481,7 +1481,7 @@ retry: | |||
1481 | al->al_requested = data_blocks + ind_blocks; | 1481 | al->al_requested = data_blocks + ind_blocks; |
1482 | 1482 | ||
1483 | rblocks = RES_DINODE + ind_blocks + RES_STATFS + RES_QUOTA + | 1483 | rblocks = RES_DINODE + ind_blocks + RES_STATFS + RES_QUOTA + |
1484 | RES_RG_HDR + ip->i_alloc->al_rgd->rd_length; | 1484 | RES_RG_HDR + gfs2_rg_blocks(al); |
1485 | if (gfs2_is_jdata(ip)) | 1485 | if (gfs2_is_jdata(ip)) |
1486 | rblocks += data_blocks ? data_blocks : 1; | 1486 | rblocks += data_blocks ? data_blocks : 1; |
1487 | 1487 | ||
diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c index 9bc6dd9a5443..58a9b9998b42 100644 --- a/fs/gfs2/quota.c +++ b/fs/gfs2/quota.c | |||
@@ -815,7 +815,7 @@ static int do_sync(unsigned int num_qd, struct gfs2_quota_data **qda) | |||
815 | goto out_alloc; | 815 | goto out_alloc; |
816 | 816 | ||
817 | if (nalloc) | 817 | if (nalloc) |
818 | blocks += al->al_rgd->rd_length + nalloc * ind_blocks + RES_STATFS; | 818 | blocks += gfs2_rg_blocks(al) + nalloc * ind_blocks + RES_STATFS; |
819 | 819 | ||
820 | error = gfs2_trans_begin(sdp, blocks, 0); | 820 | error = gfs2_trans_begin(sdp, blocks, 0); |
821 | if (error) | 821 | if (error) |
@@ -1586,6 +1586,7 @@ static int gfs2_set_dqblk(struct super_block *sb, int type, qid_t id, | |||
1586 | error = gfs2_inplace_reserve(ip); | 1586 | error = gfs2_inplace_reserve(ip); |
1587 | if (error) | 1587 | if (error) |
1588 | goto out_alloc; | 1588 | goto out_alloc; |
1589 | blocks += gfs2_rg_blocks(al); | ||
1589 | } | 1590 | } |
1590 | 1591 | ||
1591 | error = gfs2_trans_begin(sdp, blocks + RES_DINODE + 1, 0); | 1592 | error = gfs2_trans_begin(sdp, blocks + RES_DINODE + 1, 0); |
diff --git a/fs/gfs2/trans.h b/fs/gfs2/trans.h index b849eb7ad37d..fb56b783e028 100644 --- a/fs/gfs2/trans.h +++ b/fs/gfs2/trans.h | |||
@@ -26,6 +26,14 @@ struct gfs2_glock; | |||
26 | #define RES_STATFS 1 | 26 | #define RES_STATFS 1 |
27 | #define RES_QUOTA 2 | 27 | #define RES_QUOTA 2 |
28 | 28 | ||
29 | /* reserve either the number of blocks to be allocated plus the rg header | ||
30 | * block, or all of the blocks in the rg, whichever is smaller */ | ||
31 | static inline unsigned int gfs2_rg_blocks(const struct gfs2_alloc *al) | ||
32 | { | ||
33 | return (al->al_requested < al->al_rgd->rd_length)? | ||
34 | al->al_requested + 1 : al->al_rgd->rd_length; | ||
35 | } | ||
36 | |||
29 | int gfs2_trans_begin(struct gfs2_sbd *sdp, unsigned int blocks, | 37 | int gfs2_trans_begin(struct gfs2_sbd *sdp, unsigned int blocks, |
30 | unsigned int revokes); | 38 | unsigned int revokes); |
31 | 39 | ||
diff --git a/fs/gfs2/xattr.c b/fs/gfs2/xattr.c index 776af6eb4bcb..30b58f07c8a6 100644 --- a/fs/gfs2/xattr.c +++ b/fs/gfs2/xattr.c | |||
@@ -734,7 +734,7 @@ static int ea_alloc_skeleton(struct gfs2_inode *ip, struct gfs2_ea_request *er, | |||
734 | goto out_gunlock_q; | 734 | goto out_gunlock_q; |
735 | 735 | ||
736 | error = gfs2_trans_begin(GFS2_SB(&ip->i_inode), | 736 | error = gfs2_trans_begin(GFS2_SB(&ip->i_inode), |
737 | blks + al->al_rgd->rd_length + | 737 | blks + gfs2_rg_blocks(al) + |
738 | RES_DINODE + RES_STATFS + RES_QUOTA, 0); | 738 | RES_DINODE + RES_STATFS + RES_QUOTA, 0); |
739 | if (error) | 739 | if (error) |
740 | goto out_ipres; | 740 | goto out_ipres; |