無料Wikiサービス | デモページ
検索

アクセス数
最近のコメント
kprobe - ななし
ksetの実装 - スーパーコピー
カーネルスレッドとは - ノース
カーネルスレッドとは - nbyst
asmlinkageってなに? - ノース
asmlinkageってなに? - よろしく
はじめ - ノース
はじめ - ノース
はじめ - 楽打連動ユーザー
はじめ - 楽打連動ユーザー
Adsense
広告情報が設定されていません。

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 作成)