aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2010-11-20 13:22:24 -0500
committerTrond Myklebust <Trond.Myklebust@netapp.com>2010-11-22 13:24:44 -0500
commite7c58e974a0318fcca5368e7b3570e10e9ae9028 (patch)
treede7c5bf4d565ce0365af6fe1d82bd035deb37024 /fs/nfs
parent5c346854d8ce6ca91931f8fc9177934257a667d0 (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.c10
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);
730out:
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;