LDLM_LOCK_PUT(lock);
mdt_object_put(info->mti_env, child);
/* NB: call the mdt_pack_size2body always after
- * mdt_object_put(), that is why this speacial
+ * mdt_object_put(), that is why this special
* exit path is used. */
rc = mdt_pack_size2body(info, child_fid,
&lhc->mlh_reg_lh);
GOTO(out_parent, rc = 0);
}
- }
- if (lock)
- LDLM_LOCK_PUT(lock);
+ }
+ if (lock)
+ LDLM_LOCK_PUT(lock);
- EXIT;
+ EXIT;
out_child:
- mdt_object_put(info->mti_env, child);
+ mdt_object_put(info->mti_env, child);
out_parent:
- if (lhp)
- mdt_object_unlock(info, parent, lhp, 1);
- return rc;
+ if (lhp)
+ mdt_object_unlock(info, parent, lhp, 1);
+ return rc;
}
/* normal handler: should release the child lock */
struct mdt_lock_handle *child_lh;
struct ldlm_enqueue_info *einfo = &info->mti_einfo;
__u64 lock_ibits;
- bool cos_incompat = false;
+ bool cos_incompat = false, discard = false;
int no_name = 0;
int rc;
if (rc)
GOTO(out_stat, rc);
} else {
- mdt_dom_check_and_discard(info, mc);
+ discard = true;
}
mdt_handle_last_unlink(info, mc, ma);
unlock_child:
mdt_reint_striped_unlock(info, mc, child_lh, einfo, rc);
put_child:
+ if (discard)
+ mdt_dom_check_and_discard(info, mc);
mdt_object_put(info->mti_env, mc);
unlock_parent:
mdt_object_unlock(info, mp, parent_lh, rc);
struct lu_fid *new_fid = &info->mti_tmp_fid2;
__u64 lock_ibits;
bool reverse = false;
- bool cos_incompat;
+ bool cos_incompat, discard = false;
int rc;
ENTRY;
mdt_counter_incr(req, LPROC_MDT_RENAME);
if (mnew) {
mdt_handle_last_unlink(info, mnew, ma);
- mdt_dom_check_and_discard(info, mnew);
+ discard = true;
}
mdt_rename_counter_tally(info, info->mti_mdt, req,
out_unlock_old:
mdt_object_unlock(info, mold, lh_oldp, rc);
out_put_new:
- if (mnew != NULL)
+ if (mnew != NULL) {
+ if (discard)
+ mdt_dom_check_and_discard(info, mnew);
mdt_object_put(info->mti_env, mnew);
+ }
out_put_old:
mdt_object_put(info->mti_env, mold);
out_unlock_parents:
# to get layout
$CHECKSTAT -t file $DIR1/$tfile
- OLD_VAL=$(cat /proc/sys/vm/dirty_writeback_centisecs)
- echo 0 > /proc/sys/vm/dirty_writeback_centisecs
- echo $OLD_VAL
+ local old_wb=$(sysctl -n vm.dirty_writeback_centisecs)
+ sysctl -wq vm.dirty_writeback_centisecs=0
+
+ trap "sysctl -wq vm.dirty_writeback_centisecs=$old_wb" EXIT
# open + IO lock
dd if=/dev/zero of=$DIR1/$tfile bs=4096 count=1 ||
error_noexit "Write fails"
# must discard pages
lctl set_param -n mdc.*.stats=clear
- rm $DIR2/$tfile || error_noexit "Unlink fails"
- local writes=$(lctl get_param -n mdc.*.stats | grep ost_write | wc -l)
- echo $OLD_VAL > /proc/sys/vm/dirty_writeback_centisecs
+ rm $DIR2/$tfile || error "Unlink fails"
+ local writes=$(lctl get_param -n mdc.*.stats | grep ost_write | wc -l)
[ $writes -eq 0 ] || error "Found WRITE RPC but expect none"
}
run_test 101a "Discard DoM data on unlink"
# to get layout
$CHECKSTAT -t file $DIR1/$tfile
- OLD_VAL=$(cat /proc/sys/vm/dirty_writeback_centisecs)
- echo 0 > /proc/sys/vm/dirty_writeback_centisecs
- echo $OLD_VAL
+ local old_wb=$(sysctl -n vm.dirty_writeback_centisecs)
+ sysctl -wq vm.dirty_writeback_centisecs=0
+
+ trap "sysctl -wq vm.dirty_writeback_centisecs=$old_wb" EXIT
# open + IO lock
- dd if=/dev/zero of=$DIR1/$tfile bs=4096 count=1 ||
- error_noexit "Write fails"
+ dd if=/dev/zero of=$DIR1/$tfile bs=4096 count=1 || error "Write fails"
# must discard pages
lctl set_param -n mdc.*.stats=clear
- mv $DIR2/${tfile}_2 $DIR2/$tfile || error_noexit "Rename fails"
+ mv $DIR2/${tfile}_2 $DIR2/$tfile || error "Rename fails"
+
local writes=$(lctl get_param -n mdc.*.stats | grep ost_write | wc -l)
- echo $OLD_VAL > /proc/sys/vm/dirty_writeback_centisecs
[ $writes -eq 0 ] || error "Found WRITE RPC but expect none"
}
run_test 101b "Discard DoM data on rename"
# to get layout
$CHECKSTAT -t file $DIR1/$tfile
- OLD_VAL=$(cat /proc/sys/vm/dirty_writeback_centisecs)
- echo 0 > /proc/sys/vm/dirty_writeback_centisecs
- echo $OLD_VAL
+ local old_wb=$(sysctl -n vm.dirty_writeback_centisecs)
+ sysctl -wq vm.dirty_writeback_centisecs=0
+
+ trap "sysctl -wq vm.dirty_writeback_centisecs=$old_wb" EXIT
# open + IO lock
- dd if=/dev/zero of=$DIR1/$tfile bs=4096 count=1 ||
- error_noexit "Write fails"
+ dd if=/dev/zero of=$DIR1/$tfile bs=4096 count=1 || error "Write fails"
$MULTIOP $DIR1/$tfile O_c &
MULTIOP_PID=$!
sleep 1
lctl set_param -n mdc.*.stats=clear
- rm $DIR2/$tfile > /dev/null || error_noexit "Unlink fails"
- kill -USR1 $MULTIOP_PID && wait $MULTIOP_PID ||
- error_noexit "multiop failure"
+ rm $DIR2/$tfile > /dev/null || error "Unlink fails for opened file"
+ kill -USR1 $MULTIOP_PID && wait $MULTIOP_PID || error "multiop failure"
+
local writes=$(lctl get_param -n mdc.*.stats | grep ost_write | wc -l)
- echo $OLD_VAL > /proc/sys/vm/dirty_writeback_centisecs
[ $writes -eq 0 ] || error "Found WRITE RPC but expect none"
}
run_test 101c "Discard DoM data on close-unlink"