diff --git a/qtfs/qtfs_server/fsops.c b/qtfs/qtfs_server/fsops.c index cd7365d25c4af0e4aa6b8533a2b725db09bb62d2..f2f3749ef9783c8c08c2447d8163988a96e0e782 100644 --- a/qtfs/qtfs_server/fsops.c +++ b/qtfs/qtfs_server/fsops.c @@ -668,14 +668,20 @@ static int handle_readdir(struct qtserver_arg *arg) rsp->d.vldcnt = 0; return sizeof(struct qtrsp_readdir) - sizeof(rsp->dirent); } - file->f_pos = req->pos; + if (vfs_llseek(file, req->pos, SEEK_SET) < 0) { + qtfs_err("handle readdir error, file path:%s seek set:%lld failed", req->path, req->pos); + rsp->d.ret = QTFS_ERR; + rsp->d.vldcnt = 0; + filp_close(file, NULL); + return sizeof(struct qtrsp_readdir) - sizeof(rsp->dirent); + } ret = iterate_dir(file, &buf.ctx); - rsp->d.pos = file->f_pos; + rsp->d.pos = vfs_llseek(file, 0, SEEK_CUR); rsp->d.ret = QTFS_OK; rsp->d.vldcnt = buf.vldcnt; rsp->d.over = (req->pos == rsp->d.pos) ? 1 : 0; qtfs_info("handle readdir ret:%d, pos:%lld path:%s, valid count:%d, leftcount:%d validbyte:%lu\n", - ret, req->pos, req->path, buf.vldcnt, buf.count, sizeof(rsp->dirent) - buf.count); + ret, req->pos, req->path, buf.vldcnt, buf.count, req->count - buf.count); filp_close(file, NULL); return sizeof(struct qtrsp_readdir_len) + req->count;