Signed-off-by: Aneesh Kumar K.V <aneesh.ku...@linux.vnet.ibm.com> --- hw/9pfs/virtio-9p.c | 21 +++++++++++++++++++-- 1 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c index a4c5905..08c0399 100644 --- a/hw/9pfs/virtio-9p.c +++ b/hw/9pfs/virtio-9p.c @@ -138,7 +138,12 @@ static int v9fs_do_open(V9fsState *s, V9fsString *path, int flags) static DIR *v9fs_do_opendir(V9fsState *s, V9fsString *path) { - return s->ops->opendir(&s->ctx, path->data); + DIR *dir; + dir = s->ops->opendir(&s->ctx, path->data); + if (dirfd(dir) > P9_FD_RECLAIM_THRES) { + v9fs_reclaim_fd(s); + } + return dir; } static void v9fs_do_rewinddir(V9fsState *s, DIR *dir) @@ -476,6 +481,10 @@ static V9fsFidState *lookup_fid(V9fsState *s, int32_t fid) f->fsmap.fs.fd = v9fs_do_open(s, &f->fsmap.path, f->fsmap.open_flags); } + } else if (f->fsmap.fid_type == P9_FID_DIR) { + if (f->fsmap.fs.dir == NULL) { + f->fsmap.fs.dir = v9fs_do_opendir(s, &f->fsmap.path); + } } /* * Mark the fid as referenced so that the LRU @@ -542,6 +551,12 @@ static void v9fs_reclaim_fd(V9fsState *s) f->fsmap.fs.fd = -1; reclaim_count++; } + } else if (f->fsmap.fid_type == P9_FID_DIR) { + if (f->fsmap.fs.dir != NULL) { + v9fs_do_closedir(s, f->fsmap.fs.dir); + f->fsmap.fs.dir = NULL; + reclaim_count++; + } } if (reclaim_count >= P9_FD_RECLAIM_THRES/2) { break; @@ -625,7 +640,9 @@ static int free_fid(V9fsState *s, int32_t fid) v9fs_do_close(s, fidp->fsmap.fs.fd); } } else if (fidp->fsmap.fid_type == P9_FID_DIR) { - v9fs_do_closedir(s, fidp->fsmap.fs.dir); + if (fidp->fsmap.fs.dir != NULL) { + v9fs_do_closedir(s, fidp->fsmap.fs.dir); + } } else if (fidp->fsmap.fid_type == P9_FID_XATTR) { retval = v9fs_xattr_fid_clunk(s, fidp); } -- 1.7.1