storage R&D guy.
全部博文(1000)
分类: LINUX
2014-06-17 20:30:06
Ext4 的EXT4_IOC_GETFLAGS命令用于获取inode已设置的标志信息,将获取的inode标志位的信息的结果传给ioctl的第三个参数unsigned int arg:
ioctl(fd, EXT4_IOC_GETFLAGS, arg )
Ext4 的EXT4_IOC_SETFLAGS命令用于设置inode的标志信息,将要设置的最终inode标志位的信息作为ioctl 的第三个参数unsigned int arg传入ioctl函数中:
ioctl(fd, EXT4_IOC_SETFLAGS, arg )
虽然Inode具有大量的标志,但是最终用户可设置的inode标志只有五个,其他标志由内核默认设置。用户可直接设置的5个inode标志是:
#define EXT4_SYNC_FL 0x00000008 /* 同步更新 */
#define EXT4_NOATIME_FL 0x00000080 /* 不更新文件访问时间 */
#define EXT4_APPEND_FL 0x00000020 /* 文件仅能追加写 */
#define EXT4_IMMUTABLE_FL 0x00000010 /* 不可改变的文件 */
#define EXT4_DIRSYNC_FL 0x00010000 /* 目录同步操作(仅目录可用) */
(1) 首先确定用户对文件具有访问权限且对文件所在的文件系统具有写权限(因为设置inode标志成功会引起元数据更新操作)。并将用户设置的inode标志flags (ioctl命令的第三个参数)拷贝到内核空间。
(2) 获取inode互斥锁,然后判断inode是否是配额文件,如果是配额文件,则不可对其设置inode标志;直接跳出
(3) 接着会对用户要求设置的inode标志flags进行适当的修改:
修改的原因有很多:
1)屏蔽不适合给定类型的inode的标志。比如要求设置的标志中含有与文件类型不匹配的标志(将目录的标志设置给普通文件可不行),则将不匹配的标志清除掉;
2)如果用户要求设置标识中含有EXT4_APPEND_FL 或 EXT4_IMMUTABLE_FL标志,判断是否需要是否具有权限修改JOURNAL_DATA 标志。要检查用户是否有相应的capability。如果不具备,那么也无法设置inode标志;
3)如果inode原有标识中已设置 EXT4_EXTENTS_FL 标志,则不支持清除extents标志,如果用户要求设置的新标识中无使用extents的标志,则退出;
如果原inode中未设置使用extents的标志,而要设置的inode标志中含使用extents的标志,并从设置的inode标志中去掉使用extents的标志,并在随后迁移文件支持extents方式
4)如果用户要求设置的标识中含有EXT4_EOFBLOCKS_FL标志且inode原有标志中没有EXT4_EOFBLOCKS_FL标志,则退出;
如果用户要求设置的标识中无EXT4_EOFBLOCKS_FL标志且inode原有标志中EXT4_EOFBLOCKS_FL标志,则把inode的全部数据块索引信息清除;
5)发起日志事务操作,准备更新元数据块——inode数据。
6)重新设置用户设置的flags:首先,保存用户设置的flags中那些用户可修改的标志,屏蔽掉用户不可修改的标志;然后,加上原有inode中用户不可修改的标志;
7)设置inode标志,更改inode相关信息(inode更改时间),更新inode内容到磁盘;
8)结束日志事务处理;
9)如果新设置了EXT4_JOURNAL_DATA_FL标志,则刷新日志内容,设置日志标志
10) 迁移inode,使其支持extents。用于将用间接映射方式组织的文件数据块用extents的方式组织。
(4) 释放inode互斥锁,结束对文件系统的写操作,返回