Message ID | 1299347533-17047-6-git-send-email-aneesh.kumar@linux.vnet.ibm.com |
---|---|
State | New |
Headers | show |
On Sat, Mar 5, 2011 at 5:52 PM, Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> wrote: > Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@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 1fa7256..293a562 100644 > --- a/hw/9pfs/virtio-9p.c > +++ b/hw/9pfs/virtio-9p.c > @@ -142,7 +142,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); > + } dirfd(NULL) will crash so we need to check !dir first: $ cat dirfd.c #include <stdio.h> int main(int argc, char **argv) { printf("%d\n", dirfd(NULL)); return 0; } $ gcc -o dirfd dirfd.c $ ./dirfd Segmentation fault Stefan
On Sun, 13 Mar 2011 16:42:56 +0000, Stefan Hajnoczi <stefanha@gmail.com> wrote: > On Sat, Mar 5, 2011 at 5:52 PM, Aneesh Kumar K.V > <aneesh.kumar@linux.vnet.ibm.com> wrote: > > Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@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 1fa7256..293a562 100644 > > --- a/hw/9pfs/virtio-9p.c > > +++ b/hw/9pfs/virtio-9p.c > > @@ -142,7 +142,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); > > + } > > dirfd(NULL) will crash so we need to check !dir first: > Will add the check -aneesh
diff --git a/hw/9pfs/virtio-9p.c b/hw/9pfs/virtio-9p.c index 1fa7256..293a562 100644 --- a/hw/9pfs/virtio-9p.c +++ b/hw/9pfs/virtio-9p.c @@ -142,7 +142,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) @@ -484,6 +489,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 @@ -550,6 +559,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; @@ -633,7 +648,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); }
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> --- hw/9pfs/virtio-9p.c | 21 +++++++++++++++++++-- 1 files changed, 19 insertions(+), 2 deletions(-)