hc
2024-08-16 a24a44ff9ca902811b99aa9663d697cf452e08ef
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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_NS_GPL(fs_ftype_to_dtype, ANDROID_GKI_VFS_EXPORT_ONLY);
 
/*
 * 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);