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 <nbalacha@redhat.com>
This commit is contained in:
parent
641e5be8d1
commit
d9f773ba71
@ -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) {
|
||||
|
@ -751,7 +751,7 @@ typedef struct dht_fd_ctx {
|
||||
|
||||
#define ENTRY_MISSING(op_ret, op_errno) (op_ret == -1 && op_errno == ENOENT)
|
||||
|
||||
#define is_revalidate(loc) (dht_inode_ctx_layout_get (loc->inode, this, NULL) == 0)
|
||||
#define is_revalidate(loc) (dht_inode_ctx_layout_get ((loc)->inode, this, NULL) == 0)
|
||||
|
||||
#define is_last_call(cnt) (cnt == 0)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user