struct super_block 结构体定义的一部分如下所示:
struct super_block {
//...
dev_t s_dev; /* identifier */
unsigned char s_blocksize_bits; /* block size in bits */
unsigned long s_blocksize; /* block size in bytes */
unsigned char s_dirt; /* dirty flag */
loff_t s_maxbytes; /* max file size */
struct file_system_type *s_type; /* filesystem type */
struct super_operations *s_op; /* superblock methods */
//...
unsigned long s_flags; /* mount flags */
unsigned long s_magic; /* filesystem’s magic number */
struct dentry *s_root; /* directory mount point */
//...
char s_id[32]; /* informational name */
void *s_fs_info; /* filesystem private info */
};
我在s_blocksize_bits
现场有点困惑。比如我设置s_blocksize=512
了,正确的写法是设置s_blocksize_bits=9
。但是 512 的二进制表示是 1000000000,这意味着它需要 10 位来存储它。为什么 Linux 内核需要少一点。
这里我附上Linux内核中十六进制转换的源码:
/* assumes size > 256 */
static inline unsigned int blksize_bits(unsigned int size)
{
unsigned int bits = 8;
do {
bits++;
size >>= 1;
} while (size > 256);
return bits;
}