X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Flov%2Flov_io.c;h=bdb81405292c207f1e559630f178231ccc75403c;hb=17f35d4948a0970fa76dc491037c0a8e8d95e813;hp=bab17f76dcf374de0bd83011f80db72e62ce00a0;hpb=69ddb2e08ecb0226ae820b69932ec4eb424f481a;p=fs%2Flustre-release.git diff --git a/lustre/lov/lov_io.c b/lustre/lov/lov_io.c index bab17f7..bdb8140 100644 --- a/lustre/lov/lov_io.c +++ b/lustre/lov/lov_io.c @@ -151,6 +151,9 @@ static int lov_io_sub_init(const struct lu_env *env, struct lov_io *lio, LASSERT(sub->sub_stripe < lio->lis_stripe_count); ENTRY; + if (unlikely(lov_r0(lov)->lo_sub[stripe] == NULL)) + RETURN(-EIO); + result = 0; sub->sub_io_initialized = 0; sub->sub_borrowed = 0; @@ -248,16 +251,14 @@ void lov_sub_put(struct lov_io_sub *sub) int lov_page_stripe(const struct cl_page *page) { - struct lovsub_object *subobj; const struct cl_page_slice *slice; ENTRY; - slice = cl_page_at(page, &lovsub_device_type); + slice = cl_page_at(page, &lov_device_type); LASSERT(slice != NULL); LASSERT(slice->cpl_obj != NULL); - subobj = cl2lovsub(slice->cpl_obj); - RETURN(subobj->lso_index); + RETURN(cl2lov_page(slice)->lps_stripe); } struct lov_io_sub *lov_page_subio(const struct lu_env *env, struct lov_io *lio, @@ -304,8 +305,8 @@ static int lov_io_subio_init(const struct lu_env *env, struct lov_io *lio, RETURN(result); } -static void lov_io_slice_init(struct lov_io *lio, - struct lov_object *obj, struct cl_io *io) +static int lov_io_slice_init(struct lov_io *lio, + struct lov_object *obj, struct cl_io *io) { ENTRY; @@ -323,6 +324,13 @@ static void lov_io_slice_init(struct lov_io *lio, lio->lis_io_endpos = lio->lis_endpos; if (cl_io_is_append(io)) { LASSERT(io->ci_type == CIT_WRITE); + + /* If there is LOV EA hole, then we may cannot locate + * the current file-tail exactly. */ + if (unlikely(obj->lo_lsm->lsm_pattern & + LOV_PATTERN_F_HOLE)) + RETURN(-EIO); + lio->lis_pos = 0; lio->lis_endpos = OBD_OBJECT_EOF; } @@ -358,7 +366,7 @@ static void lov_io_slice_init(struct lov_io *lio, LBUG(); } - EXIT; + RETURN(0); } static void lov_io_fini(const struct lu_env *env, const struct cl_io_slice *ios) @@ -408,6 +416,15 @@ static int lov_io_iter_init(const struct lu_env *env, endpos, &start, &end)) continue; + if (unlikely(lov_r0(lio->lis_object)->lo_sub[stripe] == NULL)) { + if (ios->cis_io->ci_type == CIT_READ || + ios->cis_io->ci_type == CIT_WRITE || + ios->cis_io->ci_type == CIT_FAULT) + RETURN(-EIO); + + continue; + } + end = lov_offset_mod(end, +1); sub = lov_sub_get(env, lio, stripe); if (!IS_ERR(sub)) { @@ -421,7 +438,7 @@ static int lov_io_iter_init(const struct lu_env *env, rc = PTR_ERR(sub); if (!rc) - cfs_list_add_tail(&sub->sub_linkage, &lio->lis_active); + list_add_tail(&sub->sub_linkage, &lio->lis_active); else break; } @@ -473,7 +490,7 @@ static int lov_io_call(const struct lu_env *env, struct lov_io *lio, int rc = 0; ENTRY; - cfs_list_for_each_entry(sub, &lio->lis_active, sub_linkage) { + list_for_each_entry(sub, &lio->lis_active, sub_linkage) { lov_sub_enter(sub); rc = iofunc(sub->sub_env, sub->sub_io); lov_sub_exit(sub); @@ -542,8 +559,8 @@ static void lov_io_iter_fini(const struct lu_env *env, ENTRY; rc = lov_io_call(env, lio, lov_io_iter_fini_wrapper); LASSERT(rc == 0); - while (!cfs_list_empty(&lio->lis_active)) - cfs_list_del_init(lio->lis_active.next); + while (!list_empty(&lio->lis_active)) + list_del_init(lio->lis_active.next); EXIT; } @@ -742,7 +759,7 @@ static void lov_io_fsync_end(const struct lu_env *env, ENTRY; *written = 0; - cfs_list_for_each_entry(sub, &lio->lis_active, sub_linkage) { + list_for_each_entry(sub, &lio->lis_active, sub_linkage) { struct cl_io *subio = sub->sub_io; lov_sub_enter(sub); @@ -889,7 +906,10 @@ int lov_io_init_raid0(const struct lu_env *env, struct cl_object *obj, ENTRY; INIT_LIST_HEAD(&lio->lis_active); - lov_io_slice_init(lio, lov, io); + io->ci_result = lov_io_slice_init(lio, lov, io); + if (io->ci_result != 0) + RETURN(io->ci_result); + if (io->ci_result == 0) { io->ci_result = lov_io_subio_init(env, lio, io); if (io->ci_result == 0) {