diff options
author | Amar Tumballi <amar@gluster.com> | 2011-09-26 17:42:40 +0530 |
---|---|---|
committer | Vijay Bellur <vijay@gluster.com> | 2011-09-27 05:37:59 -0700 |
commit | ea71efe027e9f741032b6bf9dd995bcaa2fa7947 (patch) | |
tree | 0cc90449ee5bb0331b52da83c6f99b31587fe9cf /xlators/cluster/dht/src/dht-common.c | |
parent | 0286dd866a89c035073294c348a43beca3109c38 (diff) |
cluster/distribute: fixed a spurious inode ref
While bringing in support to open-fd migration, dht_local_init()
itself started doing 'loc_copy()'. I had left one case in dht_lookup()
where there is a extra loc_copy() on existing copied 'local->loc',
which would cause 2 inode_refs on a given inode, and only one
inode_unref() happens in dht_local_wipe().
Change-Id: Idd0375bdf9a6408db1e97e80389249ef8d802adb
BUG: 3590
Reviewed-on: http://review.gluster.com/504
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Shishir Gowda <shishirng@gluster.com>
Diffstat (limited to 'xlators/cluster/dht/src/dht-common.c')
-rw-r--r-- | xlators/cluster/dht/src/dht-common.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index 5c582555683..671a9b2094f 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -1039,7 +1039,7 @@ dht_lookup (call_frame_t *frame, xlator_t *this, dht_layout_t *layout = NULL; int i = 0; int call_cnt = 0; - + loc_t new_loc = {0,}; VALIDATE_OR_GOTO (frame, err); VALIDATE_OR_GOTO (this, err); @@ -1056,9 +1056,17 @@ dht_lookup (call_frame_t *frame, xlator_t *this, op_errno = ENOMEM; goto err; } - if (!dht_filter_loc_subvol_key (this, loc, &local->loc, - &hashed_subvol)) { - ret = loc_dup (loc, &local->loc); + + ret = dht_filter_loc_subvol_key (this, loc, &new_loc, + &hashed_subvol); + if (ret) { + loc_wipe (&local->loc); + ret = loc_dup (&new_loc, &local->loc); + + /* we no more need 'new_loc' entries */ + loc_wipe (&new_loc); + + /* check if loc_dup() is successful */ if (ret == -1) { op_errno = errno; gf_log (this->name, GF_LOG_DEBUG, |