X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flov%2Flov_object.c;h=40ca89b0df4d8b4fafb4a47e2d01710e5c0b215a;hb=3ad0df02123a49a8c98ecf4661f677af509ac6d4;hp=5886885959eb3ebe172893303510542a1b5d396d;hpb=b15f3875f46eec3c5186fe6b84cf2cda7ceb8518;p=fs%2Flustre-release.git diff --git a/lustre/lov/lov_object.c b/lustre/lov/lov_object.c index 5886885..40ca89b 100644 --- a/lustre/lov/lov_object.c +++ b/lustre/lov/lov_object.c @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -26,8 +24,10 @@ * 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. + * + * Copyright (c) 2011, Whamcloud, Inc. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -108,28 +108,6 @@ static void lov_install_raid0(const struct lu_env *env, lov->u = *state; } -static void oinfo_get_fid(const struct lov_oinfo *oinfo, struct lu_fid *fid) -{ - __u64 idx = oinfo->loi_id; - - /* See idif definition in wiki:CMD3_interoperability_architecture */ - - LASSERT(oinfo->loi_gr < 1ULL << 16); - LASSERT(oinfo->loi_id < 1ULL << 49); - ENTRY; - - /* - * Now that the fid of stripe is not unique now, ost_idx have to - * be used to make it unique. This is ok because the stripe fids - * are just used in client side(to locate the objects). -jay - */ - fid->f_seq = ((__u64)oinfo->loi_ost_idx) << 32 | - oinfo->loi_gr << 16 | idx >> 32; - fid->f_oid = idx; /* truncated to 32 bits by assignment */ - fid->f_ver = 0; - EXIT; -} - static struct cl_object *lov_sub_find(const struct lu_env *env, struct cl_device *dev, const struct lu_fid *fid, @@ -158,11 +136,11 @@ static int lov_init_sub(const struct lu_env *env, struct lov_object *lov, parent = subhdr->coh_parent; oinfo = r0->lo_lsm->lsm_oinfo[idx]; - CDEBUG(D_INODE, DFID"@%p[%d] -> "DFID"@%p: id: "LPU64" gr: "LPU64 + CDEBUG(D_INODE, DFID"@%p[%d] -> "DFID"@%p: id: "LPU64" seq: "LPU64 " idx: %d gen: %d\n", PFID(&subhdr->coh_lu.loh_fid), subhdr, idx, PFID(&hdr->coh_lu.loh_fid), hdr, - oinfo->loi_id, oinfo->loi_gr, + oinfo->loi_id, oinfo->loi_seq, oinfo->loi_ost_idx, oinfo->loi_ost_gen); if (parent == NULL) { @@ -174,7 +152,7 @@ static int lov_init_sub(const struct lu_env *env, struct lov_object *lov, r0->lo_sub[idx]->lso_index = idx; result = 0; } else { - CERROR("Stripe is already owned by other file (%i).\n", idx); + CERROR("Stripe is already owned by other file (%d).\n", idx); LU_OBJECT_DEBUG(D_ERROR, env, &stripe->co_lu, "\n"); LU_OBJECT_DEBUG(D_ERROR, env, lu_object_top(&parent->coh_lu), "old\n"); @@ -205,10 +183,11 @@ static int lov_init_raid0(const struct lu_env *env, r0->lo_lsm = conf->u.coc_md->lsm; LASSERT(r0->lo_nr <= lov_targets_nr(dev)); - OBD_ALLOC(r0->lo_sub, r0->lo_nr * sizeof r0->lo_sub[0]); + OBD_ALLOC_LARGE(r0->lo_sub, r0->lo_nr * sizeof r0->lo_sub[0]); if (r0->lo_sub != NULL) { result = 0; subconf->coc_inode = conf->coc_inode; + cfs_spin_lock_init(&r0->lo_sub_lock); /* * Create stripe cl_objects. */ @@ -217,7 +196,8 @@ static int lov_init_raid0(const struct lu_env *env, struct lov_oinfo *oinfo = lsm->lsm_oinfo[i]; int ost_idx = oinfo->loi_ost_idx; - oinfo_get_fid(oinfo, ofid); + fid_ostid_unpack(ofid, &oinfo->loi_oi, + oinfo->loi_ost_idx); subdev = lovsub2cl_dev(dev->ld_target[ost_idx]); subconf->u.coc_oinfo = oinfo; LASSERTF(subdev != NULL, "not init ost %d\n", ost_idx); @@ -244,6 +224,7 @@ static void lov_subobject_kill(const struct lu_env *env, struct lov_object *lov, struct cl_object *sub; struct lov_layout_raid0 *r0; struct lu_site *site; + struct lu_site_bkt_data *bkt; cfs_waitlink_t *waiter; r0 = &lov->u.raid0; @@ -251,6 +232,7 @@ static void lov_subobject_kill(const struct lu_env *env, struct lov_object *lov, sub = lovsub2cl(los); site = sub->co_lu.lo_dev->ld_site; + bkt = lu_site_bkt_from_fid(site, &sub->co_lu.lo_header->loh_fid); cl_object_kill(env, sub); /* release a reference to the sub-object and ... */ @@ -262,14 +244,23 @@ static void lov_subobject_kill(const struct lu_env *env, struct lov_object *lov, if (r0->lo_sub[idx] == los) { waiter = &lov_env_info(env)->lti_waiter; cfs_waitlink_init(waiter); - cfs_waitq_add(&site->ls_marche_funebre, waiter); - set_current_state(CFS_TASK_UNINT); - - while (r0->lo_sub[idx] == los) + cfs_waitq_add(&bkt->lsb_marche_funebre, waiter); + cfs_set_current_state(CFS_TASK_UNINT); + while (1) { /* this wait-queue is signaled at the end of * lu_object_free(). */ - cfs_waitq_wait(waiter, CFS_TASK_UNINT); - cfs_waitq_del(&site->ls_marche_funebre, waiter); + cfs_set_current_state(CFS_TASK_UNINT); + cfs_spin_lock(&r0->lo_sub_lock); + if (r0->lo_sub[idx] == los) { + cfs_spin_unlock(&r0->lo_sub_lock); + cfs_waitq_wait(waiter, CFS_TASK_UNINT); + } else { + cfs_spin_unlock(&r0->lo_sub_lock); + cfs_set_current_state(CFS_TASK_RUNNING); + break; + } + } + cfs_waitq_del(&bkt->lsb_marche_funebre, waiter); } LASSERT(r0->lo_sub[idx] == NULL); } @@ -309,7 +300,7 @@ static void lov_fini_raid0(const struct lu_env *env, struct lov_object *lov, ENTRY; if (r0->lo_sub != NULL) { - OBD_FREE(r0->lo_sub, r0->lo_nr * sizeof r0->lo_sub[0]); + OBD_FREE_LARGE(r0->lo_sub, r0->lo_nr * sizeof r0->lo_sub[0]); r0->lo_sub = NULL; } EXIT; @@ -448,10 +439,10 @@ const static struct lov_layout_operations lov_dispatch[] = { \ __lock &= __obj->lo_owner != cfs_current(); \ if (__lock) \ - down_read(&__obj->lo_type_guard); \ + cfs_down_read(&__obj->lo_type_guard); \ __result = LOV_2DISPATCH_NOLOCK(obj, op, __VA_ARGS__); \ if (__lock) \ - up_read(&__obj->lo_type_guard); \ + cfs_up_read(&__obj->lo_type_guard); \ __result; \ }) @@ -467,12 +458,12 @@ do { \ enum lov_layout_type __llt; \ \ if (__obj->lo_owner != cfs_current()) \ - down_read(&__obj->lo_type_guard); \ + cfs_down_read(&__obj->lo_type_guard); \ __llt = __obj->lo_type; \ LASSERT(0 <= __llt && __llt < ARRAY_SIZE(lov_dispatch)); \ lov_dispatch[__llt].op(__VA_ARGS__); \ if (__obj->lo_owner != cfs_current()) \ - up_read(&__obj->lo_type_guard); \ + cfs_up_read(&__obj->lo_type_guard); \ } while (0) static int lov_layout_change(const struct lu_env *env, @@ -509,7 +500,7 @@ static int lov_layout_change(const struct lu_env *env, cl_env_reexit(cookie); old_ops->llo_fini(env, obj, &obj->u); - LASSERT(list_empty(&hdr->coh_locks)); + LASSERT(cfs_list_empty(&hdr->coh_locks)); LASSERT(hdr->coh_tree.rnode == NULL); LASSERT(hdr->coh_pages == 0); @@ -537,7 +528,7 @@ int lov_object_init(const struct lu_env *env, struct lu_object *obj, int result; ENTRY; - init_rwsem(&lov->lo_type_guard); + cfs_init_rwsem(&lov->lo_type_guard); /* no locking is necessary, as object is being created */ lov->lo_type = cconf->u.coc_md->lsm != NULL ? LLT_RAID0 : LLT_EMPTY; @@ -561,7 +552,7 @@ static int lov_conf_set(const struct lu_env *env, struct cl_object *obj, * Currently only LLT_EMPTY -> LLT_RAID0 transition is supported. */ LASSERT(lov->lo_owner != cfs_current()); - down_write(&lov->lo_type_guard); + cfs_down_write(&lov->lo_type_guard); LASSERT(lov->lo_owner == NULL); lov->lo_owner = cfs_current(); if (lov->lo_type == LLT_EMPTY && conf->u.coc_md->lsm != NULL) @@ -569,7 +560,7 @@ static int lov_conf_set(const struct lu_env *env, struct cl_object *obj, else result = -EOPNOTSUPP; lov->lo_owner = NULL; - up_write(&lov->lo_type_guard); + cfs_up_write(&lov->lo_type_guard); RETURN(result); }