[PATCH v1 1/2] xfs_db: create header file for directory iteration code

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Create a namei.h header so that we can export functions needed to walk a
directory. This will be used in the next patch to recursively list directory
entries.

Signed-off-by: Catherine Hoang <catherine.hoang@xxxxxxxxxx>
---
 db/Makefile |  4 ++--
 db/namei.c  | 48 +++++++++++++++++++++++++++++-------------------
 db/namei.h  | 13 +++++++++++++
 3 files changed, 44 insertions(+), 21 deletions(-)
 create mode 100644 db/namei.h

diff --git a/db/Makefile b/db/Makefile
index b2e01174..07f0b41f 100644
--- a/db/Makefile
+++ b/db/Makefile
@@ -11,10 +11,10 @@ HFILES = addr.h agf.h agfl.h agi.h attr.h attrshort.h bit.h block.h bmap.h \
 	btblock.h bmroot.h check.h command.h crc.h debug.h \
 	dir2.h dir2sf.h dquot.h echo.h faddr.h field.h \
 	flist.h fprint.h frag.h freesp.h hash.h help.h init.h inode.h input.h \
-	io.h logformat.h malloc.h metadump.h output.h print.h quit.h sb.h \
+	io.h logformat.h malloc.h metadump.h namei.h output.h print.h quit.h sb.h \
 	sig.h strvec.h text.h type.h write.h attrset.h symlink.h fsmap.h \
 	fuzz.h
-CFILES = $(HFILES:.h=.c) btdump.c btheight.c convert.c info.c namei.c \
+CFILES = $(HFILES:.h=.c) btdump.c btheight.c convert.c info.c \
 	timelimit.c
 LSRCFILES = xfs_admin.sh xfs_ncheck.sh xfs_metadump.sh
 
diff --git a/db/namei.c b/db/namei.c
index 063721ca..765f6838 100644
--- a/db/namei.c
+++ b/db/namei.c
@@ -14,6 +14,7 @@
 #include "fprint.h"
 #include "field.h"
 #include "inode.h"
+#include "namei.h"
 
 /* Path lookup */
 
@@ -137,7 +138,7 @@ rele:
 }
 
 /* Walk a directory path to an inode and set the io cursor to that inode. */
-static int
+int
 path_walk(
 	char		*path)
 {
@@ -247,7 +248,8 @@ dir_emit(
 	char			*name,
 	ssize_t			namelen,
 	xfs_ino_t		ino,
-	uint8_t			dtype)
+	uint8_t			dtype,
+	void			*priv)
 {
 	char			*display_name;
 	struct xfs_name		xname = { .name = (unsigned char *)name };
@@ -284,7 +286,9 @@ dir_emit(
 
 static int
 list_sfdir(
-	struct xfs_da_args		*args)
+	struct xfs_da_args		*args,
+	list_dir_fn			list_fn,
+	void				*priv)
 {
 	struct xfs_inode		*dp = args->dp;
 	struct xfs_mount		*mp = dp->i_mount;
@@ -301,13 +305,13 @@ list_sfdir(
 	/* . and .. entries */
 	off = xfs_dir2_db_off_to_dataptr(geo, geo->datablk,
 			geo->data_entry_offset);
-	dir_emit(args->dp->i_mount, off, ".", -1, dp->i_ino, XFS_DIR3_FT_DIR);
+	list_fn(args->dp->i_mount, off, ".", -1, dp->i_ino, XFS_DIR3_FT_DIR, priv);
 
 	ino = libxfs_dir2_sf_get_parent_ino(sfp);
 	off = xfs_dir2_db_off_to_dataptr(geo, geo->datablk,
 			geo->data_entry_offset +
 			libxfs_dir2_data_entsize(mp, sizeof(".") - 1));
-	dir_emit(args->dp->i_mount, off, "..", -1, ino, XFS_DIR3_FT_DIR);
+	list_fn(args->dp->i_mount, off, "..", -1, ino, XFS_DIR3_FT_DIR, priv);
 
 	/* Walk everything else. */
 	sfep = xfs_dir2_sf_firstentry(sfp);
@@ -317,8 +321,8 @@ list_sfdir(
 		off = xfs_dir2_db_off_to_dataptr(geo, geo->datablk,
 				xfs_dir2_sf_get_offset(sfep));
 
-		dir_emit(args->dp->i_mount, off, (char *)sfep->name,
-				sfep->namelen, ino, filetype);
+		list_fn(args->dp->i_mount, off, (char *)sfep->name,
+				sfep->namelen, ino, filetype, priv);
 		sfep = libxfs_dir2_sf_nextentry(mp, sfp, sfep);
 	}
 
@@ -328,7 +332,9 @@ list_sfdir(
 /* List entries in block format directory. */
 static int
 list_blockdir(
-	struct xfs_da_args	*args)
+	struct xfs_da_args	*args,
+	list_dir_fn		list_fn,
+	void			*priv)
 {
 	struct xfs_inode	*dp = args->dp;
 	struct xfs_mount	*mp = dp->i_mount;
@@ -359,8 +365,8 @@ list_blockdir(
 		diroff = xfs_dir2_db_off_to_dataptr(geo, geo->datablk, offset);
 		offset += libxfs_dir2_data_entsize(mp, dep->namelen);
 		filetype = libxfs_dir2_data_get_ftype(dp->i_mount, dep);
-		dir_emit(mp, diroff, (char *)dep->name, dep->namelen,
-				be64_to_cpu(dep->inumber), filetype);
+		list_fn(mp, diroff, (char *)dep->name, dep->namelen,
+				be64_to_cpu(dep->inumber), filetype, priv);
 	}
 
 	libxfs_trans_brelse(args->trans, bp);
@@ -370,7 +376,9 @@ list_blockdir(
 /* List entries in leaf format directory. */
 static int
 list_leafdir(
-	struct xfs_da_args	*args)
+	struct xfs_da_args	*args,
+	list_dir_fn		list_fn,
+	void			*priv)
 {
 	struct xfs_bmbt_irec	map;
 	struct xfs_iext_cursor	icur;
@@ -424,9 +432,9 @@ list_leafdir(
 			offset += libxfs_dir2_data_entsize(mp, dep->namelen);
 			filetype = libxfs_dir2_data_get_ftype(mp, dep);
 
-			dir_emit(mp, xfs_dir2_byte_to_dataptr(dirboff + offset),
+			list_fn(mp, xfs_dir2_byte_to_dataptr(dirboff + offset),
 					(char *)dep->name, dep->namelen,
-					be64_to_cpu(dep->inumber), filetype);
+					be64_to_cpu(dep->inumber), filetype, priv);
 		}
 
 		dabno += XFS_DADDR_TO_FSB(mp, bp->b_length);
@@ -441,9 +449,11 @@ list_leafdir(
 }
 
 /* Read the directory, display contents. */
-static int
+int
 listdir(
-	struct xfs_inode	*dp)
+	struct xfs_inode	*dp,
+	list_dir_fn		list_fn,
+	void			*priv)
 {
 	struct xfs_da_args	args = {
 		.dp		= dp,
@@ -453,15 +463,15 @@ listdir(
 	bool			isblock;
 
 	if (dp->i_df.if_format == XFS_DINODE_FMT_LOCAL)
-		return list_sfdir(&args);
+		return list_sfdir(&args, list_fn, priv);
 
 	error = -libxfs_dir2_isblock(&args, &isblock);
 	if (error)
 		return error;
 
 	if (isblock)
-		return list_blockdir(&args);
-	return list_leafdir(&args);
+		return list_blockdir(&args, list_fn, priv);
+	return list_leafdir(&args, list_fn, priv);
 }
 
 /* List the inode number of the currently selected inode. */
@@ -500,7 +510,7 @@ ls_cur(
 	if (tag)
 		dbprintf(_("%s:\n"), tag);
 
-	error = listdir(dp);
+	error = listdir(dp, dir_emit, NULL);
 	if (error)
 		goto rele;
 
diff --git a/db/namei.h b/db/namei.h
new file mode 100644
index 00000000..2dc81d33
--- /dev/null
+++ b/db/namei.h
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (c) 2023 Oracle.
+ * All Rights Reserved.
+ */
+
+typedef void (*list_dir_fn)(struct xfs_mount *mp, xfs_dir2_dataptr_t off,
+		char *name, ssize_t namelen, xfs_ino_t inode, uint8_t dtype,
+		void *priv);
+
+extern void namei_init(void);
+extern int listdir(struct xfs_inode *dp, list_dir_fn list_fn, void *priv);
+extern int path_walk(char * path);
-- 
2.34.1




[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux