All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC][PATCH v2 09/10] nilfs2: use common file type conversion
@ 2018-10-23 20:20 Phillip Potter
  0 siblings, 0 replies; only message in thread
From: Phillip Potter @ 2018-10-23 20:20 UTC (permalink / raw)
  To: linux-nilfs; +Cc: linux-kernel, amir73il, viro, linux-fsdevel

Deduplicate the nilfs2 file type conversion implementation.

Original patch by Amir Goldstein.

v2:
- Compile-time checks added by Phillip Potter to make
  sure the NILFS_FT_x enum values stay same as FT_x values

v1:
- Initial implementation

Signed-off-by: Phillip Potter <phil@philpotter.co.uk>
---
 fs/nilfs2/dir.c                    | 54 +++++++++++-------------------
 include/uapi/linux/nilfs2_ondisk.h |  1 +
 2 files changed, 20 insertions(+), 35 deletions(-)

diff --git a/fs/nilfs2/dir.c b/fs/nilfs2/dir.c
index 81394e22d0a0..168238278d24 100644
--- a/fs/nilfs2/dir.c
+++ b/fs/nilfs2/dir.c
@@ -229,35 +229,25 @@ static struct nilfs_dir_entry *nilfs_next_entry(struct nilfs_dir_entry *p)
 					  nilfs_rec_len_from_disk(p->rec_len));
 }
 
-static unsigned char
-nilfs_filetype_table[NILFS_FT_MAX] = {
-	[NILFS_FT_UNKNOWN]	= DT_UNKNOWN,
-	[NILFS_FT_REG_FILE]	= DT_REG,
-	[NILFS_FT_DIR]		= DT_DIR,
-	[NILFS_FT_CHRDEV]	= DT_CHR,
-	[NILFS_FT_BLKDEV]	= DT_BLK,
-	[NILFS_FT_FIFO]		= DT_FIFO,
-	[NILFS_FT_SOCK]		= DT_SOCK,
-	[NILFS_FT_SYMLINK]	= DT_LNK,
-};
-
-#define S_SHIFT 12
-static unsigned char
-nilfs_type_by_mode[S_IFMT >> S_SHIFT] = {
-	[S_IFREG >> S_SHIFT]	= NILFS_FT_REG_FILE,
-	[S_IFDIR >> S_SHIFT]	= NILFS_FT_DIR,
-	[S_IFCHR >> S_SHIFT]	= NILFS_FT_CHRDEV,
-	[S_IFBLK >> S_SHIFT]	= NILFS_FT_BLKDEV,
-	[S_IFIFO >> S_SHIFT]	= NILFS_FT_FIFO,
-	[S_IFSOCK >> S_SHIFT]	= NILFS_FT_SOCK,
-	[S_IFLNK >> S_SHIFT]	= NILFS_FT_SYMLINK,
-};
-
 static void nilfs_set_de_type(struct nilfs_dir_entry *de, struct inode *inode)
 {
-	umode_t mode = inode->i_mode;
-
-	de->file_type = nilfs_type_by_mode[(mode & S_IFMT)>>S_SHIFT];
+	/*
+	 * compile-time asserts that generic FT_x types
+	 * still match NILFS_FT_x types - no need to list
+	 * in other functions as well as build will
+	 * fail either way
+	 */
+	BUILD_BUG_ON(NILFS_FT_UNKNOWN != FT_UNKNOWN);
+	BUILD_BUG_ON(NILFS_FT_REG_FILE != FT_REG_FILE);
+	BUILD_BUG_ON(NILFS_FT_DIR != FT_DIR);
+	BUILD_BUG_ON(NILFS_FT_CHRDEV != FT_CHRDEV);
+	BUILD_BUG_ON(NILFS_FT_BLKDEV != FT_BLKDEV);
+	BUILD_BUG_ON(NILFS_FT_FIFO != FT_FIFO);
+	BUILD_BUG_ON(NILFS_FT_SOCK != FT_SOCK);
+	BUILD_BUG_ON(NILFS_FT_SYMLINK != FT_SYMLINK);
+	BUILD_BUG_ON(NILFS_FT_MAX != FT_MAX);
+
+	de->file_type = fs_umode_to_ftype(inode->i_mode);
 }
 
 static int nilfs_readdir(struct file *file, struct dir_context *ctx)
@@ -293,15 +283,9 @@ static int nilfs_readdir(struct file *file, struct dir_context *ctx)
 				return -EIO;
 			}
 			if (de->inode) {
-				unsigned char t;
-
-				if (de->file_type < NILFS_FT_MAX)
-					t = nilfs_filetype_table[de->file_type];
-				else
-					t = DT_UNKNOWN;
-
 				if (!dir_emit(ctx, de->name, de->name_len,
-						le64_to_cpu(de->inode), t)) {
+						le64_to_cpu(de->inode),
+						fs_dtype(de->file_type))) {
 					nilfs_put_page(page);
 					return 0;
 				}
diff --git a/include/uapi/linux/nilfs2_ondisk.h b/include/uapi/linux/nilfs2_ondisk.h
index a7e66ab11d1d..90362b1957f1 100644
--- a/include/uapi/linux/nilfs2_ondisk.h
+++ b/include/uapi/linux/nilfs2_ondisk.h
@@ -309,6 +309,7 @@ struct nilfs_dir_entry {
 /*
  * NILFS directory file types.  Only the low 3 bits are used.  The
  * other bits are reserved for now.
+ * Values should match common file type values in file_type.h.
  */
 enum {
 	NILFS_FT_UNKNOWN,
-- 
2.17.2


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2018-10-23 20:20 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-10-23 20:20 [RFC][PATCH v2 09/10] nilfs2: use common file type conversion Phillip Potter

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.