X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Flov%2Flov_object.c;h=c0857d46d5fde2c1604f39f76e36a739a002d28c;hb=12e09a0c2a116de01c373f0915ed56e928bd3bd0;hp=b45bf67ed13c90e86b4cc57c95920c4eee7073f9;hpb=6f26bb6972042c3c983ad12da7fb2e07b726a080;p=fs%2Flustre-release.git diff --git a/lustre/lov/lov_object.c b/lustre/lov/lov_object.c index b45bf67..c0857d4 100644 --- a/lustre/lov/lov_object.c +++ b/lustre/lov/lov_object.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. */ /* @@ -38,12 +38,14 @@ * Author: Nikita Danilov */ -/** \addtogroup lov lov @{ */ - #define DEBUG_SUBSYSTEM S_LOV #include "lov_cl_internal.h" +/** \addtogroup lov + * @{ + */ + /***************************************************************************** * * Layout operations. @@ -106,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, @@ -156,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) { @@ -172,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"); @@ -207,6 +187,7 @@ static int lov_init_raid0(const struct lu_env *env, 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. */ @@ -215,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); @@ -261,12 +243,21 @@ static void lov_subobject_kill(const struct lu_env *env, struct lov_object *lov, 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_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_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(&site->ls_marche_funebre, waiter); } LASSERT(r0->lo_sub[idx] == NULL); @@ -446,10 +437,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; \ }) @@ -465,12 +456,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, @@ -507,7 +498,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); @@ -535,7 +526,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; @@ -559,7 +550,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) @@ -567,7 +558,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); } @@ -675,7 +666,7 @@ static const struct lu_object_operations lov_lu_obj_ops = { }; struct lu_object *lov_object_alloc(const struct lu_env *env, - const struct lu_object_header *_, + const struct lu_object_header *unused, struct lu_device *dev) { struct lov_object *lov;