noatime
noatimeはファイルの参照時のアクセスタイムを更新するもですが、path_lookupat()からlink_path_walk()/follow_link()等をへてtouch_atime()で、かかるinodeのアクセスタイムが更新され、。従って階層のあるファイルを参照する時、そのファイルだけでなくかかる階層のディレクトリについても更新されます。
noatimeの設定される条件は以下の通りです。
・inodeフラグにS_NOATIMEが設定されている。
・ファイルシステムのスーパブロックにMS_RDONLYまたはMS_NOATIMEが設定されている。
・対象inodeがディレクトリの時、スーパブロックにMS_NODIRATIMEが設定されている。
・マウントフラグにMNT_NOATIMEが設定されている。
・対象inodeがディレクトリの時、マウントフラグにMNT_NODIRATIMEが設定されている。
inode->i_flagsはinode取得時、inode->i_sb->s_flagsの内容が反映されるのですが、chattrコマンドでファイル単位に設定することができます。
mnt->mnt_flagsはmount時のオプションで設定します。
noatimeの設定される条件は以下の通りです。
・inodeフラグにS_NOATIMEが設定されている。
・ファイルシステムのスーパブロックにMS_RDONLYまたはMS_NOATIMEが設定されている。
・対象inodeがディレクトリの時、スーパブロックにMS_NODIRATIMEが設定されている。
・マウントフラグにMNT_NOATIMEが設定されている。
・対象inodeがディレクトリの時、マウントフラグにMNT_NODIRATIMEが設定されている。
#define IS_NOATIME(inode) __IS_FLG(inode, MS_RDONLY|MS_NOATIME) #define __IS_FLG(inode,flg) ((inode)->i_sb->s_flags & (flg)) void touch_atime(struct vfsmount *mnt, struct dentry *dentry) { struct inode *inode = dentry->d_inode; struct timespec now; if (inode->i_flags & S_NOATIME) return; if (IS_NOATIME(inode)) return; if ((inode->i_sb->s_flags & MS_NODIRATIME) && S_ISDIR(inode->i_mode)) return; if (mnt->mnt_flags & MNT_NOATIME) return; if ((mnt->mnt_flags & MNT_NODIRATIME) && S_ISDIR(inode->i_mode)) return; now = current_fs_time(inode->i_sb); if (!relatime_need_update(mnt, inode, now)) return; if (timespec_equal(&inode->i_atime, &now)) return; if (mnt_want_write(mnt)) return; inode->i_atime = now; mark_inode_dirty_sync(inode); mnt_drop_write(mnt); }inode->i_sb->s_flagsはファイルシステムの物理デバイスのスーパブロックに設定された属性で、ファイルシステム作成時ないしtune2fsコマンドで設定します。(たぶん)
inode->i_flagsはinode取得時、inode->i_sb->s_flagsの内容が反映されるのですが、chattrコマンドでファイル単位に設定することができます。
mnt->mnt_flagsはmount時のオプションで設定します。