From 59580a95d23a03a8b9bbe6aad79d311f2fbe65f7 Mon Sep 17 00:00:00 2001 From: liqiang Date: Tue, 9 Jul 2024 11:47:49 +0000 Subject: [PATCH] fix readdir bug in devtmpfs if /dev/ have a large number of files, readdir can't get whole informations, because of direct save and use file->f_pos is not correct in devtmpfs Just use vfs_llseek to instead. Signed-off-by: liqiang --- qtfs/qtfs_server/fsops.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/qtfs/qtfs_server/fsops.c b/qtfs/qtfs_server/fsops.c index cd7365d..a76838b 100644 --- a/qtfs/qtfs_server/fsops.c +++ b/qtfs/qtfs_server/fsops.c @@ -662,15 +662,15 @@ static int handle_readdir(struct qtserver_arg *arg) return sizeof(struct qtrsp_readdir) - sizeof(rsp->dirent); } file = filp_open(req->path, O_RDONLY|O_NONBLOCK|O_DIRECTORY, 0); - if (IS_ERR_OR_NULL(file)) { + if (IS_ERR_OR_NULL(file) || vfs_llseek(file, req->pos, SEEK_SET) < 0) { qtfs_err("handle readdir error, filp:<%s> open failed.\n", req->path); rsp->d.ret = QTFS_ERR; rsp->d.vldcnt = 0; return sizeof(struct qtrsp_readdir) - sizeof(rsp->dirent); } - file->f_pos = req->pos; + ret = iterate_dir(file, &buf.ctx); - rsp->d.pos = file->f_pos; + rsp->d.pos = vfs_llseek(file, 0, SEEK_CUR); // get current pos rsp->d.ret = QTFS_OK; rsp->d.vldcnt = buf.vldcnt; rsp->d.over = (req->pos == rsp->d.pos) ? 1 : 0; -- Gitee