From: Peng Tao Date: Mon, 25 Jun 2012 13:31:18 +0000 (+0800) Subject: LU-1322 llite: revalidate dentry if f_version is 0 X-Git-Tag: v1_8_9_WC1_RC1~32 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=b3f95c01348185e64d6b184d2fc7a21b1551b2ff;p=fs%2Flustre-release.git LU-1322 llite: revalidate dentry if f_version is 0 If a file is lseek()ed before i_version changes, it is possible for application to call into ll_readdir and have f_pos pointing to some garbage data and cause kernel hang. Signed-off-by: Peng Tao Change-Id: I49ab94ad5c63c3029d5ad96e27e38e124a135ed8 Reviewed-on: http://review.whamcloud.com/3181 Tested-by: Hudson Tested-by: Maloo Reviewed-by: Lai Siyao Reviewed-by: Andreas Dilger --- diff --git a/lustre/llite/dir.c b/lustre/llite/dir.c index 4e94c2a..588929c 100644 --- a/lustre/llite/dir.c +++ b/lustre/llite/dir.c @@ -348,7 +348,8 @@ static int ll_readdir_18(struct file *filp, void *dirent, filldir_t filldir) pgoff_t idx = pos >> CFS_PAGE_SHIFT; pgoff_t npages = dir_pages(inode); unsigned chunk_mask = ll_dir_page_mask(inode); - int need_revalidate = (filp->f_version != inode->i_version); + int need_revalidate = (filp->f_version == 0 || + filp->f_version != inode->i_version); int rc = 0; int done; /* when this becomes negative --- stop iterating */