linux/drivers/staging/lustre/lustre/lov/lovsub_object.c
<<
>>
Prefs
   1/*
   2 * GPL HEADER START
   3 *
   4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 only,
   8 * as published by the Free Software Foundation.
   9 *
  10 * This program is distributed in the hope that it will be useful, but
  11 * WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13 * General Public License version 2 for more details (a copy is included
  14 * in the LICENSE file that accompanied this code).
  15 *
  16 * You should have received a copy of the GNU General Public License
  17 * version 2 along with this program; If not, see
  18 * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
  19 *
  20 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  21 * CA 95054 USA or visit www.sun.com if you need additional information or
  22 * have any questions.
  23 *
  24 * GPL HEADER END
  25 */
  26/*
  27 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  28 * Use is subject to license terms.
  29 *
  30 * Copyright (c) 2012, Intel Corporation.
  31 */
  32/*
  33 * This file is part of Lustre, http://www.lustre.org/
  34 * Lustre is a trademark of Sun Microsystems, Inc.
  35 *
  36 * Implementation of cl_object for LOVSUB layer.
  37 *
  38 *   Author: Nikita Danilov <nikita.danilov@sun.com>
  39 */
  40
  41#define DEBUG_SUBSYSTEM S_LOV
  42
  43#include "lov_cl_internal.h"
  44
  45/** \addtogroup lov
  46 *  @{
  47 */
  48
  49/*****************************************************************************
  50 *
  51 * Lovsub object operations.
  52 *
  53 */
  54
  55int lovsub_object_init(const struct lu_env *env, struct lu_object *obj,
  56                       const struct lu_object_conf *conf)
  57{
  58        struct lovsub_device  *dev   = lu2lovsub_dev(obj->lo_dev);
  59        struct lu_object      *below;
  60        struct lu_device      *under;
  61
  62        int result;
  63
  64        under = &dev->acid_next->cd_lu_dev;
  65        below = under->ld_ops->ldo_object_alloc(env, obj->lo_header, under);
  66        if (below != NULL) {
  67                lu_object_add(obj, below);
  68                cl_object_page_init(lu2cl(obj), sizeof(struct lovsub_page));
  69                result = 0;
  70        } else
  71                result = -ENOMEM;
  72        return result;
  73
  74}
  75
  76static void lovsub_object_free(const struct lu_env *env, struct lu_object *obj)
  77{
  78        struct lovsub_object *los = lu2lovsub(obj);
  79        struct lov_object    *lov = los->lso_super;
  80
  81        /* We can't assume lov was assigned here, because of the shadow
  82         * object handling in lu_object_find.
  83         */
  84        if (lov) {
  85                LASSERT(lov->lo_type == LLT_RAID0);
  86                LASSERT(lov->u.raid0.lo_sub[los->lso_index] == los);
  87                spin_lock(&lov->u.raid0.lo_sub_lock);
  88                lov->u.raid0.lo_sub[los->lso_index] = NULL;
  89                spin_unlock(&lov->u.raid0.lo_sub_lock);
  90        }
  91
  92        lu_object_fini(obj);
  93        lu_object_header_fini(&los->lso_header.coh_lu);
  94        OBD_SLAB_FREE_PTR(los, lovsub_object_kmem);
  95}
  96
  97static int lovsub_object_print(const struct lu_env *env, void *cookie,
  98                               lu_printer_t p, const struct lu_object *obj)
  99{
 100        struct lovsub_object *los = lu2lovsub(obj);
 101
 102        return (*p)(env, cookie, "[%d]", los->lso_index);
 103}
 104
 105static int lovsub_attr_set(const struct lu_env *env, struct cl_object *obj,
 106                           const struct cl_attr *attr, unsigned valid)
 107{
 108        struct lov_object *lov = cl2lovsub(obj)->lso_super;
 109
 110        lov_r0(lov)->lo_attr_valid = 0;
 111        return 0;
 112}
 113
 114static int lovsub_object_glimpse(const struct lu_env *env,
 115                                 const struct cl_object *obj,
 116                                 struct ost_lvb *lvb)
 117{
 118        struct lovsub_object *los = cl2lovsub(obj);
 119
 120        return cl_object_glimpse(env, &los->lso_super->lo_cl, lvb);
 121}
 122
 123
 124
 125static const struct cl_object_operations lovsub_ops = {
 126        .coo_page_init = lovsub_page_init,
 127        .coo_lock_init = lovsub_lock_init,
 128        .coo_attr_set  = lovsub_attr_set,
 129        .coo_glimpse   = lovsub_object_glimpse
 130};
 131
 132static const struct lu_object_operations lovsub_lu_obj_ops = {
 133        .loo_object_init      = lovsub_object_init,
 134        .loo_object_delete    = NULL,
 135        .loo_object_release   = NULL,
 136        .loo_object_free      = lovsub_object_free,
 137        .loo_object_print     = lovsub_object_print,
 138        .loo_object_invariant = NULL
 139};
 140
 141struct lu_object *lovsub_object_alloc(const struct lu_env *env,
 142                                      const struct lu_object_header *unused,
 143                                      struct lu_device *dev)
 144{
 145        struct lovsub_object *los;
 146        struct lu_object     *obj;
 147
 148        OBD_SLAB_ALLOC_PTR_GFP(los, lovsub_object_kmem, GFP_NOFS);
 149        if (los != NULL) {
 150                struct cl_object_header *hdr;
 151
 152                obj = lovsub2lu(los);
 153                hdr = &los->lso_header;
 154                cl_object_header_init(hdr);
 155                lu_object_init(obj, &hdr->coh_lu, dev);
 156                lu_object_add_top(&hdr->coh_lu, obj);
 157                los->lso_cl.co_ops = &lovsub_ops;
 158                obj->lo_ops = &lovsub_lu_obj_ops;
 159        } else
 160                obj = NULL;
 161        return obj;
 162}
 163
 164/** @} lov */
 165