X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flov%2Flov_io.c;h=2d61ee18809c339df35a622efb650da9b74091d9;hb=08ac163a04f0a9c5e4348174aa835796e2190e28;hp=bf7a9584d57f0d052b3e13aa9ba8305ffbd58796;hpb=8eaf21f9a9a6264598b9fed93b2c5d423b00bd9a;p=fs%2Flustre-release.git diff --git a/lustre/lov/lov_io.c b/lustre/lov/lov_io.c index bf7a958..2d61ee1 100644 --- a/lustre/lov/lov_io.c +++ b/lustre/lov/lov_io.c @@ -26,7 +26,7 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. */ /* @@ -46,24 +46,13 @@ * @{ */ -static void lov_sub_enter(struct lov_io_sub *sub) +static inline void lov_sub_enter(struct lov_io_sub *sub) { - ENTRY; - if (sub->sub_reenter++ == 0) { - sub->sub_cookie = cl_env_reenter(); - cl_env_implant(sub->sub_env, &sub->sub_refcheck2); - } - EXIT; + sub->sub_reenter++; } - -static void lov_sub_exit(struct lov_io_sub *sub) +static inline void lov_sub_exit(struct lov_io_sub *sub) { - ENTRY; - if (--sub->sub_reenter == 0) { - cl_env_unplant(sub->sub_env, &sub->sub_refcheck2); - cl_env_reexit(sub->sub_cookie); - } - EXIT; + sub->sub_reenter--; } static void lov_io_sub_fini(const struct lu_env *env, struct lov_io *lio, @@ -99,12 +88,16 @@ static void lov_io_sub_inherit(struct cl_io *io, struct lov_io *lio, struct cl_io *parent = lio->lis_cl.cis_io; switch(io->ci_type) { - case CIT_TRUNC: { - loff_t new_size = parent->u.ci_truncate.tr_size; - - new_size = lov_size_to_stripe(lsm, new_size, stripe); - io->u.ci_truncate.tr_capa = parent->u.ci_truncate.tr_capa; - io->u.ci_truncate.tr_size = new_size; + case CIT_SETATTR: { + io->u.ci_setattr.sa_attr = parent->u.ci_setattr.sa_attr; + io->u.ci_setattr.sa_valid = parent->u.ci_setattr.sa_valid; + io->u.ci_setattr.sa_capa = parent->u.ci_setattr.sa_capa; + if (cl_io_is_trunc(io)) { + loff_t new_size = parent->u.ci_setattr.sa_attr.lvb_size; + + new_size = lov_size_to_stripe(lsm, new_size, stripe); + io->u.ci_setattr.sa_attr.lvb_size = new_size; + } break; } case CIT_FAULT: { @@ -286,8 +279,8 @@ static int lov_io_subio_init(const struct lu_env *env, struct lov_io *lio, * Need to be optimized, we can't afford to allocate a piece of memory * when writing a page. -jay */ - OBD_ALLOC(lio->lis_subs, - lsm->lsm_stripe_count * sizeof lio->lis_subs[0]); + OBD_ALLOC_LARGE(lio->lis_subs, + lsm->lsm_stripe_count * sizeof lio->lis_subs[0]); if (lio->lis_subs != NULL) { lio->lis_nr_subios = lio->lis_stripe_count; lio->lis_single_subio_index = -1; @@ -323,8 +316,11 @@ static void lov_io_slice_init(struct lov_io *lio, } break; - case CIT_TRUNC: - lio->lis_pos = io->u.ci_truncate.tr_size; + case CIT_SETATTR: + if (cl_io_is_trunc(io)) + lio->lis_pos = io->u.ci_setattr.sa_attr.lvb_size; + else + lio->lis_pos = 0; lio->lis_endpos = OBD_OBJECT_EOF; break; @@ -356,7 +352,7 @@ static void lov_io_fini(const struct lu_env *env, const struct cl_io_slice *ios) if (lio->lis_subs != NULL) { for (i = 0; i < lio->lis_nr_subios; i++) lov_io_sub_fini(env, lio, &lio->lis_subs[i]); - OBD_FREE(lio->lis_subs, + OBD_FREE_LARGE(lio->lis_subs, lio->lis_nr_subios * sizeof lio->lis_subs[0]); lio->lis_nr_subios = 0; } @@ -396,7 +392,7 @@ static int lov_io_iter_init(const struct lu_env *env, start, end); rc = cl_io_iter_init(sub->sub_env, sub->sub_io); lov_sub_put(sub); - CDEBUG(D_VFSTRACE, "shrink: %i ["LPU64", "LPU64")\n", + CDEBUG(D_VFSTRACE, "shrink: %d ["LPU64", "LPU64")\n", stripe, start, end); } else rc = PTR_ERR(sub); @@ -599,8 +595,8 @@ static int lov_io_submit(const struct lu_env *env, LASSERT(lio->lis_subs != NULL); if (alloc) { - OBD_ALLOC(stripes_qin, - sizeof(*stripes_qin) * lio->lis_nr_subios); + OBD_ALLOC_LARGE(stripes_qin, + sizeof(*stripes_qin) * lio->lis_nr_subios); if (stripes_qin == NULL) RETURN(-ENOMEM); @@ -653,7 +649,7 @@ static int lov_io_submit(const struct lu_env *env, } if (alloc) { - OBD_FREE(stripes_qin, + OBD_FREE_LARGE(stripes_qin, sizeof(*stripes_qin) * lio->lis_nr_subios); } else { int i; @@ -750,7 +746,7 @@ static const struct cl_io_operations lov_io_ops = { .cio_start = lov_io_start, .cio_end = lov_io_end }, - [CIT_TRUNC] = { + [CIT_SETATTR] = { .cio_fini = lov_io_fini, .cio_iter_init = lov_io_iter_init, .cio_iter_fini = lov_io_iter_fini, @@ -826,7 +822,7 @@ static const struct cl_io_operations lov_empty_io_ops = { .cio_start = LOV_EMPTY_IMPOSSIBLE, .cio_end = LOV_EMPTY_IMPOSSIBLE }, - [CIT_TRUNC] = { + [CIT_SETATTR] = { .cio_fini = lov_empty_io_fini, .cio_iter_init = LOV_EMPTY_IMPOSSIBLE, .cio_lock = LOV_EMPTY_IMPOSSIBLE, @@ -888,7 +884,7 @@ int lov_io_init_empty(const struct lu_env *env, struct cl_object *obj, result = 0; break; case CIT_WRITE: - case CIT_TRUNC: + case CIT_SETATTR: result = -EBADF; break; case CIT_FAULT: