586f49a374ec552a0e19f77dc6f8539cf70334bf
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
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.
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).
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
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
27 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
28 * Use is subject to license terms.
30 * Copyright (c) 2012, Intel Corporation.
33 * This file is part of Lustre, http://www.lustre.org/
34 * Lustre is a trademark of Sun Microsystems, Inc.
36 * lustre/llite/llite_rmtacl.c
38 * Lustre Remote User Access Control List.
40 * Author: Fan Yong <fanyong@clusterfs.com>
43 #define DEBUG_SUBSYSTEM S_LLITE
45 #ifdef CONFIG_FS_POSIX_ACL
47 #include "../include/lustre_lite.h"
48 #include "../include/lustre_eacl.h"
49 #include "llite_internal.h"
51 static inline __u32
rce_hashfunc(uid_t id
)
53 return id
& (RCE_HASHES
- 1);
56 static inline __u32
ee_hashfunc(uid_t id
)
58 return id
& (EE_HASHES
- 1);
61 u64
rce_ops2valid(int ops
)
65 return OBD_MD_FLRMTLSETFACL
;
67 return OBD_MD_FLRMTLGETFACL
;
69 return OBD_MD_FLRMTRSETFACL
;
71 return OBD_MD_FLRMTRGETFACL
;
77 static struct rmtacl_ctl_entry
*rce_alloc(pid_t key
, int ops
)
79 struct rmtacl_ctl_entry
*rce
;
81 rce
= kzalloc(sizeof(*rce
), GFP_NOFS
);
85 INIT_LIST_HEAD(&rce
->rce_list
);
92 static void rce_free(struct rmtacl_ctl_entry
*rce
)
94 if (!list_empty(&rce
->rce_list
))
95 list_del(&rce
->rce_list
);
100 static struct rmtacl_ctl_entry
*__rct_search(struct rmtacl_ctl_table
*rct
,
103 struct rmtacl_ctl_entry
*rce
;
104 struct list_head
*head
= &rct
->rct_entries
[rce_hashfunc(key
)];
106 list_for_each_entry(rce
, head
, rce_list
)
107 if (rce
->rce_key
== key
)
113 struct rmtacl_ctl_entry
*rct_search(struct rmtacl_ctl_table
*rct
, pid_t key
)
115 struct rmtacl_ctl_entry
*rce
;
117 spin_lock(&rct
->rct_lock
);
118 rce
= __rct_search(rct
, key
);
119 spin_unlock(&rct
->rct_lock
);
123 int rct_add(struct rmtacl_ctl_table
*rct
, pid_t key
, int ops
)
125 struct rmtacl_ctl_entry
*rce
, *e
;
127 rce
= rce_alloc(key
, ops
);
131 spin_lock(&rct
->rct_lock
);
132 e
= __rct_search(rct
, key
);
133 if (unlikely(e
!= NULL
)) {
134 CWARN("Unexpected stale rmtacl_entry found: "
135 "[key: %d] [ops: %d]\n", (int)key
, ops
);
138 list_add_tail(&rce
->rce_list
, &rct
->rct_entries
[rce_hashfunc(key
)]);
139 spin_unlock(&rct
->rct_lock
);
144 int rct_del(struct rmtacl_ctl_table
*rct
, pid_t key
)
146 struct rmtacl_ctl_entry
*rce
;
148 spin_lock(&rct
->rct_lock
);
149 rce
= __rct_search(rct
, key
);
152 spin_unlock(&rct
->rct_lock
);
154 return rce
? 0 : -ENOENT
;
157 void rct_init(struct rmtacl_ctl_table
*rct
)
161 spin_lock_init(&rct
->rct_lock
);
162 for (i
= 0; i
< RCE_HASHES
; i
++)
163 INIT_LIST_HEAD(&rct
->rct_entries
[i
]);
166 void rct_fini(struct rmtacl_ctl_table
*rct
)
168 struct rmtacl_ctl_entry
*rce
;
171 spin_lock(&rct
->rct_lock
);
172 for (i
= 0; i
< RCE_HASHES
; i
++)
173 while (!list_empty(&rct
->rct_entries
[i
])) {
174 rce
= list_entry(rct
->rct_entries
[i
].next
,
175 struct rmtacl_ctl_entry
, rce_list
);
178 spin_unlock(&rct
->rct_lock
);
182 static struct eacl_entry
*ee_alloc(pid_t key
, struct lu_fid
*fid
, int type
,
183 ext_acl_xattr_header
*header
)
185 struct eacl_entry
*ee
;
187 ee
= kzalloc(sizeof(*ee
), GFP_NOFS
);
191 INIT_LIST_HEAD(&ee
->ee_list
);
200 void ee_free(struct eacl_entry
*ee
)
202 if (!list_empty(&ee
->ee_list
))
203 list_del(&ee
->ee_list
);
206 lustre_ext_acl_xattr_free(ee
->ee_acl
);
211 static struct eacl_entry
*__et_search_del(struct eacl_table
*et
, pid_t key
,
212 struct lu_fid
*fid
, int type
)
214 struct eacl_entry
*ee
;
215 struct list_head
*head
= &et
->et_entries
[ee_hashfunc(key
)];
217 LASSERT(fid
!= NULL
);
218 list_for_each_entry(ee
, head
, ee_list
)
219 if (ee
->ee_key
== key
) {
220 if (lu_fid_eq(&ee
->ee_fid
, fid
) &&
221 ee
->ee_type
== type
) {
222 list_del_init(&ee
->ee_list
);
230 struct eacl_entry
*et_search_del(struct eacl_table
*et
, pid_t key
,
231 struct lu_fid
*fid
, int type
)
233 struct eacl_entry
*ee
;
235 spin_lock(&et
->et_lock
);
236 ee
= __et_search_del(et
, key
, fid
, type
);
237 spin_unlock(&et
->et_lock
);
241 void et_search_free(struct eacl_table
*et
, pid_t key
)
243 struct eacl_entry
*ee
, *next
;
244 struct list_head
*head
= &et
->et_entries
[ee_hashfunc(key
)];
246 spin_lock(&et
->et_lock
);
247 list_for_each_entry_safe(ee
, next
, head
, ee_list
)
248 if (ee
->ee_key
== key
)
251 spin_unlock(&et
->et_lock
);
254 int ee_add(struct eacl_table
*et
, pid_t key
, struct lu_fid
*fid
, int type
,
255 ext_acl_xattr_header
*header
)
257 struct eacl_entry
*ee
, *e
;
259 ee
= ee_alloc(key
, fid
, type
, header
);
263 spin_lock(&et
->et_lock
);
264 e
= __et_search_del(et
, key
, fid
, type
);
265 if (unlikely(e
!= NULL
)) {
266 CWARN("Unexpected stale eacl_entry found: "
267 "[key: %d] [fid: "DFID
"] [type: %d]\n",
268 (int)key
, PFID(fid
), type
);
271 list_add_tail(&ee
->ee_list
, &et
->et_entries
[ee_hashfunc(key
)]);
272 spin_unlock(&et
->et_lock
);
277 void et_init(struct eacl_table
*et
)
281 spin_lock_init(&et
->et_lock
);
282 for (i
= 0; i
< EE_HASHES
; i
++)
283 INIT_LIST_HEAD(&et
->et_entries
[i
]);
286 void et_fini(struct eacl_table
*et
)
288 struct eacl_entry
*ee
;
291 spin_lock(&et
->et_lock
);
292 for (i
= 0; i
< EE_HASHES
; i
++)
293 while (!list_empty(&et
->et_entries
[i
])) {
294 ee
= list_entry(et
->et_entries
[i
].next
,
295 struct eacl_entry
, ee_list
);
298 spin_unlock(&et
->et_lock
);
This page took 0.046078 seconds and 5 git commands to generate.