Details
-
Bug
-
Resolution: Fixed
-
Minor
-
None
-
None
-
3
-
9223372036854775807
Description
Seems there's a double mutex unlock on error path in lod_add_device.
Also in the same vein, there seems to be double reference drop
cfs_bitmap_set(ltd->ltd_tgt_bitmap, index);
ltd->ltd_tgtnr++;
mutex_unlock(<d->ltd_mutex);
lod_putref(lod, ltd);
...
if (!for_ost && lod->lod_initialized) {
rc = lod_sub_init_llog(env, lod, tgt_desc->ltd_tgt);
if (rc != 0) {
CERROR("%s: cannot start llog on %s:rc = %d\n",
lod2obd(lod)->obd_name, osp, rc);
** GOTO(out_pool, rc);
}
}
rc = lfsck_add_target(env, lod->lod_child, d, exp, index, for_ost);
if (rc != 0) {
CERROR("Fail to add LFSCK target: name = %s, type = %s, "
"index = %u, rc = %d\n", osp, type, index, rc);
** GOTO(out_fini_llog, rc);
...
out_fini_llog:
lod_sub_fini_llog(env, tgt_desc->ltd_tgt,
tgt_desc->ltd_recovery_thread);
out_pool:
lod_ost_pool_remove(&lod->lod_pool_info, index);
out_mutex:
mutex_unlock(<d->ltd_mutex);
lod_putref(lod, ltd);
So we do double unlock and double reference put in those two cases which is probably a pretty bad idea,