X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Flov%2Flovsub_object.c;h=e960cdefbb0c5fedaf7c2d4834df54336f03c1e3;hp=e49d43d5c72af6a3929a7b42cab44b529362cc85;hb=b046468f58a1f40e85cb59ed9abf75fd2fd5ea5a;hpb=fbf5870b9848929d352460f1f005b79c0b5ccc5a diff --git a/lustre/lov/lovsub_object.c b/lustre/lov/lovsub_object.c index e49d43d..e960cde 100644 --- a/lustre/lov/lovsub_object.c +++ b/lustre/lov/lovsub_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) 2012, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -42,7 +42,9 @@ #include "lov_cl_internal.h" -/** \addtogroup lov lov @{ */ +/** \addtogroup lov + * @{ + */ /***************************************************************************** * @@ -64,6 +66,7 @@ int lovsub_object_init(const struct lu_env *env, struct lu_object *obj, below = under->ld_ops->ldo_object_alloc(env, obj->lo_header, under); if (below != NULL) { lu_object_add(obj, below); + cl_object_page_init(lu2cl(obj), sizeof(struct lovsub_page)); result = 0; } else result = -ENOMEM; @@ -74,8 +77,20 @@ int lovsub_object_init(const struct lu_env *env, struct lu_object *obj, static void lovsub_object_free(const struct lu_env *env, struct lu_object *obj) { struct lovsub_object *los = lu2lovsub(obj); - + struct lov_object *lov = los->lso_super; ENTRY; + + /* We can't assume lov was assigned here, because of the shadow + * object handling in lu_object_find. + */ + if (lov) { + LASSERT(lov->lo_type == LLT_RAID0); + LASSERT(lov->u.raid0.lo_sub[los->lso_index] == los); + spin_lock(&lov->u.raid0.lo_sub_lock); + lov->u.raid0.lo_sub[los->lso_index] = NULL; + spin_unlock(&lov->u.raid0.lo_sub_lock); + } + lu_object_fini(obj); lu_object_header_fini(&los->lso_header.coh_lu); OBD_SLAB_FREE_PTR(los, lovsub_object_kmem); @@ -87,17 +102,17 @@ static int lovsub_object_print(const struct lu_env *env, void *cookie, { struct lovsub_object *los = lu2lovsub(obj); - return (*p)(env, cookie, "[%i]", los->lso_index); + return (*p)(env, cookie, "[%d]", los->lso_index); } -static int lovsub_attr_set(const struct lu_env *env, struct cl_object *obj, - const struct cl_attr *attr, unsigned valid) +static int lovsub_attr_update(const struct lu_env *env, struct cl_object *obj, + const struct cl_attr *attr, unsigned valid) { - struct lov_object *lov = cl2lovsub(obj)->lso_super; + struct lov_object *lov = cl2lovsub(obj)->lso_super; - ENTRY; - lov_r0(lov)->lo_attr_valid = 0; - RETURN(0); + ENTRY; + lov_r0(lov)->lo_attr_valid = 0; + RETURN(0); } static int lovsub_object_glimpse(const struct lu_env *env, @@ -113,10 +128,10 @@ static int lovsub_object_glimpse(const struct lu_env *env, static const struct cl_object_operations lovsub_ops = { - .coo_page_init = lovsub_page_init, - .coo_lock_init = lovsub_lock_init, - .coo_attr_set = lovsub_attr_set, - .coo_glimpse = lovsub_object_glimpse + .coo_page_init = lovsub_page_init, + .coo_lock_init = lovsub_lock_init, + .coo_attr_update = lovsub_attr_update, + .coo_glimpse = lovsub_object_glimpse }; static const struct lu_object_operations lovsub_lu_obj_ops = { @@ -129,27 +144,27 @@ static const struct lu_object_operations lovsub_lu_obj_ops = { }; struct lu_object *lovsub_object_alloc(const struct lu_env *env, - const struct lu_object_header *_, - struct lu_device *dev) + const struct lu_object_header *unused, + struct lu_device *dev) { - struct lovsub_object *los; - struct lu_object *obj; - - ENTRY; - OBD_SLAB_ALLOC_PTR(los, lovsub_object_kmem); - if (los != NULL) { - struct cl_object_header *hdr; - - obj = lovsub2lu(los); - hdr = &los->lso_header; - cl_object_header_init(hdr); - lu_object_init(obj, &hdr->coh_lu, dev); - lu_object_add_top(&hdr->coh_lu, obj); - los->lso_cl.co_ops = &lovsub_ops; - obj->lo_ops = &lovsub_lu_obj_ops; - } else - obj = NULL; - RETURN(obj); + struct lovsub_object *los; + struct lu_object *obj; + + ENTRY; + OBD_SLAB_ALLOC_PTR_GFP(los, lovsub_object_kmem, GFP_NOFS); + if (los != NULL) { + struct cl_object_header *hdr; + + obj = lovsub2lu(los); + hdr = &los->lso_header; + cl_object_header_init(hdr); + lu_object_init(obj, &hdr->coh_lu, dev); + lu_object_add_top(&hdr->coh_lu, obj); + los->lso_cl.co_ops = &lovsub_ops; + obj->lo_ops = &lovsub_lu_obj_ops; + } else + obj = NULL; + RETURN(obj); } /** @} lov */