After pread(), file->f_pos and m->read_pos get different, and lseek() to m->read_pos did not update file->f_pos, then a subsequent read may read from a wrong position, the following program shows the problem: char str1[32] = { 0 }; char str2[32] = { 0 }; int poffset = 10; int count = 20; /*open any seq file*/ int fd = open("/proc/modules", O_RDONLY); pread(fd, str1, count, poffset); printf("pread:%s\n", str1); /*seek to where m->read_pos is*/ lseek(fd, poffset+count, SEEK_SET); /*supposed to read from poffset+count, but this read from position 0*/ read(fd, str2, count); printf("read:%s\n", str2); Signed-off-by: Jiaxing Wang <hello.wjx@xxxxxxxxx> --- fs/seq_file.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/seq_file.c b/fs/seq_file.c index 774c1eb..4b22b26 100644 --- a/fs/seq_file.c +++ b/fs/seq_file.c @@ -328,7 +328,8 @@ loff_t seq_lseek(struct file *file, loff_t offset, int whence) m->read_pos = offset; retval = file->f_pos = offset; } - } + } else + file->f_pos = offset; } file->f_version = m->version; mutex_unlock(&m->lock); -- 1.8.1.2 -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html