forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fs: common implementation of file type
Many file systems use a copy&paste implementation of dirent to on-disk file type conversions. Create a common implementation to be used by file systems with some useful conversion helpers to reduce open coded file type conversions in file system code. Signed-off-by: Amir Goldstein <[email protected]> Signed-off-by: Phillip Potter <[email protected]> Signed-off-by: Jan Kara <[email protected]>
- Loading branch information
1 parent
49a5785
commit bbe7449
Showing
5 changed files
with
184 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5881,6 +5881,7 @@ L: [email protected] | |
S: Maintained | ||
F: fs/* | ||
F: include/linux/fs.h | ||
F: include/linux/fs_types.h | ||
F: include/uapi/linux/fs.h | ||
|
||
FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
#include <linux/fs.h> | ||
#include <linux/export.h> | ||
|
||
/* | ||
* fs on-disk file type to dirent file type conversion | ||
*/ | ||
static const unsigned char fs_dtype_by_ftype[FT_MAX] = { | ||
[FT_UNKNOWN] = DT_UNKNOWN, | ||
[FT_REG_FILE] = DT_REG, | ||
[FT_DIR] = DT_DIR, | ||
[FT_CHRDEV] = DT_CHR, | ||
[FT_BLKDEV] = DT_BLK, | ||
[FT_FIFO] = DT_FIFO, | ||
[FT_SOCK] = DT_SOCK, | ||
[FT_SYMLINK] = DT_LNK | ||
}; | ||
|
||
/** | ||
* fs_ftype_to_dtype() - fs on-disk file type to dirent type. | ||
* @filetype: The on-disk file type to convert. | ||
* | ||
* This function converts the on-disk file type value (FT_*) to the directory | ||
* entry type (DT_*). | ||
* | ||
* Context: Any context. | ||
* Return: | ||
* * DT_UNKNOWN - Unknown type | ||
* * DT_FIFO - FIFO | ||
* * DT_CHR - Character device | ||
* * DT_DIR - Directory | ||
* * DT_BLK - Block device | ||
* * DT_REG - Regular file | ||
* * DT_LNK - Symbolic link | ||
* * DT_SOCK - Local-domain socket | ||
*/ | ||
unsigned char fs_ftype_to_dtype(unsigned int filetype) | ||
{ | ||
if (filetype >= FT_MAX) | ||
return DT_UNKNOWN; | ||
|
||
return fs_dtype_by_ftype[filetype]; | ||
} | ||
EXPORT_SYMBOL_GPL(fs_ftype_to_dtype); | ||
|
||
/* | ||
* dirent file type to fs on-disk file type conversion | ||
* Values not initialized explicitly are FT_UNKNOWN (0). | ||
*/ | ||
static const unsigned char fs_ftype_by_dtype[DT_MAX] = { | ||
[DT_REG] = FT_REG_FILE, | ||
[DT_DIR] = FT_DIR, | ||
[DT_LNK] = FT_SYMLINK, | ||
[DT_CHR] = FT_CHRDEV, | ||
[DT_BLK] = FT_BLKDEV, | ||
[DT_FIFO] = FT_FIFO, | ||
[DT_SOCK] = FT_SOCK, | ||
}; | ||
|
||
/** | ||
* fs_umode_to_ftype() - file mode to on-disk file type. | ||
* @mode: The file mode to convert. | ||
* | ||
* This function converts the file mode value to the on-disk file type (FT_*). | ||
* | ||
* Context: Any context. | ||
* Return: | ||
* * FT_UNKNOWN - Unknown type | ||
* * FT_REG_FILE - Regular file | ||
* * FT_DIR - Directory | ||
* * FT_CHRDEV - Character device | ||
* * FT_BLKDEV - Block device | ||
* * FT_FIFO - FIFO | ||
* * FT_SOCK - Local-domain socket | ||
* * FT_SYMLINK - Symbolic link | ||
*/ | ||
unsigned char fs_umode_to_ftype(umode_t mode) | ||
{ | ||
return fs_ftype_by_dtype[S_DT(mode)]; | ||
} | ||
EXPORT_SYMBOL_GPL(fs_umode_to_ftype); | ||
|
||
/** | ||
* fs_umode_to_dtype() - file mode to dirent file type. | ||
* @mode: The file mode to convert. | ||
* | ||
* This function converts the file mode value to the directory | ||
* entry type (DT_*). | ||
* | ||
* Context: Any context. | ||
* Return: | ||
* * DT_UNKNOWN - Unknown type | ||
* * DT_FIFO - FIFO | ||
* * DT_CHR - Character device | ||
* * DT_DIR - Directory | ||
* * DT_BLK - Block device | ||
* * DT_REG - Regular file | ||
* * DT_LNK - Symbolic link | ||
* * DT_SOCK - Local-domain socket | ||
*/ | ||
unsigned char fs_umode_to_dtype(umode_t mode) | ||
{ | ||
return fs_ftype_to_dtype(fs_umode_to_ftype(mode)); | ||
} | ||
EXPORT_SYMBOL_GPL(fs_umode_to_dtype); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
#ifndef _LINUX_FS_TYPES_H | ||
#define _LINUX_FS_TYPES_H | ||
|
||
/* | ||
* This is a header for the common implementation of dirent | ||
* to fs on-disk file type conversion. Although the fs on-disk | ||
* bits are specific to every file system, in practice, many | ||
* file systems use the exact same on-disk format to describe | ||
* the lower 3 file type bits that represent the 7 POSIX file | ||
* types. | ||
* | ||
* It is important to note that the definitions in this | ||
* header MUST NOT change. This would break both the | ||
* userspace ABI and the on-disk format of filesystems | ||
* using this code. | ||
* | ||
* All those file systems can use this generic code for the | ||
* conversions. | ||
*/ | ||
|
||
/* | ||
* struct dirent file types | ||
* exposed to user via getdents(2), readdir(3) | ||
* | ||
* These match bits 12..15 of stat.st_mode | ||
* (ie "(i_mode >> 12) & 15"). | ||
*/ | ||
#define S_DT_SHIFT 12 | ||
#define S_DT(mode) (((mode) & S_IFMT) >> S_DT_SHIFT) | ||
#define S_DT_MASK (S_IFMT >> S_DT_SHIFT) | ||
|
||
/* these are defined by POSIX and also present in glibc's dirent.h */ | ||
#define DT_UNKNOWN 0 | ||
#define DT_FIFO 1 | ||
#define DT_CHR 2 | ||
#define DT_DIR 4 | ||
#define DT_BLK 6 | ||
#define DT_REG 8 | ||
#define DT_LNK 10 | ||
#define DT_SOCK 12 | ||
#define DT_WHT 14 | ||
|
||
#define DT_MAX (S_DT_MASK + 1) /* 16 */ | ||
|
||
/* | ||
* fs on-disk file types. | ||
* Only the low 3 bits are used for the POSIX file types. | ||
* Other bits are reserved for fs private use. | ||
* These definitions are shared and used by multiple filesystems, | ||
* and MUST NOT change under any circumstances. | ||
* | ||
* Note that no fs currently stores the whiteout type on-disk, | ||
* so whiteout dirents are exposed to user as DT_CHR. | ||
*/ | ||
#define FT_UNKNOWN 0 | ||
#define FT_REG_FILE 1 | ||
#define FT_DIR 2 | ||
#define FT_CHRDEV 3 | ||
#define FT_BLKDEV 4 | ||
#define FT_FIFO 5 | ||
#define FT_SOCK 6 | ||
#define FT_SYMLINK 7 | ||
|
||
#define FT_MAX 8 | ||
|
||
/* | ||
* declarations for helper functions, accompanying implementation | ||
* is in fs/fs_types.c | ||
*/ | ||
extern unsigned char fs_ftype_to_dtype(unsigned int filetype); | ||
extern unsigned char fs_umode_to_ftype(umode_t mode); | ||
extern unsigned char fs_umode_to_dtype(umode_t mode); | ||
|
||
#endif |