Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

xfs: check resblks before calling xfs_dir_canenter

Move the resblks test out of the xfs_dir_canenter,
and into the caller.

This makes a little more sense on the face of it;
xfs_dir_canenter immediately returns if resblks !=0;
and given some of the comments preceding the calls:

* Check for ability to enter directory entry, if no space reserved.

even more so.

It also facilitates the next patch.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>

authored by

Eric Sandeen and committed by
Dave Chinner
94f3cad5 970fd3f0

+22 -19
+1 -6
fs/xfs/libxfs/xfs_dir2.c
··· 535 535 536 536 /* 537 537 * See if this entry can be added to the directory without allocating space. 538 - * First checks that the caller couldn't reserve enough space (resblks = 0). 539 538 */ 540 539 int 541 540 xfs_dir_canenter( 542 541 xfs_trans_t *tp, 543 542 xfs_inode_t *dp, 544 - struct xfs_name *name, /* name of entry to add */ 545 - uint resblks) 543 + struct xfs_name *name) /* name of entry to add */ 546 544 { 547 545 struct xfs_da_args *args; 548 546 int rval; 549 547 int v; /* type-checking value */ 550 - 551 - if (resblks) 552 - return 0; 553 548 554 549 ASSERT(S_ISDIR(dp->i_d.di_mode)); 555 550
+1 -1
fs/xfs/libxfs/xfs_dir2.h
··· 136 136 xfs_fsblock_t *first, 137 137 struct xfs_bmap_free *flist, xfs_extlen_t tot); 138 138 extern int xfs_dir_canenter(struct xfs_trans *tp, struct xfs_inode *dp, 139 - struct xfs_name *name, uint resblks); 139 + struct xfs_name *name); 140 140 141 141 /* 142 142 * Direct call from the bmap code, bypassing the generic directory layer.
+15 -9
fs/xfs/xfs_inode.c
··· 1153 1153 if (error) 1154 1154 goto out_trans_cancel; 1155 1155 1156 - error = xfs_dir_canenter(tp, dp, name, resblks); 1157 - if (error) 1158 - goto out_trans_cancel; 1156 + if (!resblks) { 1157 + error = xfs_dir_canenter(tp, dp, name); 1158 + if (error) 1159 + goto out_trans_cancel; 1160 + } 1159 1161 1160 1162 /* 1161 1163 * A newly created regular or special file just has one directory ··· 1423 1421 goto error_return; 1424 1422 } 1425 1423 1426 - error = xfs_dir_canenter(tp, tdp, target_name, resblks); 1427 - if (error) 1428 - goto error_return; 1424 + if (!resblks) { 1425 + error = xfs_dir_canenter(tp, tdp, target_name); 1426 + if (error) 1427 + goto error_return; 1428 + } 1429 1429 1430 1430 xfs_bmap_init(&free_list, &first_block); 1431 1431 ··· 2763 2759 * If there's no space reservation, check the entry will 2764 2760 * fit before actually inserting it. 2765 2761 */ 2766 - error = xfs_dir_canenter(tp, target_dp, target_name, spaceres); 2767 - if (error) 2768 - goto error_return; 2762 + if (!spaceres) { 2763 + error = xfs_dir_canenter(tp, target_dp, target_name); 2764 + if (error) 2765 + goto error_return; 2766 + } 2769 2767 /* 2770 2768 * If target does not exist and the rename crosses 2771 2769 * directories, adjust the target directory link count
+5 -3
fs/xfs/xfs_symlink.c
··· 269 269 /* 270 270 * Check for ability to enter directory entry, if no space reserved. 271 271 */ 272 - error = xfs_dir_canenter(tp, dp, link_name, resblks); 273 - if (error) 274 - goto error_return; 272 + if (!resblks) { 273 + error = xfs_dir_canenter(tp, dp, link_name); 274 + if (error) 275 + goto error_return; 276 + } 275 277 /* 276 278 * Initialize the bmap freelist prior to calling either 277 279 * bmapi or the directory create code.