40 RL_READER,
41 RL_WRITER,
42 RL_APPEND
43 } rl_type_t;
44
45 typedef struct rl {
46 znode_t *r_zp; /* znode this lock applies to */
47 avl_node_t r_node; /* avl node link */
48 uint64_t r_off; /* file range offset */
49 uint64_t r_len; /* file range length */
50 uint_t r_cnt; /* range reference count in tree */
51 rl_type_t r_type; /* range type */
52 kcondvar_t r_wr_cv; /* cv for waiting writers */
53 kcondvar_t r_rd_cv; /* cv for waiting readers */
54 uint8_t r_proxy; /* acting for original range */
55 uint8_t r_write_wanted; /* writer wants to lock this range */
56 uint8_t r_read_wanted; /* reader wants to lock this range */
57 } rl_t;
58
59 /*
60 * Lock a range (offset, length) as either shared (READER)
61 * or exclusive (WRITER or APPEND). APPEND is a special type that
62 * is converted to WRITER that specified to lock from the start of the
63 * end of file. zfs_range_lock() returns the range lock structure.
64 */
65 rl_t *zfs_range_lock(znode_t *zp, uint64_t off, uint64_t len, rl_type_t type);
66
67 /*
68 * Unlock range and destroy range lock structure.
69 */
70 void zfs_range_unlock(rl_t *rl);
71
72 /*
73 * Reduce range locked as RW_WRITER from whole file to specified range.
74 * Asserts the whole file was previously locked.
75 */
76 void zfs_range_reduce(rl_t *rl, uint64_t off, uint64_t len);
77
78 /*
79 * AVL comparison function used to compare range locks
80 */
81 int zfs_range_compare(const void *arg1, const void *arg2);
82
83 #endif /* _KERNEL */
84
85 #ifdef __cplusplus
86 }
87 #endif
88
89 #endif /* _SYS_FS_ZFS_RLOCK_H */
|
40 RL_READER,
41 RL_WRITER,
42 RL_APPEND
43 } rl_type_t;
44
45 typedef struct rl {
46 znode_t *r_zp; /* znode this lock applies to */
47 avl_node_t r_node; /* avl node link */
48 uint64_t r_off; /* file range offset */
49 uint64_t r_len; /* file range length */
50 uint_t r_cnt; /* range reference count in tree */
51 rl_type_t r_type; /* range type */
52 kcondvar_t r_wr_cv; /* cv for waiting writers */
53 kcondvar_t r_rd_cv; /* cv for waiting readers */
54 uint8_t r_proxy; /* acting for original range */
55 uint8_t r_write_wanted; /* writer wants to lock this range */
56 uint8_t r_read_wanted; /* reader wants to lock this range */
57 } rl_t;
58
59 /*
60 * Lock a range (offset, length) as either shared (RL_READER)
61 * or exclusive (RL_WRITER or RL_APPEND). RL_APPEND is a special type that
62 * is converted to RL_WRITER that specified to lock from the start of the
63 * end of file. Returns the range lock structure.
64 */
65 rl_t *zfs_range_lock(znode_t *zp, uint64_t off, uint64_t len, rl_type_t type);
66
67 /* Unlock range and destroy range lock structure. */
68 void zfs_range_unlock(rl_t *rl);
69
70 /*
71 * Reduce range locked as RW_WRITER from whole file to specified range.
72 * Asserts the whole file was previously locked.
73 */
74 void zfs_range_reduce(rl_t *rl, uint64_t off, uint64_t len);
75
76 /*
77 * AVL comparison function used to order range locks
78 * Locks are ordered on the start offset of the range.
79 */
80 int zfs_range_compare(const void *arg1, const void *arg2);
81
82 #endif /* _KERNEL */
83
84 #ifdef __cplusplus
85 }
86 #endif
87
88 #endif /* _SYS_FS_ZFS_RLOCK_H */
|