Commit | Line | Data |
---|---|---|
d7e09d03 PT |
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 | ||
55 | int 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 | ||
d7e09d03 PT |
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; | |
0a3bdb00 | 72 | return result; |
d7e09d03 PT |
73 | |
74 | } | |
75 | ||
76 | static 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; | |
d7e09d03 PT |
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); | |
d7e09d03 PT |
95 | } |
96 | ||
97 | static 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 | ||
105 | static 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 | ||
d7e09d03 | 110 | lov_r0(lov)->lo_attr_valid = 0; |
0a3bdb00 | 111 | return 0; |
d7e09d03 PT |
112 | } |
113 | ||
114 | static 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 | ||
0a3bdb00 | 120 | return cl_object_glimpse(env, &los->lso_super->lo_cl, lvb); |
d7e09d03 PT |
121 | } |
122 | ||
123 | ||
124 | ||
125 | static 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 | ||
132 | static 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 | ||
141 | struct 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 | ||
d7e09d03 PT |
148 | OBD_SLAB_ALLOC_PTR_GFP(los, lovsub_object_kmem, __GFP_IO); |
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; | |
0a3bdb00 | 161 | return obj; |
d7e09d03 PT |
162 | } |
163 | ||
164 | /** @} lov */ |