Perhaps we have some errors occur(like security),then we don't update atime,because we didn't actually access it Signed-off-by: Hao Ge <gehao@xxxxxxxxxx> --- fs/namei.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 71c13b2990b4..033d36d5c1c5 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -1779,15 +1779,6 @@ static const char *pick_link(struct nameidata *nd, struct path *link, unlikely(link->mnt->mnt_flags & MNT_NOSYMFOLLOW)) return ERR_PTR(-ELOOP); - if (!(nd->flags & LOOKUP_RCU)) { - touch_atime(&last->link); - cond_resched(); - } else if (atime_needs_update(&last->link, inode)) { - if (!try_to_unlazy(nd)) - return ERR_PTR(-ECHILD); - touch_atime(&last->link); - } - error = security_inode_follow_link(link->dentry, inode, nd->flags & LOOKUP_RCU); if (unlikely(error)) @@ -1810,6 +1801,16 @@ static const char *pick_link(struct nameidata *nd, struct path *link, if (IS_ERR(res)) return res; } + + if (!(nd->flags & LOOKUP_RCU)) { + touch_atime(&last->link); + cond_resched(); + } else if (atime_needs_update(&last->link, inode)) { + if (!try_to_unlazy(nd)) + return ERR_PTR(-ECHILD); + touch_atime(&last->link); + } + if (*res == '/') { error = nd_jump_root(nd); if (unlikely(error)) -- 2.25.1