All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dave Chinner <david@fromorbit.com>
To: xfs@oss.sgi.com
Subject: [PATCH 10/49] libxfs: sync dir2 kernel differences
Date: Fri, 19 Jul 2013 16:44:45 +1000	[thread overview]
Message-ID: <1374216324-8781-11-git-send-email-david@fromorbit.com> (raw)
In-Reply-To: <1374216324-8781-1-git-send-email-david@fromorbit.com>

From: Dave Chinner <dchinner@redhat.com>

Signed-off-by: Dave Chinner <dchinner@redhat.com>
---
 libxfs/xfs_dir2.c      | 45 +++++++++++++++++++++++++++++++++++++++++++++
 libxfs/xfs_dir2_data.c | 20 ++++++++++----------
 libxfs/xfs_dir2_leaf.c |  4 ++--
 libxfs/xfs_dir2_node.c | 30 ++++++++++++++----------------
 4 files changed, 71 insertions(+), 28 deletions(-)

diff --git a/libxfs/xfs_dir2.c b/libxfs/xfs_dir2.c
index 6a4027f..830fe3e 100644
--- a/libxfs/xfs_dir2.c
+++ b/libxfs/xfs_dir2.c
@@ -392,6 +392,51 @@ xfs_dir_replace(
 }
 
 /*
+ * 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
+xfs_dir_canenter(
+	xfs_trans_t	*tp,
+	xfs_inode_t	*dp,
+	struct xfs_name	*name,		/* name of entry to add */
+	uint		resblks)
+{
+	xfs_da_args_t	args;
+	int		rval;
+	int		v;		/* type-checking value */
+
+	if (resblks)
+		return 0;
+
+	ASSERT(S_ISDIR(dp->i_d.di_mode));
+
+	memset(&args, 0, sizeof(xfs_da_args_t));
+	args.name = name->name;
+	args.namelen = name->len;
+	args.hashval = dp->i_mount->m_dirnameops->hashname(name);
+	args.dp = dp;
+	args.whichfork = XFS_DATA_FORK;
+	args.trans = tp;
+	args.op_flags = XFS_DA_OP_JUSTCHECK | XFS_DA_OP_ADDNAME |
+							XFS_DA_OP_OKNOENT;
+
+	if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL)
+		rval = xfs_dir2_sf_addname(&args);
+	else if ((rval = xfs_dir2_isblock(tp, dp, &v)))
+		return rval;
+	else if (v)
+		rval = xfs_dir2_block_addname(&args);
+	else if ((rval = xfs_dir2_isleaf(tp, dp, &v)))
+		return rval;
+	else if (v)
+		rval = xfs_dir2_leaf_addname(&args);
+	else
+		rval = xfs_dir2_node_addname(&args);
+	return rval;
+}
+
+/*
  * Utility routines.
  */
 
diff --git a/libxfs/xfs_dir2_data.c b/libxfs/xfs_dir2_data.c
index 155352c..064ddb2 100644
--- a/libxfs/xfs_dir2_data.c
+++ b/libxfs/xfs_dir2_data.c
@@ -53,15 +53,15 @@ __xfs_dir3_data_check(
 	bf = xfs_dir3_data_bestfree_p(hdr);
 	p = (char *)xfs_dir3_data_entry_p(hdr);
 
-	switch (be32_to_cpu(hdr->magic)) {
-	case XFS_DIR2_BLOCK_MAGIC:
-	case XFS_DIR3_BLOCK_MAGIC:
+	switch (hdr->magic) {
+	case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC):
+	case cpu_to_be32(XFS_DIR2_BLOCK_MAGIC):
 		btp = xfs_dir2_block_tail_p(mp, hdr);
 		lep = xfs_dir2_block_leaf_p(btp);
 		endp = (char *)lep;
 		break;
-	case XFS_DIR2_DATA_MAGIC:
-	case XFS_DIR3_DATA_MAGIC:
+	case cpu_to_be32(XFS_DIR3_DATA_MAGIC):
+	case cpu_to_be32(XFS_DIR2_DATA_MAGIC):
 		endp = (char *)hdr + mp->m_dirblksize;
 		break;
 	default:
@@ -209,14 +209,14 @@ xfs_dir3_data_reada_verify(
 	struct xfs_mount	*mp = bp->b_target->bt_mount;
 	struct xfs_dir2_data_hdr *hdr = bp->b_addr;
 
-	switch (be32_to_cpu(hdr->magic)) {
-	case XFS_DIR2_BLOCK_MAGIC:
-	case XFS_DIR3_BLOCK_MAGIC:
+	switch (hdr->magic) {
+	case cpu_to_be32(XFS_DIR2_BLOCK_MAGIC):
+	case cpu_to_be32(XFS_DIR3_BLOCK_MAGIC):
 		bp->b_ops = &xfs_dir3_block_buf_ops;
 		bp->b_ops->verify_read(bp);
 		return;
-	case XFS_DIR2_DATA_MAGIC:
-	case XFS_DIR3_DATA_MAGIC:
+	case cpu_to_be32(XFS_DIR2_DATA_MAGIC):
+	case cpu_to_be32(XFS_DIR3_DATA_MAGIC):
 		xfs_dir3_data_verify(bp);
 		return;
 	default:
diff --git a/libxfs/xfs_dir2_leaf.c b/libxfs/xfs_dir2_leaf.c
index a287bb1..8c20b9e 100644
--- a/libxfs/xfs_dir2_leaf.c
+++ b/libxfs/xfs_dir2_leaf.c
@@ -247,14 +247,14 @@ xfs_dir3_leaf1_write_verify(
 	__write_verify(bp, XFS_DIR2_LEAF1_MAGIC);
 }
 
-void
+static void
 xfs_dir3_leafn_read_verify(
 	struct xfs_buf	*bp)
 {
 	__read_verify(bp, XFS_DIR2_LEAFN_MAGIC);
 }
 
-void
+static void
 xfs_dir3_leafn_write_verify(
 	struct xfs_buf	*bp)
 {
diff --git a/libxfs/xfs_dir2_node.c b/libxfs/xfs_dir2_node.c
index bdce1b3..222f08c 100644
--- a/libxfs/xfs_dir2_node.c
+++ b/libxfs/xfs_dir2_node.c
@@ -257,7 +257,6 @@ xfs_dir3_free_get_buf(
 		hdr3->hdr.blkno = cpu_to_be64(bp->b_bn);
 		hdr3->hdr.owner = cpu_to_be64(dp->i_ino);
 		uuid_copy(&hdr3->hdr.uuid, &mp->m_sb.sb_uuid);
-
 	} else
 		hdr.magic = XFS_DIR2_FREE_MAGIC;
 	xfs_dir3_free_hdr_to_disk(bp->b_addr, &hdr);
@@ -978,7 +977,7 @@ xfs_dir2_leafn_rebalance(
 	xfs_dir2_leaf_t		*leaf1;		/* first leaf structure */
 	xfs_dir2_leaf_t		*leaf2;		/* second leaf structure */
 	int			mid;		/* midpoint leaf index */
-#ifdef DEBUG
+#if defined(DEBUG) || defined(XFS_WARN)
 	int			oldstale;	/* old count of stale leaves */
 #endif
 	int			oldsum;		/* old total leaf count */
@@ -1007,7 +1006,7 @@ xfs_dir2_leafn_rebalance(
 	ents2 = xfs_dir3_leaf_ents_p(leaf2);
 
 	oldsum = hdr1.count + hdr2.count;
-#ifdef DEBUG
+#if defined(DEBUG) || defined(XFS_WARN)
 	oldstale = hdr1.stale + hdr2.stale;
 #endif
 	mid = oldsum >> 1;
@@ -1101,7 +1100,6 @@ xfs_dir3_data_block_free(
 	__be16			*bests;
 	struct xfs_dir3_icfree_hdr freehdr;
 
-
 	xfs_dir3_free_hdr_from_disk(&freehdr, free);
 
 	bests = xfs_dir3_free_bests_p(tp->t_mountp, free);
@@ -1115,12 +1113,14 @@ xfs_dir3_data_block_free(
 		return 0;
 	}
 
-	/*
-	 * One less used entry in the free table. Unused is not converted
-	 * because we only need to know if it zero
-	 */
+	/* One less used entry in the free table. */
 	freehdr.nused--;
 
+	/*
+	 * If this was the last entry in the table, we can trim the table size
+	 * back.  There might be other entries at the end referring to
+	 * non-existent data blocks, get those too.
+	 */
 	if (findex == freehdr.nvalid - 1) {
 		int	i;		/* free entry index */
 
@@ -1159,7 +1159,6 @@ xfs_dir3_data_block_free(
 		 */
 	}
 
-
 	/* Log the free entry that changed, unless we got rid of it.  */
 	if (logfree)
 		xfs_dir2_free_log_bests(tp, fbp, findex, findex);
@@ -1275,9 +1274,8 @@ xfs_dir2_leafn_remove(
 	{
 		struct xfs_dir3_icfree_hdr freehdr;
 		xfs_dir3_free_hdr_from_disk(&freehdr, free);
-		ASSERT(freehdr.firstdb ==
-				       xfs_dir3_free_max_bests(mp) *
-				       (fdb - XFS_DIR2_FREE_FIRSTDB(mp)));
+		ASSERT(freehdr.firstdb == xfs_dir3_free_max_bests(mp) *
+					  (fdb - XFS_DIR2_FREE_FIRSTDB(mp)));
 	}
 #endif
 		/*
@@ -1425,7 +1423,7 @@ xfs_dir2_leafn_toosmall(
 	leaf = blk->bp->b_addr;
 	xfs_dir3_leaf_hdr_from_disk(&leafhdr, leaf);
 	ents = xfs_dir3_leaf_ents_p(leaf);
-	xfs_dir3_leaf_check(mp, blk->bp);
+	xfs_dir3_leaf_check(state->args->dp->i_mount, blk->bp);
 
 	count = leafhdr.count - leafhdr.stale;
 	bytes = xfs_dir3_leaf_hdr_size(leaf) + count * sizeof(ents[0]);
@@ -1795,9 +1793,9 @@ xfs_dir2_node_addname_int(
 		/*
 		 * Look at the current free entry.  Is it good enough?
 		 *
-		 * The bests initialisation should be wher eteh bufer is read in
+		 * The bests initialisation should be where the bufer is read in
 		 * the above branch. But gcc is too stupid to realise that bests
-		 * iand the freehdr are actually initialised if they are placed
+		 * and the freehdr are actually initialised if they are placed
 		 * there, so we have to do it here to avoid warnings. Blech.
 		 */
 		bests = xfs_dir3_free_bests_p(mp, free);
@@ -1863,7 +1861,7 @@ xfs_dir2_node_addname_int(
 		 * If there wasn't a freespace block, the read will
 		 * return a NULL fbp.  Allocate and initialize a new one.
 		 */
-		if(!fbp) {
+		if (!fbp) {
 			error = xfs_dir2_grow_inode(args, XFS_DIR2_FREE_SPACE,
 						    &fbno);
 			if (error)
-- 
1.8.3.2

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

  parent reply	other threads:[~2013-07-19  6:45 UTC|newest]

Thread overview: 107+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-19  6:44 [PATCH 00/49] xfsprogs: patches for crc-dev branch Dave Chinner
2013-07-19  6:44 ` [PATCH 01/49] xfsprogs: introduce xfs_icreate.h Dave Chinner
2013-08-01 18:07   ` Mark Tinguely
2013-07-19  6:44 ` [PATCH 02/49] xfsprogs: port inode create transaction changes Dave Chinner
2013-08-01 19:01   ` Mark Tinguely
2013-07-19  6:44 ` [PATCH 03/49] xfsprogs: teach logprint about icreate transaction Dave Chinner
2013-08-01 21:30   ` Mark Tinguely
2013-07-19  6:44 ` [PATCH 04/49] libxfs: fix directory/attribute format issues Dave Chinner
2013-08-02 13:10   ` Mark Tinguely
2013-07-19  6:44 ` [PATCH 05/49] libxfs: ensure btree root split sets blkno correctly Dave Chinner
2013-08-02 13:12   ` Mark Tinguely
2013-07-19  6:44 ` [PATCH 06/49] libxfs: fix byte swapping on constants Dave Chinner
2013-08-02 13:51   ` Mark Tinguely
2013-08-12  0:03     ` ***** SUSPECTED SPAM ***** " Dave Chinner
2013-07-19  6:44 ` [PATCH 07/49] libxfs: sync xfs_da_btree.c Dave Chinner
2013-08-02 14:22   ` Mark Tinguely
2013-07-19  6:44 ` [PATCH 08/49] libxfs: update xfs_alloc to current kernel version Dave Chinner
2013-08-02 15:11   ` Mark Tinguely
2013-07-19  6:44 ` [PATCH 09/49] libxfs: sync attr code with kernel Dave Chinner
2013-08-02 16:02   ` Mark Tinguely
2013-07-19  6:44 ` Dave Chinner [this message]
2013-08-02 16:25   ` [PATCH 10/49] libxfs: sync dir2 kernel differences Mark Tinguely
2013-08-08 22:04   ` Mark Tinguely
2013-07-19  6:44 ` [PATCH 11/49] libxfs: sync xfs_ialloc.c to the kernel code Dave Chinner
2013-08-02 18:08   ` Mark Tinguely
2013-07-19  6:44 ` [PATCH 12/49] xfsprogs: define min/max once and use them everywhere Dave Chinner
2013-08-02 18:42   ` Mark Tinguely
2013-07-19  6:44 ` [PATCH 13/49] libxfs: fix compile warnings Dave Chinner
2013-08-02 21:13   ` Mark Tinguely
2013-07-19  6:44 ` [PATCH 14/49] xfs: remove local fork format handling from xfs_bmapi_write() Dave Chinner
2013-08-02 21:42   ` Mark Tinguely
2013-07-19  6:44 ` [PATCH 15/49] libxfs: local to remote format support of remote symlinks Dave Chinner
2013-08-02 22:22   ` Mark Tinguely
2013-07-19  6:44 ` [PATCH 16/49] xfs: separate out log format definitions Dave Chinner
2013-08-03 15:15   ` Mark Tinguely
2013-07-19  6:44 ` [PATCH 17/49] xfs: split out inode log item format definition Dave Chinner
2013-08-03 15:23   ` Mark Tinguely
2013-07-19  6:44 ` [PATCH 18/49] xfs: split out buf log item format definitions Dave Chinner
2013-08-04 23:37   ` Mark Tinguely
2013-07-19  6:44 ` [PATCH 19/49] xfs: split out inode log item format definition Dave Chinner
2013-08-04 23:41   ` Mark Tinguely
2013-07-19  6:44 ` [PATCH 20/49] xfs: separate dquot on disk format definitions out of xfs_quota.h Dave Chinner
2013-08-05 14:18   ` Mark Tinguely
2013-07-19  6:44 ` [PATCH 21/49] xfs: separate icreate log format definitions from xfs_icreate_item.h Dave Chinner
2013-08-05 14:27   ` Mark Tinguely
2013-07-19  6:44 ` [PATCH 22/49] xfs: split out on-disk transaction definitions Dave Chinner
2013-08-05 15:22   ` Mark Tinguely
2013-08-05 15:24     ` Mark Tinguely
2013-07-19  6:44 ` [PATCH 23/49] xfs: introduce xfs_rtalloc_defs.h Dave Chinner
2013-08-05 18:53   ` Mark Tinguely
2013-07-19  6:44 ` [PATCH 24/49] xfs: introduce xfs_quota_defs.h Dave Chinner
2013-08-05 19:09   ` Mark Tinguely
2013-08-12  0:24     ` ***** SUSPECTED SPAM ***** " Dave Chinner
2013-07-19  6:45 ` [PATCH 25/49] libxfs: introduce xfs_trans_resv.c Dave Chinner
2013-08-05 20:16   ` Mark Tinguely
2013-07-19  6:45 ` [PATCH 26/49] libxfs: move transaction code to trans.c Dave Chinner
2013-08-05 20:51   ` Mark Tinguely
2013-07-19  6:45 ` [PATCH 27/49] xfs: move inode fork definitions to a new header file Dave Chinner
2013-08-05 21:39   ` Mark Tinguely
2013-07-19  6:45 ` [PATCH 28/49] xfs: move unrealted definitions out of xfs_inode.h Dave Chinner
2013-08-05 21:57   ` Mark Tinguely
2013-08-12  0:30     ` ***** SUSPECTED SPAM ***** " Dave Chinner
2013-07-19  6:45 ` [PATCH 29/49] xfs: introduce xfs_inode_buf.c for inode buffer operations Dave Chinner
2013-08-06 13:25   ` Mark Tinguely
2013-07-19  6:45 ` [PATCH 30/49] xfs: split out the remote symlink handling Dave Chinner
2013-07-19  6:45 ` [PATCH 31/49] libxfs: switch over to xfs_sb.c and remove xfs_mount.c Dave Chinner
2013-07-19  6:45 ` [PATCH 32/49] xfs: create xfs_bmap_util.[ch] Dave Chinner
2013-08-06 15:13   ` Mark Tinguely
2013-07-19  6:45 ` [PATCH 33/49] xfsprogs: sync minor kernel header differences Dave Chinner
2013-08-06 15:26   ` Mark Tinguely
2013-07-19  6:45 ` [PATCH 34/49] xfs: don't special case shared superblock mounts Dave Chinner
2013-08-06 15:33   ` Mark Tinguely
2013-07-19  6:45 ` [PATCH 35/49] xfs: move swap extent code to xfs_extent_ops Dave Chinner
2013-08-06 15:41   ` Mark Tinguely
2013-07-19  6:45 ` [PATCH 36/49] xfs: kill __KERNEL__ check for debug code in allocation code Dave Chinner
2013-08-06 15:52   ` Mark Tinguely
2013-07-19  6:45 ` [PATCH 37/49] xfs: remove __KERNEL__ from debug code Dave Chinner
2013-08-06 16:07   ` Mark Tinguely
2013-07-19  6:45 ` [PATCH 38/49] xfs: remove __KERNEL__ check from xfs_dir2_leaf.c Dave Chinner
2013-08-06 16:12   ` Mark Tinguely
2013-07-19  6:45 ` [PATCH 39/49] xfs: move kernel specific type definitions to xfs.h Dave Chinner
2013-08-06 16:16   ` Mark Tinguely
2013-07-19  6:45 ` [PATCH 40/49] xfs: make struct xfs_perag kernel only Dave Chinner
2013-08-06 16:28   ` Mark Tinguely
2013-07-19  6:45 ` [PATCH 41/49] xfs: Introduce a new structure to hold transaction reservation items Dave Chinner
2013-08-06 18:23   ` Mark Tinguely
2013-07-19  6:45 ` [PATCH 42/49] xfs: Introduce tr_fsyncts to m_reservation Dave Chinner
2013-08-06 18:33   ` Mark Tinguely
2013-07-19  6:45 ` [PATCH 43/49] xfs: Make writeid transaction use tr_writeid Dave Chinner
2013-08-06 18:38   ` Mark Tinguely
2013-07-19  6:45 ` [PATCH 44/49] xfs: refactor xfs_trans_reserve() interface Dave Chinner
2013-08-06 19:12   ` Mark Tinguely
2013-07-19  6:45 ` [PATCH 45/49] xfs: Get rid of all XFS_XXX_LOG_RES() macro Dave Chinner
2013-08-06 19:23   ` Mark Tinguely
2013-07-19  6:45 ` [PATCH 46/49] xfs: Add xfs_log_rlimit.c Dave Chinner
2013-08-06 20:31   ` Mark Tinguely
2013-07-19  6:45 ` [PATCH 47/49] xfs: Add read-only support for dirent filetype field Dave Chinner
2013-08-06 21:13   ` Mark Tinguely
2013-08-12  0:33     ` ***** SUSPECTED SPAM ***** " Dave Chinner
2013-07-19  6:45 ` [PATCH 48/49] xfs: Add write " Dave Chinner
2013-07-19  6:45 ` [PATCH 49/49] xfsprogs: add dtype support to mkfs and db Dave Chinner
2013-07-21  6:34 ` [PATCH 00/49] xfsprogs: patches for crc-dev branch Michael L. Semon
2013-07-22 23:32   ` Dave Chinner
2013-07-23  3:36     ` Michael L. Semon
2013-07-23  4:44       ` Dave Chinner
2013-07-23 21:02         ` Michael L. Semon
2013-07-24  3:52           ` Dave Chinner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1374216324-8781-11-git-send-email-david@fromorbit.com \
    --to=david@fromorbit.com \
    --cc=xfs@oss.sgi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.