* 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.
*/
/*
* @{
*/
-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,
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: {
* 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;
}
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;
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;
}
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);
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);
}
if (alloc) {
- OBD_FREE(stripes_qin,
+ OBD_FREE_LARGE(stripes_qin,
sizeof(*stripes_qin) * lio->lis_nr_subios);
} else {
int i;
.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,
.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,
result = 0;
break;
case CIT_WRITE:
- case CIT_TRUNC:
+ case CIT_SETATTR:
result = -EBADF;
break;
case CIT_FAULT: