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が設定されている。
#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時のオプションで設定します。


最終更新 2014/03/05 20:19:08 - north
(2014/03/05 20:19:08 作成)


検索

アクセス数
3676047
最近のコメント
コアダンプファイル - sakaia
list_head構造体 - yocto_no_yomikata
勧告ロックと強制ロック - wataash
LKMからのファイル出力 - 重松 宏昌
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
Adsense
広告情報が設定されていません。