Lines Matching refs:rl

37  *	rl = zfs_range_lock(zp, off, len, lock_type);
38 * zfs_range_unlock(rl);
39 * zfs_range_reduce(rl, off, len);
107 rl_t *rl;
158 rl = avl_find(tree, new, &where);
159 if (rl)
162 rl = (rl_t *)avl_nearest(tree, where, AVL_AFTER);
163 if (rl && (rl->r_off < new->r_off + new->r_len))
166 rl = (rl_t *)avl_nearest(tree, where, AVL_BEFORE);
167 if (rl && rl->r_off + rl->r_len > new->r_off)
174 if (!rl->r_write_wanted) {
175 cv_init(&rl->r_wr_cv, NULL, CV_DEFAULT, NULL);
176 rl->r_write_wanted = B_TRUE;
178 cv_wait(&rl->r_wr_cv, &zp->z_range_lock);
191 zfs_range_proxify(avl_tree_t *tree, rl_t *rl)
195 if (rl->r_proxy)
196 return (rl); /* already a proxy */
198 ASSERT3U(rl->r_cnt, ==, 1);
199 ASSERT(rl->r_write_wanted == B_FALSE);
200 ASSERT(rl->r_read_wanted == B_FALSE);
201 avl_remove(tree, rl);
202 rl->r_cnt = 0;
206 proxy->r_off = rl->r_off;
207 proxy->r_len = rl->r_len;
223 zfs_range_split(avl_tree_t *tree, rl_t *rl, uint64_t off)
227 ASSERT3U(rl->r_len, >, 1);
228 ASSERT3U(off, >, rl->r_off);
229 ASSERT3U(off, <, rl->r_off + rl->r_len);
230 ASSERT(rl->r_write_wanted == B_FALSE);
231 ASSERT(rl->r_read_wanted == B_FALSE);
236 rear->r_len = rl->r_off + rl->r_len - off;
237 rear->r_cnt = rl->r_cnt;
243 front = zfs_range_proxify(tree, rl);
244 front->r_len = off - rl->r_off;
256 rl_t *rl;
259 rl = kmem_alloc(sizeof (rl_t), KM_SLEEP);
260 rl->r_off = off;
261 rl->r_len = len;
262 rl->r_cnt = 1;
263 rl->r_type = RL_READER;
264 rl->r_proxy = B_TRUE;
265 rl->r_write_wanted = B_FALSE;
266 rl->r_read_wanted = B_FALSE;
267 avl_add(tree, rl);
466 rl_t *rl, *next = NULL;
495 rl = avl_find(tree, remove, NULL);
496 ASSERT(rl);
497 ASSERT(rl->r_cnt);
498 ASSERT(rl->r_type == RL_READER);
499 for (len = remove->r_len; len != 0; rl = next) {
500 len -= rl->r_len;
502 next = AVL_NEXT(tree, rl);
504 ASSERT(rl->r_off + rl->r_len == next->r_off);
508 rl->r_cnt--;
509 if (rl->r_cnt == 0) {
510 avl_remove(tree, rl);
511 if (rl->r_write_wanted) {
512 cv_broadcast(&rl->r_wr_cv);
513 cv_destroy(&rl->r_wr_cv);
515 if (rl->r_read_wanted) {
516 cv_broadcast(&rl->r_rd_cv);
517 cv_destroy(&rl->r_rd_cv);
519 kmem_free(rl, sizeof (rl_t));
530 zfs_range_unlock(rl_t *rl)
532 znode_t *zp = rl->r_zp;
534 ASSERT(rl->r_type == RL_WRITER || rl->r_type == RL_READER);
535 ASSERT(rl->r_cnt == 1 || rl->r_cnt == 0);
536 ASSERT(!rl->r_proxy);
539 if (rl->r_type == RL_WRITER) {
541 avl_remove(&zp->z_range_avl, rl);
543 if (rl->r_write_wanted) {
544 cv_broadcast(&rl->r_wr_cv);
545 cv_destroy(&rl->r_wr_cv);
547 if (rl->r_read_wanted) {
548 cv_broadcast(&rl->r_rd_cv);
549 cv_destroy(&rl->r_rd_cv);
551 kmem_free(rl, sizeof (rl_t));
557 zfs_range_unlock_reader(zp, rl);
568 zfs_range_reduce(rl_t *rl, uint64_t off, uint64_t len)
570 znode_t *zp = rl->r_zp;
574 ASSERT(rl->r_off == 0);
575 ASSERT(rl->r_type == RL_WRITER);
576 ASSERT(!rl->r_proxy);
577 ASSERT3U(rl->r_len, ==, UINT64_MAX);
578 ASSERT3U(rl->r_cnt, ==, 1);
581 rl->r_off = off;
582 rl->r_len = len;
584 if (rl->r_write_wanted)
585 cv_broadcast(&rl->r_wr_cv);
586 if (rl->r_read_wanted)
587 cv_broadcast(&rl->r_rd_cv);