在很多情况下,我们会对一个档案或目录的inode做出改变。比方说,我们可以对某个档案呼叫utime()改变这个档案的access time,或者是可以呼叫truncate()把档案的长度减短,这些系统呼叫都会改变档案的inode的属性。有的人会想到,那我们直接把inode拿来改改就好了嘛,何必提供这么个函式呢? 没错,VFS是的确把inode拿来改一改,但是,我们有说过,VFS做的事是属于全部档案系统所共同的部分,而档案系统之间的差异性,必须由各个档案系统提供函式来做。因此,万一使用者改了某个跟档案系统有很大关系的属性时,档案系统本身必须被告知才行。因此,notify_change()就是VFS 告知档案系统的接口。跟上面很多函式一样,档案系统的notify_change()并不会直接被呼叫,s_op->notify_change ()是被包装在VFS函式里,这个函式也叫
notify_change(),它做的事就是把inode里的字段做user所要求的改变,并呼叫档案所属的档案系统的notify_change()。可以改变的属性是放在一个叫iattr结构里。
struct iattr {
unsigned int ia_valid; umode_t ia_mode; uid_t ia_uid; gid_t ia_gid; off_t ia_size; time_t ia_atime; time_t ia_mtime; time_t ia_ctime;
unsigned int ia_attr_flags; };
这个结构的宣告可以在里找到。ia_valid这个字段用来描述底下这几个字段那些是要改变的,ia_mode指的是新的权限,ia_uid为使用者 id,ia_gid为群组id,ia_size是档案大小,ia_atime是access time,ia_mtime为modification time,ia_ctime是creation time,ia_valid的值可以是底下这几个常数的OR值。
#define ATTR_MODE 1
#define ATTR_UID 2 #define ATTR_GID 4 #define ATTR_SIZE 8 #define ATTR_ATIME 16 #define ATTR_MTIME 32 #define ATTR_CTIME 64
#define ATTR_ATIME_SET 128 #define ATTR_MTIME_SET 256 #define ATTR_FORCE 512
#define ATTR_ATTR_FLAG 1024