{
struct cl_page *page = ops->ops_cl.cpl_page;
- if (cl_page_is_vmlocked(env, page)
- || PageDirty(page->cp_vmpage) || PageWriteback(page->cp_vmpage)
- )
+ if (cl_page_is_vmlocked(env, page) || PageDirty(page->cp_vmpage) ||
+ PageWriteback(page->cp_vmpage))
return CLP_GANG_ABORT;
*(pgoff_t *)cbdata = osc_index(ops) + 1;
static unsigned long osc_lock_weight(const struct lu_env *env,
struct osc_object *oscobj,
- struct ldlm_extent *extent)
+ loff_t start, loff_t end)
{
- struct cl_io *io = osc_env_thread_io(env);
+ struct cl_io *io = osc_env_thread_io(env);
struct cl_object *obj = cl_object_top(&oscobj->oo_cl);
- pgoff_t page_index;
- int result;
+ pgoff_t page_index;
+ int result;
+
ENTRY;
io->ci_obj = obj;
if (result != 0)
RETURN(result);
- page_index = cl_index(obj, extent->start);
+ page_index = cl_index(obj, start);
do {
result = osc_page_gang_lookup(env, io, oscobj,
- page_index,
- cl_index(obj, extent->end),
+ page_index, cl_index(obj, end),
weigh_cb, (void *)&page_index);
if (result == CLP_GANG_ABORT)
break;
*/
unsigned long osc_ldlm_weigh_ast(struct ldlm_lock *dlmlock)
{
- struct lu_env *env;
- struct osc_object *obj;
- struct osc_lock *oscl;
- unsigned long weight;
- bool found = false;
- __u16 refcheck;
+ struct lu_env *env;
+ struct osc_object *obj;
+ struct osc_lock *oscl;
+ unsigned long weight;
+ bool found = false;
+ __u16 refcheck;
+
ENTRY;
might_sleep();
/* Mostly because lack of memory, do not eliminate this lock */
RETURN(1);
- LASSERT(dlmlock->l_resource->lr_type == LDLM_EXTENT);
+ LASSERT(dlmlock->l_resource->lr_type == LDLM_EXTENT ||
+ ldlm_has_dom(dlmlock));
lock_res_and_lock(dlmlock);
obj = dlmlock->l_ast_data;
if (obj)
GOTO(out, weight = 1);
}
- weight = osc_lock_weight(env, obj, &dlmlock->l_policy_data.l_extent);
+ if (ldlm_has_dom(dlmlock))
+ weight = osc_lock_weight(env, obj, 0, OBD_OBJECT_EOF);
+ else
+ weight = osc_lock_weight(env, obj,
+ dlmlock->l_policy_data.l_extent.start,
+ dlmlock->l_policy_data.l_extent.end);
+
EXIT;
out:
cl_env_put(env, &refcheck);
return weight;
}
+EXPORT_SYMBOL(osc_ldlm_weigh_ast);
static void osc_lock_build_einfo(const struct lu_env *env,
const struct cl_lock *lock,
}
run_test 121 "lock replay timed out and race"
+test_130a() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.90) ] &&
+ skip "Do not support Data-on-MDT before 2.11"
+
+ replay_barrier $SINGLEMDS
+ $LFS setstripe -E 1M -L mdt -E EOF -c 2 $DIR/$tfile
+ fail $SINGLEMDS
+
+ [ $($LFS getstripe -L $DIR/$tfile) == "mdt" ] ||
+ error "Fail to replay DoM file creation"
+}
+run_test 130a "DoM file create (setstripe) replay"
+
+test_130b() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.90) ] &&
+ skip "Do not support Data-on-MDT before 2.11"
+
+ mkdir $DIR/$tdir
+ $LFS setstripe -E 1M -L mdt -E EOF -c 2 $DIR/$tdir
+ replay_barrier $SINGLEMDS
+ touch $DIR/$tdir/$tfile
+ fail $SINGLEMDS
+
+ [ $($LFS getstripe -L $DIR/$tdir/$tfile) == "mdt" ] ||
+ error "Fail to replay DoM file creation"
+}
+run_test 130b "DoM file create (inherited) replay"
+
+test_131a() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.90) ] &&
+ skip "Do not support Data-on-MDT before 2.11"
+
+ $LFS setstripe -E 1M -L mdt -E EOF -c 2 $DIR/$tfile
+ replay_barrier $SINGLEMDS
+ echo "dom_data" | dd of=$DIR/$tfile bs=1 count=8
+ # lock is not canceled and will be replayed
+ fail $SINGLEMDS
+
+ [ $(cat $DIR/$tfile) == "dom_data" ] ||
+ error "Wrong file content after failover"
+}
+run_test 131a "DoM file write lock replay"
+
+test_131b() {
+ [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.10.90) ] &&
+ skip "Do not support Data-on-MDT before 2.11"
+
+ $LFS setstripe -E 1M -L mdt -E EOF -c 2 $DIR/$tfile
+ replay_barrier $SINGLEMDS
+ echo "dom_data" | dd of=$DIR/$tfile bs=1 count=8
+ cancel_lru_locks mdc
+
+ fail $SINGLEMDS
+
+ [ $(cat $DIR/$tfile) == "dom_data" ] ||
+ error "Wrong file content after failover"
+}
+run_test 131b "DoM file write replay"
+
complete $SECONDS
check_and_cleanup_lustre
exit_status