]>
Commit | Line | Data |
---|---|---|
34dc7c2f BB |
1 | /* |
2 | * CDDL HEADER START | |
3 | * | |
4 | * The contents of this file are subject to the terms of the | |
5 | * Common Development and Distribution License (the "License"). | |
6 | * You may not use this file except in compliance with the License. | |
7 | * | |
8 | * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | |
9 | * or http://www.opensolaris.org/os/licensing. | |
10 | * See the License for the specific language governing permissions | |
11 | * and limitations under the License. | |
12 | * | |
13 | * When distributing Covered Code, include this CDDL HEADER in each | |
14 | * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | |
15 | * If applicable, add the following below this CDDL HEADER, with the | |
16 | * fields enclosed by brackets "[]" replaced with your own identifying | |
17 | * information: Portions Copyright [yyyy] [name of copyright owner] | |
18 | * | |
19 | * CDDL HEADER END | |
20 | */ | |
21 | /* | |
22 | * Copyright 2006 Sun Microsystems, Inc. All rights reserved. | |
23 | * Use is subject to license terms. | |
24 | */ | |
25 | ||
26 | #ifndef _SYS_FS_ZFS_RLOCK_H | |
27 | #define _SYS_FS_ZFS_RLOCK_H | |
28 | ||
34dc7c2f BB |
29 | #ifdef __cplusplus |
30 | extern "C" { | |
31 | #endif | |
32 | ||
33 | #ifdef _KERNEL | |
34 | ||
35 | #include <sys/zfs_znode.h> | |
36 | ||
37 | typedef enum { | |
38 | RL_READER, | |
39 | RL_WRITER, | |
40 | RL_APPEND | |
41 | } rl_type_t; | |
42 | ||
43 | typedef struct rl { | |
44 | znode_t *r_zp; /* znode this lock applies to */ | |
45 | avl_node_t r_node; /* avl node link */ | |
46 | uint64_t r_off; /* file range offset */ | |
47 | uint64_t r_len; /* file range length */ | |
48 | uint_t r_cnt; /* range reference count in tree */ | |
49 | rl_type_t r_type; /* range type */ | |
50 | kcondvar_t r_wr_cv; /* cv for waiting writers */ | |
51 | kcondvar_t r_rd_cv; /* cv for waiting readers */ | |
52 | uint8_t r_proxy; /* acting for original range */ | |
53 | uint8_t r_write_wanted; /* writer wants to lock this range */ | |
54 | uint8_t r_read_wanted; /* reader wants to lock this range */ | |
450dc149 | 55 | list_node_t rl_node; /* used for deferred release */ |
34dc7c2f BB |
56 | } rl_t; |
57 | ||
58 | /* | |
23d56208 AX |
59 | * Lock a range (offset, length) as either shared (RL_READER) |
60 | * or exclusive (RL_WRITER or RL_APPEND). RL_APPEND is a special type that | |
61 | * is converted to RL_WRITER that specified to lock from the start of the | |
62 | * end of file. Returns the range lock structure. | |
34dc7c2f BB |
63 | */ |
64 | rl_t *zfs_range_lock(znode_t *zp, uint64_t off, uint64_t len, rl_type_t type); | |
65 | ||
23d56208 | 66 | /* Unlock range and destroy range lock structure. */ |
34dc7c2f BB |
67 | void zfs_range_unlock(rl_t *rl); |
68 | ||
69 | /* | |
70 | * Reduce range locked as RW_WRITER from whole file to specified range. | |
71 | * Asserts the whole file was previously locked. | |
72 | */ | |
73 | void zfs_range_reduce(rl_t *rl, uint64_t off, uint64_t len); | |
74 | ||
75 | /* | |
23d56208 AX |
76 | * AVL comparison function used to order range locks |
77 | * Locks are ordered on the start offset of the range. | |
34dc7c2f BB |
78 | */ |
79 | int zfs_range_compare(const void *arg1, const void *arg2); | |
80 | ||
81 | #endif /* _KERNEL */ | |
82 | ||
83 | #ifdef __cplusplus | |
84 | } | |
85 | #endif | |
86 | ||
87 | #endif /* _SYS_FS_ZFS_RLOCK_H */ |