seq_file: always update file->f_pos in seq_lseek()

This issue was first pointed out by Jiaxing Wang several months ago, but
no
further comments:
https://lkml.org/lkml/2013/6/29/41

As we know
pread() does not change f_pos, so after pread(), file->f_pos
and
m->read_pos become different. And seq_lseek() does not update
file->f_pos
if offset equals to m->read_pos, so after pread() and
seq_lseek()(lseek to
m->read_pos), then a subsequent read may read from
a wrong position, the
following program produces 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);

out put:
pread:
 ck_netbios_ns
12665
read:

nf_conntrack_netbios

/proc/modules:
nf_conntrack_netbios_ns 12665 0 -
Live 0xffffffffa038b000
nf_conntrack_broadcast 12589 1
nf_conntrack_netbios_ns, Live 0xffffffffa0386000

So we always update
file->f_pos to offset in seq_lseek() to fix this issue.

cherry-picked
from
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/fs/seq_file.c?id=05e16745c0c471bba313961b605b6da3b21a853d

Signed-off-by:
Jiaxing Wang <hello.wjx@gmail.com>
Signed-off-by: Gu Zheng
<guz.fnst@cn.fujitsu.com>
Signed-off-by: Al Viro
<viro@zeniv.linux.org.uk>

Conflicts:
 fs/seq_file.c

Change-Id:
If419b92498e2c3e08669a4342e9b9ebf99ad3768
Signed-off-by: Devin Kim
<dojip.kim@lge.com>
Signed-off-by: franciscofranco
<franciscofranco.1990@gmail.com>

idea is taken here -
https://github.com/franciscofranco/hammerhead/commit/3391f4559f8e861f2dccbf046324e48fa9d16c94