曾经以为人生就这样了,浮躁的心拒绝再看代码。然而来到美国两年之后,我于本月初去了一趟拉斯维加斯,发现在那儿找个美国小姐要八百美金,而且还不是包夜。当那个金发美女都已经走进我的房间,我却因为价钱太贵承受不起而决定取消的时候,我觉得我的人生真是太失败了。那晚,看她出去之后,我内心一阵郁闷,于是打开电脑开始看A片,怎奈看到一半电脑竟然说文件系统崩溃了。我心想ext4文件系统不是号称很强大吗,怎么这么容易就崩溃了呢?而且平时也不崩溃,怎么关键时候就这么坑爹啊!于是我连夜看了一晚上ext4文件系统的代码,发现是由该文件系统里的一个bug引起的。折腾了半天,给内核打了个补丁,解决了这个问题,系统能用了,然而却再也没心情看A片了,倒是觉得有必要把这些ext4文件系统的代码的阅读心得给记下来。于是便有了这个系列文章。
看内核代码的第一个问题是相关的代码到底在哪里。话说距离写usb那些文字已经过去五年了,而我已经从当初的IT民工变成了今日的北美猥琐男。尽管我已不再年轻,但我依然像杨钰莹一样纯洁,我依然保留着那份男人的直觉,这直觉告诉我,ext4文件系统相关的代码在fs/ext4目录下面,列举一下该目录里面的内容:(我看的代码是Linux Kernel 3.4.4版本的)
$ls
acl.c bitmap.c ext4_extents.h ext4_jbd2.h fsync.c indirect.c Kconfig mballoc.h move_extent.c resize.c truncate.h xattr_security.c
acl.h block_validity.c ext4.h extents.c hash.c inode.c Makefile migrate.c namei.c super.c xattr.c xattr_trusted.c
balloc.c dir.c ext4_jbd2.c file.c ialloc.c ioctl.c mballoc.c mmp.c page-io.c symlink.c xattr.h xattr_user.c
用wc命令看一下,
$wc -l *
439acl.c
77acl.h
766balloc.c
31bitmap.c
268block_validity.c
667dir.c
296ext4_extents.h
2372 ext4.h
154ext4_jbd2.c
399ext4_jbd2.h
4866 extents.c
262file.c
271fsync.c
208hash.c
1158 ialloc.c
1502 indirect.c
4676 inode.c
509ioctl.c
85Kconfig
14Makefile
5047 mballoc.c
222mballoc.h
604migrate.c
353mmp.c
1423move_extent.c
2607 namei.c
433page-io.c
1689 resize.c
4980 super.c
56symlink.c
43truncate.h
1608 xattr.c
155xattr.h
82xattr_security.c
58xattr_trusted.c
61xattr_user.c
38441 total
纯ext4的代码就有三万八千多行。如果一天看一行的话,一百年也才能看个三万六千多行。但是没办法,学计算机的人都只有苦逼的命。像我这样的屌丝对于生活其实没有太多选择,如果能选择,那我希望自己生活在新闻联播里,那里是爱的家园,人间的天堂,在那里我不用看代码,也能看得起病,能住上每月77元的廉租房,能在大学食堂以每顿两三元的价钱就餐。然而现实是我根本没有选择,所以,不管代码有多少行,都得硬着头皮看下去。可是这么多文件,从哪儿开始看起呢,先扫一眼Makefile,
$cat Makefile
#
# Makefile for the linuxext4-filesystemroutines.
#
obj-$(CONFIG_EXT4_FS) +=ext4.o
ext4-y := balloc.obitmap.o dir.o file.o fsync.o ialloc.o inode.o page-io.o \
ioctl.o namei.o super.osymlink.o hash.o resize.o extents.o \
ext4_jbd2.o migrate.o mballoc.oblock_validity.o move_extent.o \
mmp.o indirect.o
ext4-$(CONFIG_EXT4_FS_XATTR) += xattr.o xattr_user.oxattr_trusted.o
ext4-$(CONFIG_EXT4_FS_POSIX_ACL) += acl.o
ext4-$(CONFIG_EXT4_FS_SECURITY) += xattr_security.o
按过去的经验,很显然,最基本的文件就是ext4.c。可实际上这个目录下面并没有一个叫做ext4.c的文件。于是意识到有时候,经验这东西吧,就像六脉神剑,也是时灵时不灵。不过另一个经验是,当代的文件系统,基本都是可以以模块方式加载,既然是以模块方式加载嘛,那就必然要调用module_init()函数来初始化模块吧。于是就搜索一下module_init(),
$grep module_init *
super.c:module_init(ext4_init_fs)
原来是在super.c这个文件里面。打开这个文件一看,的确,ext4_init_fs()正是整个模块的入口处。也是我们看代码的起点,而这也就是我们这个故事的开始。