From d9f773ba719397c12860f494a8cd38109e4b2fe3 Mon Sep 17 00:00:00 2001 From: N Balachandran Date: Fri, 2 Feb 2018 12:35:16 +0530 Subject: cluster/dht: Fixed leak in dht_populate_inode_for_dentry Fixed an issue in dht_populate_inode_for_dentry where a layout is set in the inode without checking if it is already set. This overwrites the value each time without freeing the already existing layout. Change-Id: I651bf539a0b82b4ddc4c355890c16a8e91f5f1fd BUG: 1541264 Signed-off-by: N Balachandran --- xlators/cluster/dht/src/dht-common.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'xlators/cluster/dht/src/dht-common.c') diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index 36ee3eeb8c5..ec6e3d857c1 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -6337,15 +6337,20 @@ dht_populate_inode_for_dentry (xlator_t *this, xlator_t *subvol, return; } + gf_uuid_copy (loc.gfid, orig_entry->d_stat.ia_gfid); + loc.inode = inode_ref (orig_entry->inode); + + if (is_revalidate (&loc)) { + loc_wipe (&loc); + return; + } + layout = dht_layout_new (this, 1); if (!layout) goto out; ret = dht_layout_merge (this, layout, subvol, 0, 0, orig_entry->dict); if (!ret) { - gf_uuid_copy (loc.gfid, orig_entry->d_stat.ia_gfid); - loc.inode = inode_ref (orig_entry->inode); - ret = dht_layout_normalize (this, &loc, layout); if (ret == 0) { dht_layout_set (this, orig_entry->inode, layout); @@ -6507,6 +6512,7 @@ list: entry, orig_entry); } + } } else { if (orig_entry->inode) { -- cgit