diff options
Diffstat (limited to 'fs/gfs2/bmap.c')
-rw-r--r-- | fs/gfs2/bmap.c | 49 |
1 files changed, 7 insertions, 42 deletions
diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index 789f28cfdc20..11ffc56f1f81 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c | |||
@@ -1231,35 +1231,6 @@ int gfs2_file_dealloc(struct gfs2_inode *ip) | |||
1231 | } | 1231 | } |
1232 | 1232 | ||
1233 | /** | 1233 | /** |
1234 | * gfs2_write_calc_reserv - calculate number of blocks needed to write to a file | ||
1235 | * @ip: the file | ||
1236 | * @len: the number of bytes to be written to the file | ||
1237 | * @data_blocks: returns the number of data blocks required | ||
1238 | * @ind_blocks: returns the number of indirect blocks required | ||
1239 | * | ||
1240 | */ | ||
1241 | |||
1242 | void gfs2_write_calc_reserv(struct gfs2_inode *ip, unsigned int len, | ||
1243 | unsigned int *data_blocks, unsigned int *ind_blocks) | ||
1244 | { | ||
1245 | struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); | ||
1246 | unsigned int tmp; | ||
1247 | |||
1248 | if (gfs2_is_dir(ip)) { | ||
1249 | *data_blocks = DIV_ROUND_UP(len, sdp->sd_jbsize) + 2; | ||
1250 | *ind_blocks = 3 * (sdp->sd_max_jheight - 1); | ||
1251 | } else { | ||
1252 | *data_blocks = (len >> sdp->sd_sb.sb_bsize_shift) + 3; | ||
1253 | *ind_blocks = 3 * (sdp->sd_max_height - 1); | ||
1254 | } | ||
1255 | |||
1256 | for (tmp = *data_blocks; tmp > sdp->sd_diptrs;) { | ||
1257 | tmp = DIV_ROUND_UP(tmp, sdp->sd_inptrs); | ||
1258 | *ind_blocks += tmp; | ||
1259 | } | ||
1260 | } | ||
1261 | |||
1262 | /** | ||
1263 | * gfs2_write_alloc_required - figure out if a write will require an allocation | 1234 | * gfs2_write_alloc_required - figure out if a write will require an allocation |
1264 | * @ip: the file being written to | 1235 | * @ip: the file being written to |
1265 | * @offset: the offset to write to | 1236 | * @offset: the offset to write to |
@@ -1276,6 +1247,7 @@ int gfs2_write_alloc_required(struct gfs2_inode *ip, u64 offset, | |||
1276 | struct buffer_head bh; | 1247 | struct buffer_head bh; |
1277 | unsigned int shift; | 1248 | unsigned int shift; |
1278 | u64 lblock, lblock_stop, size; | 1249 | u64 lblock, lblock_stop, size; |
1250 | u64 end_of_file; | ||
1279 | 1251 | ||
1280 | *alloc_required = 0; | 1252 | *alloc_required = 0; |
1281 | 1253 | ||
@@ -1291,19 +1263,12 @@ int gfs2_write_alloc_required(struct gfs2_inode *ip, u64 offset, | |||
1291 | 1263 | ||
1292 | *alloc_required = 1; | 1264 | *alloc_required = 1; |
1293 | shift = sdp->sd_sb.sb_bsize_shift; | 1265 | shift = sdp->sd_sb.sb_bsize_shift; |
1294 | if (gfs2_is_dir(ip)) { | 1266 | BUG_ON(gfs2_is_dir(ip)); |
1295 | unsigned int bsize = sdp->sd_jbsize; | 1267 | end_of_file = (ip->i_disksize + sdp->sd_sb.sb_bsize - 1) >> shift; |
1296 | lblock = offset; | 1268 | lblock = offset >> shift; |
1297 | do_div(lblock, bsize); | 1269 | lblock_stop = (offset + len + sdp->sd_sb.sb_bsize - 1) >> shift; |
1298 | lblock_stop = offset + len + bsize - 1; | 1270 | if (lblock_stop > end_of_file) |
1299 | do_div(lblock_stop, bsize); | 1271 | return 0; |
1300 | } else { | ||
1301 | u64 end_of_file = (ip->i_disksize + sdp->sd_sb.sb_bsize - 1) >> shift; | ||
1302 | lblock = offset >> shift; | ||
1303 | lblock_stop = (offset + len + sdp->sd_sb.sb_bsize - 1) >> shift; | ||
1304 | if (lblock_stop > end_of_file) | ||
1305 | return 0; | ||
1306 | } | ||
1307 | 1272 | ||
1308 | size = (lblock_stop - lblock) << shift; | 1273 | size = (lblock_stop - lblock) << shift; |
1309 | do { | 1274 | do { |