diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2010-11-20 13:22:24 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2010-11-22 13:24:44 -0500 |
commit | e7c58e974a0318fcca5368e7b3570e10e9ae9028 (patch) | |
tree | de7c5bf4d565ce0365af6fe1d82bd035deb37024 /fs/nfs | |
parent | 5c346854d8ce6ca91931f8fc9177934257a667d0 (diff) |
NFS: Fix a page leak in nfs_do_filldir()
nfs_do_filldir() must always free desc->page when it is done, otherwise
we end up leaking the page.
Also remove unused variable 'dentry'.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs')
-rw-r--r-- | fs/nfs/dir.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 2789cb3fc425..42e66e961d73 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
@@ -701,11 +701,12 @@ int nfs_do_filldir(nfs_readdir_descriptor_t *desc, void *dirent, | |||
701 | int res = 0; | 701 | int res = 0; |
702 | struct nfs_cache_array *array = NULL; | 702 | struct nfs_cache_array *array = NULL; |
703 | unsigned int d_type = DT_UNKNOWN; | 703 | unsigned int d_type = DT_UNKNOWN; |
704 | struct dentry *dentry = NULL; | ||
705 | 704 | ||
706 | array = nfs_readdir_get_array(desc->page); | 705 | array = nfs_readdir_get_array(desc->page); |
707 | if (IS_ERR(array)) | 706 | if (IS_ERR(array)) { |
708 | return PTR_ERR(array); | 707 | res = PTR_ERR(array); |
708 | goto out; | ||
709 | } | ||
709 | 710 | ||
710 | for (i = desc->cache_entry_index; i < array->size; i++) { | 711 | for (i = desc->cache_entry_index; i < array->size; i++) { |
711 | d_type = DT_UNKNOWN; | 712 | d_type = DT_UNKNOWN; |
@@ -726,9 +727,8 @@ int nfs_do_filldir(nfs_readdir_descriptor_t *desc, void *dirent, | |||
726 | desc->eof = 1; | 727 | desc->eof = 1; |
727 | 728 | ||
728 | nfs_readdir_release_array(desc->page); | 729 | nfs_readdir_release_array(desc->page); |
730 | out: | ||
729 | cache_page_release(desc); | 731 | cache_page_release(desc); |
730 | if (dentry != NULL) | ||
731 | dput(dentry); | ||
732 | dfprintk(DIRCACHE, "NFS: nfs_do_filldir() filling ended @ cookie %Lu; returning = %d\n", | 732 | dfprintk(DIRCACHE, "NFS: nfs_do_filldir() filling ended @ cookie %Lu; returning = %d\n", |
733 | (unsigned long long)*desc->dir_cookie, res); | 733 | (unsigned long long)*desc->dir_cookie, res); |
734 | return res; | 734 | return res; |