Mercurial > illumos > illumos-gate
annotate usr/src/uts/common/fs/zfs/sys/rrwlock.h @ 13743:95aba6e49b9f
2882 implement libzfs_core
2883 changing "canmount" property to "on" should not always remount dataset
2900 "zfs snapshot" should be able to create multiple, arbitrary snapshots at once
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Chris Siden <christopher.siden@delphix.com>
Reviewed by: Garrett D'Amore <garrett@damore.org>
Reviewed by: Bill Pijewski <wdp@joyent.com>
Reviewed by: Dan Kruchinin <dan.kruchinin@gmail.com>
Approved by: Eric Schrock <Eric.Schrock@delphix.com>
author | Matthew Ahrens <mahrens@delphix.com> |
---|---|
date | Sat, 30 Jun 2012 13:00:47 -0700 |
parents | 6752aa2bd5bc |
children | 4972ab336f54 |
rev | line source |
---|---|
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
1 /* |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
2 * CDDL HEADER START |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
3 * |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
4 * The contents of this file are subject to the terms of the |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
5 * Common Development and Distribution License (the "License"). |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
6 * You may not use this file except in compliance with the License. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
7 * |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
9 * or http://www.opensolaris.org/os/licensing. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
10 * See the License for the specific language governing permissions |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
11 * and limitations under the License. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
12 * |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
13 * When distributing Covered Code, include this CDDL HEADER in each |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
15 * If applicable, add the following below this CDDL HEADER, with the |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
16 * fields enclosed by brackets "[]" replaced with your own identifying |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
17 * information: Portions Copyright [yyyy] [name of copyright owner] |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
18 * |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
19 * CDDL HEADER END |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
20 */ |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
21 /* |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
23 * Use is subject to license terms. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
24 */ |
13743
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
5326
diff
changeset
|
25 /* |
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
5326
diff
changeset
|
26 * Copyright (c) 2012 by Delphix. All rights reserved. |
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
5326
diff
changeset
|
27 */ |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
28 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
29 #ifndef _SYS_RR_RW_LOCK_H |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
30 #define _SYS_RR_RW_LOCK_H |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
31 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
32 #ifdef __cplusplus |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
33 extern "C" { |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
34 #endif |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
35 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
36 #include <sys/inttypes.h> |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
37 #include <sys/zfs_context.h> |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
38 #include <sys/refcount.h> |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
39 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
40 /* |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
41 * A reader-writer lock implementation that allows re-entrant reads, but |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
42 * still gives writers priority on "new" reads. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
43 * |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
44 * See rrwlock.c for more details about the implementation. |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
45 * |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
46 * Fields of the rrwlock_t structure: |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
47 * - rr_lock: protects modification and reading of rrwlock_t fields |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
48 * - rr_cv: cv for waking up readers or waiting writers |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
49 * - rr_writer: thread id of the current writer |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
50 * - rr_anon_rount: number of active anonymous readers |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
51 * - rr_linked_rcount: total number of non-anonymous active readers |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
52 * - rr_writer_wanted: a writer wants the lock |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
53 */ |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
54 typedef struct rrwlock { |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
55 kmutex_t rr_lock; |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
56 kcondvar_t rr_cv; |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
57 kthread_t *rr_writer; |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
58 refcount_t rr_anon_rcount; |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
59 refcount_t rr_linked_rcount; |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
60 boolean_t rr_writer_wanted; |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
61 } rrwlock_t; |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
62 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
63 /* |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
64 * 'tag' is used in reference counting tracking. The |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
65 * 'tag' must be the same in a rrw_enter() as in its |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
66 * corresponding rrw_exit(). |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
67 */ |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
68 void rrw_init(rrwlock_t *rrl); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
69 void rrw_destroy(rrwlock_t *rrl); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
70 void rrw_enter(rrwlock_t *rrl, krw_t rw, void *tag); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
71 void rrw_exit(rrwlock_t *rrl, void *tag); |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
72 boolean_t rrw_held(rrwlock_t *rrl, krw_t rw); |
13743
95aba6e49b9f
2882 implement libzfs_core
Matthew Ahrens <mahrens@delphix.com>
parents:
5326
diff
changeset
|
73 void rrw_tsd_destroy(void *arg); |
5326
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
74 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
75 #define RRW_READ_HELD(x) rrw_held(x, RW_READER) |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
76 #define RRW_WRITE_HELD(x) rrw_held(x, RW_WRITER) |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
77 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
78 #ifdef __cplusplus |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
79 } |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
80 #endif |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
81 |
6752aa2bd5bc
6425096 want online 'zfs recv' (read only and read/write)
ek110237
parents:
diff
changeset
|
82 #endif /* _SYS_RR_RW_LOCK_H */ |