diff options
| author | Shehjar Tikoo <shehjart@gluster.com> | 2010-08-31 06:50:27 +0000 | 
|---|---|---|
| committer | Vijay Bellur <vijay@dev.gluster.com> | 2010-08-31 07:44:18 -0700 | 
| commit | e1422d796fefd6a3ae599507e71efdb922eede02 (patch) | |
| tree | 8d964305c806155f85abd498d3e2ef2e337c5839 | |
| parent | 713fd9536459f730450fc06177c0feea6d6bdd28 (diff) | |
nfs3: Dont ref dir fd_t used in hard fh resolution
..because the extra ref was under the mistaken assumption that
directory fd_t will be cached even during hard fh resolution and
that is not the case.
Signed-off-by: Shehjar Tikoo <shehjart@gluster.com>
Signed-off-by: Vijay Bellur <vijay@dev.gluster.com>
BUG: 1397 (Cached dir fd_ts are a leakin')
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1397
| -rw-r--r-- | xlators/nfs/server/src/nfs3-helpers.c | 16 | ||||
| -rw-r--r-- | xlators/nfs/server/src/nfs3.c | 6 | 
2 files changed, 11 insertions, 11 deletions
diff --git a/xlators/nfs/server/src/nfs3-helpers.c b/xlators/nfs/server/src/nfs3-helpers.c index 116d145033a..dae2d6a61fc 100644 --- a/xlators/nfs/server/src/nfs3-helpers.c +++ b/xlators/nfs/server/src/nfs3-helpers.c @@ -2704,14 +2704,16 @@ nfs3_fh_resolve_opendir_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                          cs->resolvedloc.path);          nfs_user_root_create (&nfu); -        /* This function can be called in a recursive code path, so if another -         * directory was opened in an earlier call, we must unref through this -         * reference before opening another fd_t. +        /* Keep this directory fd_t around till we have either: +         * a. found the entry, +         * b. exhausted all the entries, +         * c. decide to step into a child directory. +         * +         * This decision is made in nfs3_fh_resolve_check_response.           */ -        if (cs->resolve_dir_fd) -                fd_unref (cs->resolve_dir_fd); - -        cs->resolve_dir_fd = fd_ref (fd); +        cs->resolve_dir_fd = fd; +        gf_log (GF_NFS3, GF_LOG_TRACE, "resolve new fd refed: 0x%lx, ref: %d", +                (long)cs->resolve_dir_fd, cs->resolve_dir_fd->refcount);          ret = nfs_readdirp (cs->nfsx, cs->vol, &nfu, fd, GF_NFS3_DTPREF, 0,                              nfs3_fh_resolve_readdir_cbk, cs); diff --git a/xlators/nfs/server/src/nfs3.c b/xlators/nfs/server/src/nfs3.c index bbbbca89f2b..420baddb67d 100644 --- a/xlators/nfs/server/src/nfs3.c +++ b/xlators/nfs/server/src/nfs3.c @@ -199,13 +199,11 @@ nfs3_call_state_wipe (nfs3_call_state_t *cs)          nfs3 = cs->nfs3state;          if (cs->fd) { -                gf_log (GF_NFS3, GF_LOG_TRACE, "fd ref: %d", cs->fd->refcount); +                gf_log (GF_NFS3, GF_LOG_TRACE, "fd 0x%lx ref: %d", +                        (long)cs->fd, cs->fd->refcount);                  fd_unref (cs->fd);          } -        if (cs->resolve_dir_fd) -                fd_unref (cs->resolve_dir_fd); -          if (cs->resolventry)                  GF_FREE (cs->resolventry);  | 
