浏览代码

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>
Eric Sandeen 11 年之前
父节点
当前提交
94f3cad555
共有 4 个文件被更改,包括 22 次插入19 次删除
  1. 1 6
      fs/xfs/libxfs/xfs_dir2.c
  2. 1 1
      fs/xfs/libxfs/xfs_dir2.h
  3. 15 9
      fs/xfs/xfs_inode.c
  4. 5 3
      fs/xfs/xfs_symlink.c

+ 1 - 6
fs/xfs/libxfs/xfs_dir2.c

@@ -535,22 +535,17 @@ out_free:
 
 
 /*
 /*
  * See if this entry can be added to the directory without allocating space.
  * See if this entry can be added to the directory without allocating space.
- * First checks that the caller couldn't reserve enough space (resblks = 0).
  */
  */
 int
 int
 xfs_dir_canenter(
 xfs_dir_canenter(
 	xfs_trans_t	*tp,
 	xfs_trans_t	*tp,
 	xfs_inode_t	*dp,
 	xfs_inode_t	*dp,
-	struct xfs_name	*name,		/* name of entry to add */
-	uint		resblks)
+	struct xfs_name	*name)		/* name of entry to add */
 {
 {
 	struct xfs_da_args *args;
 	struct xfs_da_args *args;
 	int		rval;
 	int		rval;
 	int		v;		/* type-checking value */
 	int		v;		/* type-checking value */
 
 
-	if (resblks)
-		return 0;
-
 	ASSERT(S_ISDIR(dp->i_d.di_mode));
 	ASSERT(S_ISDIR(dp->i_d.di_mode));
 
 
 	args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS);
 	args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS);

+ 1 - 1
fs/xfs/libxfs/xfs_dir2.h

@@ -136,7 +136,7 @@ extern int xfs_dir_replace(struct xfs_trans *tp, struct xfs_inode *dp,
 				xfs_fsblock_t *first,
 				xfs_fsblock_t *first,
 				struct xfs_bmap_free *flist, xfs_extlen_t tot);
 				struct xfs_bmap_free *flist, xfs_extlen_t tot);
 extern int xfs_dir_canenter(struct xfs_trans *tp, struct xfs_inode *dp,
 extern int xfs_dir_canenter(struct xfs_trans *tp, struct xfs_inode *dp,
-				struct xfs_name *name, uint resblks);
+				struct xfs_name *name);
 
 
 /*
 /*
  * Direct call from the bmap code, bypassing the generic directory layer.
  * Direct call from the bmap code, bypassing the generic directory layer.

+ 15 - 9
fs/xfs/xfs_inode.c

@@ -1153,9 +1153,11 @@ xfs_create(
 	if (error)
 	if (error)
 		goto out_trans_cancel;
 		goto out_trans_cancel;
 
 
-	error = xfs_dir_canenter(tp, dp, name, resblks);
-	if (error)
-		goto out_trans_cancel;
+	if (!resblks) {
+		error = xfs_dir_canenter(tp, dp, name);
+		if (error)
+			goto out_trans_cancel;
+	}
 
 
 	/*
 	/*
 	 * A newly created regular or special file just has one directory
 	 * A newly created regular or special file just has one directory
@@ -1421,9 +1423,11 @@ xfs_link(
 		goto error_return;
 		goto error_return;
 	}
 	}
 
 
-	error = xfs_dir_canenter(tp, tdp, target_name, resblks);
-	if (error)
-		goto error_return;
+	if (!resblks) {
+		error = xfs_dir_canenter(tp, tdp, target_name);
+		if (error)
+			goto error_return;
+	}
 
 
 	xfs_bmap_init(&free_list, &first_block);
 	xfs_bmap_init(&free_list, &first_block);
 
 
@@ -2759,9 +2763,11 @@ xfs_rename(
 		 * If there's no space reservation, check the entry will
 		 * If there's no space reservation, check the entry will
 		 * fit before actually inserting it.
 		 * fit before actually inserting it.
 		 */
 		 */
-		error = xfs_dir_canenter(tp, target_dp, target_name, spaceres);
-		if (error)
-			goto error_return;
+		if (!spaceres) {
+			error = xfs_dir_canenter(tp, target_dp, target_name);
+			if (error)
+				goto error_return;
+		}
 		/*
 		/*
 		 * If target does not exist and the rename crosses
 		 * If target does not exist and the rename crosses
 		 * directories, adjust the target directory link count
 		 * directories, adjust the target directory link count

+ 5 - 3
fs/xfs/xfs_symlink.c

@@ -269,9 +269,11 @@ xfs_symlink(
 	/*
 	/*
 	 * Check for ability to enter directory entry, if no space reserved.
 	 * Check for ability to enter directory entry, if no space reserved.
 	 */
 	 */
-	error = xfs_dir_canenter(tp, dp, link_name, resblks);
-	if (error)
-		goto error_return;
+	if (!resblks) {
+		error = xfs_dir_canenter(tp, dp, link_name);
+		if (error)
+			goto error_return;
+	}
 	/*
 	/*
 	 * Initialize the bmap freelist prior to calling either
 	 * Initialize the bmap freelist prior to calling either
 	 * bmapi or the directory create code.
 	 * bmapi or the directory create code.