diff options
author | Theodore Ts'o <tytso@mit.edu> | 2014-08-29 20:49:51 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2014-08-29 20:49:51 -0400 |
commit | 537d8f93805ace30ce097736d3aac041931274b1 (patch) | |
tree | 9f9c7fcd90d388d0fb5cc37e0e9250b6cf35412b /fs/ext4 | |
parent | d4f03186c8986ffde34d06fe74a99aab08f7ee0b (diff) |
ext4: convert ext4_dx_find_entry() to use the ERR_PTR convention
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'fs/ext4')
-rw-r--r-- | fs/ext4/namei.c | 46 |
1 files changed, 20 insertions, 26 deletions
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 90a3cdca3f88..1421ec1cd7e4 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c | |||
@@ -270,8 +270,7 @@ static int ext4_htree_next_block(struct inode *dir, __u32 hash, | |||
270 | __u32 *start_hash); | 270 | __u32 *start_hash); |
271 | static struct buffer_head * ext4_dx_find_entry(struct inode *dir, | 271 | static struct buffer_head * ext4_dx_find_entry(struct inode *dir, |
272 | const struct qstr *d_name, | 272 | const struct qstr *d_name, |
273 | struct ext4_dir_entry_2 **res_dir, | 273 | struct ext4_dir_entry_2 **res_dir); |
274 | int *err); | ||
275 | static int ext4_dx_add_entry(handle_t *handle, struct dentry *dentry, | 274 | static int ext4_dx_add_entry(handle_t *handle, struct dentry *dentry, |
276 | struct inode *inode); | 275 | struct inode *inode); |
277 | 276 | ||
@@ -1258,17 +1257,13 @@ static struct buffer_head * ext4_find_entry (struct inode *dir, | |||
1258 | goto restart; | 1257 | goto restart; |
1259 | } | 1258 | } |
1260 | if (is_dx(dir)) { | 1259 | if (is_dx(dir)) { |
1261 | bh = ext4_dx_find_entry(dir, d_name, res_dir, &err); | 1260 | bh = ext4_dx_find_entry(dir, d_name, res_dir); |
1262 | /* | 1261 | /* |
1263 | * On success, or if the error was file not found, | 1262 | * On success, or if the error was file not found, |
1264 | * return. Otherwise, fall back to doing a search the | 1263 | * return. Otherwise, fall back to doing a search the |
1265 | * old fashioned way. | 1264 | * old fashioned way. |
1266 | */ | 1265 | */ |
1267 | if (err == -ENOENT) | 1266 | if (!IS_ERR(bh) || PTR_ERR(bh) != ERR_BAD_DX_DIR) |
1268 | return NULL; | ||
1269 | if (err && err != ERR_BAD_DX_DIR) | ||
1270 | return ERR_PTR(err); | ||
1271 | if (bh) | ||
1272 | return bh; | 1267 | return bh; |
1273 | dxtrace(printk(KERN_DEBUG "ext4_find_entry: dx failed, " | 1268 | dxtrace(printk(KERN_DEBUG "ext4_find_entry: dx failed, " |
1274 | "falling back\n")); | 1269 | "falling back\n")); |
@@ -1366,34 +1361,32 @@ cleanup_and_exit: | |||
1366 | } | 1361 | } |
1367 | 1362 | ||
1368 | static struct buffer_head * ext4_dx_find_entry(struct inode *dir, const struct qstr *d_name, | 1363 | static struct buffer_head * ext4_dx_find_entry(struct inode *dir, const struct qstr *d_name, |
1369 | struct ext4_dir_entry_2 **res_dir, int *err) | 1364 | struct ext4_dir_entry_2 **res_dir) |
1370 | { | 1365 | { |
1371 | struct super_block * sb = dir->i_sb; | 1366 | struct super_block * sb = dir->i_sb; |
1372 | struct dx_hash_info hinfo; | 1367 | struct dx_hash_info hinfo; |
1373 | struct dx_frame frames[2], *frame; | 1368 | struct dx_frame frames[2], *frame; |
1374 | struct buffer_head *bh; | 1369 | struct buffer_head *bh; |
1375 | ext4_lblk_t block; | 1370 | ext4_lblk_t block; |
1376 | int retval; | 1371 | int err = 0, retval; |
1377 | 1372 | ||
1378 | if (!(frame = dx_probe(d_name, dir, &hinfo, frames, err))) | 1373 | frame = dx_probe(d_name, dir, &hinfo, frames, &err); |
1379 | return NULL; | 1374 | if (err) |
1375 | return ERR_PTR(err); | ||
1380 | do { | 1376 | do { |
1381 | block = dx_get_block(frame->at); | 1377 | block = dx_get_block(frame->at); |
1382 | bh = ext4_read_dirblock(dir, block, DIRENT); | 1378 | bh = ext4_read_dirblock(dir, block, DIRENT); |
1383 | if (IS_ERR(bh)) { | 1379 | if (IS_ERR(bh)) |
1384 | *err = PTR_ERR(bh); | ||
1385 | goto errout; | 1380 | goto errout; |
1386 | } | 1381 | |
1387 | retval = search_dirblock(bh, dir, d_name, | 1382 | retval = search_dirblock(bh, dir, d_name, |
1388 | block << EXT4_BLOCK_SIZE_BITS(sb), | 1383 | block << EXT4_BLOCK_SIZE_BITS(sb), |
1389 | res_dir); | 1384 | res_dir); |
1390 | if (retval == 1) { /* Success! */ | 1385 | if (retval == 1) |
1391 | dx_release(frames); | 1386 | goto success; |
1392 | return bh; | ||
1393 | } | ||
1394 | brelse(bh); | 1387 | brelse(bh); |
1395 | if (retval == -1) { | 1388 | if (retval == -1) { |
1396 | *err = ERR_BAD_DX_DIR; | 1389 | bh = ERR_PTR(ERR_BAD_DX_DIR); |
1397 | goto errout; | 1390 | goto errout; |
1398 | } | 1391 | } |
1399 | 1392 | ||
@@ -1402,18 +1395,19 @@ static struct buffer_head * ext4_dx_find_entry(struct inode *dir, const struct q | |||
1402 | frames, NULL); | 1395 | frames, NULL); |
1403 | if (retval < 0) { | 1396 | if (retval < 0) { |
1404 | ext4_warning(sb, | 1397 | ext4_warning(sb, |
1405 | "error reading index page in directory #%lu", | 1398 | "error %d reading index page in directory #%lu", |
1406 | dir->i_ino); | 1399 | retval, dir->i_ino); |
1407 | *err = retval; | 1400 | bh = ERR_PTR(retval); |
1408 | goto errout; | 1401 | goto errout; |
1409 | } | 1402 | } |
1410 | } while (retval == 1); | 1403 | } while (retval == 1); |
1411 | 1404 | ||
1412 | *err = -ENOENT; | 1405 | bh = NULL; |
1413 | errout: | 1406 | errout: |
1414 | dxtrace(printk(KERN_DEBUG "%s not found\n", d_name->name)); | 1407 | dxtrace(printk(KERN_DEBUG "%s not found\n", d_name->name)); |
1415 | dx_release (frames); | 1408 | success: |
1416 | return NULL; | 1409 | dx_release(frames); |
1410 | return bh; | ||
1417 | } | 1411 | } |
1418 | 1412 | ||
1419 | static struct dentry *ext4_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) | 1413 | static struct dentry *ext4_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags) |