Skip to content

Commit 9153dac

Browse files
author
Andreas Gruenbacher
committed
gfs2: Turn gfs2_extent_map into gfs2_{get,alloc}_extent
Convert gfs2_extent_map to iomap and split it into gfs2_get_extent and gfs2_alloc_extent. Instead of hardcoding the extent size, pass it in via the extlen parameter. Signed-off-by: Andreas Gruenbacher <[email protected]>
1 parent 5499225 commit 9153dac

File tree

5 files changed

+53
-33
lines changed

5 files changed

+53
-33
lines changed

fs/gfs2/bmap.c

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1320,28 +1320,47 @@ int gfs2_block_map(struct inode *inode, sector_t lblock,
13201320
return ret;
13211321
}
13221322

1323-
/*
1324-
* Deprecated: do not use in new code
1325-
*/
1326-
int gfs2_extent_map(struct inode *inode, u64 lblock, int *new, u64 *dblock, unsigned *extlen)
1323+
int gfs2_get_extent(struct inode *inode, u64 lblock, u64 *dblock,
1324+
unsigned int *extlen)
13271325
{
1328-
struct buffer_head bh = { .b_state = 0, .b_blocknr = 0 };
1326+
unsigned int blkbits = inode->i_blkbits;
1327+
struct iomap iomap = { };
1328+
unsigned int len;
13291329
int ret;
1330-
int create = *new;
1331-
1332-
BUG_ON(!extlen);
1333-
BUG_ON(!dblock);
1334-
BUG_ON(!new);
1335-
1336-
bh.b_size = BIT(inode->i_blkbits + (create ? 0 : 5));
1337-
ret = gfs2_block_map(inode, lblock, &bh, create);
1338-
*extlen = bh.b_size >> inode->i_blkbits;
1339-
*dblock = bh.b_blocknr;
1340-
if (buffer_new(&bh))
1341-
*new = 1;
1342-
else
1343-
*new = 0;
1344-
return ret;
1330+
1331+
ret = gfs2_iomap_get(inode, lblock << blkbits, *extlen << blkbits,
1332+
&iomap);
1333+
if (ret)
1334+
return ret;
1335+
if (iomap.type != IOMAP_MAPPED)
1336+
return -EIO;
1337+
*dblock = iomap.addr >> blkbits;
1338+
len = iomap.length >> blkbits;
1339+
if (len < *extlen)
1340+
*extlen = len;
1341+
return 0;
1342+
}
1343+
1344+
int gfs2_alloc_extent(struct inode *inode, u64 lblock, u64 *dblock,
1345+
unsigned int *extlen, bool *new)
1346+
{
1347+
unsigned int blkbits = inode->i_blkbits;
1348+
struct iomap iomap = { };
1349+
unsigned int len;
1350+
int ret;
1351+
1352+
ret = gfs2_iomap_alloc(inode, lblock << blkbits, *extlen << blkbits,
1353+
&iomap);
1354+
if (ret)
1355+
return ret;
1356+
if (iomap.type != IOMAP_MAPPED)
1357+
return -EIO;
1358+
*dblock = iomap.addr >> blkbits;
1359+
len = iomap.length >> blkbits;
1360+
if (len < *extlen)
1361+
*extlen = len;
1362+
*new = iomap.flags & IOMAP_F_NEW;
1363+
return 0;
13451364
}
13461365

13471366
/*

fs/gfs2/bmap.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,10 @@ extern int gfs2_iomap_get(struct inode *inode, loff_t pos, loff_t length,
5353
struct iomap *iomap);
5454
extern int gfs2_iomap_alloc(struct inode *inode, loff_t pos, loff_t length,
5555
struct iomap *iomap);
56-
extern int gfs2_extent_map(struct inode *inode, u64 lblock, int *new,
57-
u64 *dblock, unsigned *extlen);
56+
extern int gfs2_get_extent(struct inode *inode, u64 lblock, u64 *dblock,
57+
unsigned int *extlen);
58+
extern int gfs2_alloc_extent(struct inode *inode, u64 lblock, u64 *dblock,
59+
unsigned *extlen, bool *new);
5860
extern int gfs2_setattr_size(struct inode *inode, u64 size);
5961
extern void gfs2_trim_blocks(struct inode *inode);
6062
extern int gfs2_truncatei_resume(struct gfs2_inode *ip);

fs/gfs2/dir.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ static int gfs2_dir_write_data(struct gfs2_inode *ip, const char *buf,
159159
unsigned int o;
160160
int copied = 0;
161161
int error = 0;
162-
int new = 0;
162+
bool new = false;
163163

164164
if (!size)
165165
return 0;
@@ -189,9 +189,9 @@ static int gfs2_dir_write_data(struct gfs2_inode *ip, const char *buf,
189189
amount = sdp->sd_sb.sb_bsize - o;
190190

191191
if (!extlen) {
192-
new = 1;
193-
error = gfs2_extent_map(&ip->i_inode, lblock, &new,
194-
&dblock, &extlen);
192+
extlen = 1;
193+
error = gfs2_alloc_extent(&ip->i_inode, lblock, &dblock,
194+
&extlen, &new);
195195
if (error)
196196
goto fail;
197197
error = -EIO;
@@ -286,15 +286,14 @@ static int gfs2_dir_read_data(struct gfs2_inode *ip, __be64 *buf,
286286
while (copied < size) {
287287
unsigned int amount;
288288
struct buffer_head *bh;
289-
int new;
290289

291290
amount = size - copied;
292291
if (amount > sdp->sd_sb.sb_bsize - o)
293292
amount = sdp->sd_sb.sb_bsize - o;
294293

295294
if (!extlen) {
296-
new = 0;
297-
error = gfs2_extent_map(&ip->i_inode, lblock, &new,
295+
extlen = 32;
296+
error = gfs2_get_extent(&ip->i_inode, lblock,
298297
&dblock, &extlen);
299298
if (error || !dblock)
300299
goto fail;

fs/gfs2/quota.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1375,8 +1375,8 @@ int gfs2_quota_init(struct gfs2_sbd *sdp)
13751375
unsigned int y;
13761376

13771377
if (!extlen) {
1378-
int new = 0;
1379-
error = gfs2_extent_map(&ip->i_inode, x, &new, &dblock, &extlen);
1378+
extlen = 32;
1379+
error = gfs2_get_extent(&ip->i_inode, x, &dblock, &extlen);
13801380
if (error)
13811381
goto fail;
13821382
}

fs/gfs2/recovery.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ int gfs2_replay_read_block(struct gfs2_jdesc *jd, unsigned int blk,
3434
{
3535
struct gfs2_inode *ip = GFS2_I(jd->jd_inode);
3636
struct gfs2_glock *gl = ip->i_gl;
37-
int new = 0;
3837
u64 dblock;
3938
u32 extlen;
4039
int error;
4140

42-
error = gfs2_extent_map(&ip->i_inode, blk, &new, &dblock, &extlen);
41+
extlen = 32;
42+
error = gfs2_get_extent(&ip->i_inode, blk, &dblock, &extlen);
4343
if (error)
4444
return error;
4545
if (!dblock) {

0 commit comments

Comments
 (0)