Ext4文件系统架构分析(四) ——ioctl源码分析之设置/获取Inode标志位

1.  EXT4_IOC_GETFLAGS获取inode标志位

Ext4 的EXT4_IOC_GETFLAGS命令用于获取inode已设置的标志信息,将获取的inode标志位的信息的结果传给ioctl的第三个参数unsigned int arg:

 ioctl(fd, EXT4_IOC_GETFLAGS, arg )

2.  EXT4_IOC_SETFLAGS设置inode标志位

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 /* 目录同步操作(仅目录可用) */

3.  设置inode标志位的操作过程

(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互斥锁,结束对文件系统的写操作,返回

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值