Lines Matching refs:sp

53 	rc_snapshot_t *sp;  in snapshot_alloc()  local
54 sp = uu_zalloc(sizeof (*sp)); in snapshot_alloc()
56 (void) pthread_mutex_init(&sp->rs_lock, NULL); in snapshot_alloc()
57 (void) pthread_cond_init(&sp->rs_cv, NULL); in snapshot_alloc()
59 sp->rs_refcnt++; in snapshot_alloc()
60 return (sp); in snapshot_alloc()
64 snapshot_free(rc_snapshot_t *sp) in snapshot_free() argument
68 assert(sp->rs_refcnt == 0 && sp->rs_childref == 0); in snapshot_free()
70 (void) pthread_mutex_destroy(&sp->rs_lock); in snapshot_free()
71 (void) pthread_cond_destroy(&sp->rs_cv); in snapshot_free()
73 for (lvl = sp->rs_levels; lvl != NULL; lvl = next) { in snapshot_free()
76 assert(lvl->rsl_parent == sp); in snapshot_free()
86 uu_free(sp); in snapshot_free()
90 rc_snapshot_hold(rc_snapshot_t *sp) in rc_snapshot_hold() argument
92 (void) pthread_mutex_lock(&sp->rs_lock); in rc_snapshot_hold()
93 sp->rs_refcnt++; in rc_snapshot_hold()
94 assert(sp->rs_refcnt > 0); in rc_snapshot_hold()
95 (void) pthread_mutex_unlock(&sp->rs_lock); in rc_snapshot_hold()
99 rc_snapshot_rele(rc_snapshot_t *sp) in rc_snapshot_rele() argument
102 (void) pthread_mutex_lock(&sp->rs_lock); in rc_snapshot_rele()
103 assert(sp->rs_refcnt > 0); in rc_snapshot_rele()
104 sp->rs_refcnt--; in rc_snapshot_rele()
105 done = ((sp->rs_flags & RC_SNAPSHOT_DEAD) && in rc_snapshot_rele()
106 sp->rs_refcnt == 0 && sp->rs_childref == 0); in rc_snapshot_rele()
107 (void) pthread_mutex_unlock(&sp->rs_lock); in rc_snapshot_rele()
110 snapshot_free(sp); in rc_snapshot_rele()
116 rc_snapshot_t *sp = lvl->rsl_parent; in rc_snaplevel_hold() local
117 (void) pthread_mutex_lock(&sp->rs_lock); in rc_snaplevel_hold()
118 sp->rs_childref++; in rc_snaplevel_hold()
119 assert(sp->rs_childref > 0); in rc_snaplevel_hold()
120 (void) pthread_mutex_unlock(&sp->rs_lock); in rc_snaplevel_hold()
127 rc_snapshot_t *sp = lvl->rsl_parent; in rc_snaplevel_rele() local
128 (void) pthread_mutex_lock(&sp->rs_lock); in rc_snaplevel_rele()
129 assert(sp->rs_childref > 0); in rc_snaplevel_rele()
130 sp->rs_childref--; in rc_snaplevel_rele()
131 done = ((sp->rs_flags & RC_SNAPSHOT_DEAD) && in rc_snaplevel_rele()
132 sp->rs_refcnt == 0 && sp->rs_childref == 0); in rc_snaplevel_rele()
133 (void) pthread_mutex_unlock(&sp->rs_lock); in rc_snaplevel_rele()
136 snapshot_free(sp); in rc_snaplevel_rele()
157 rc_snapshot_t *sp; in snapshot_lookup_unlocked() local
162 for (sp = bp->sb_head; sp != NULL; sp = sp->rs_hash_next) { in snapshot_lookup_unlocked()
163 if (sp->rs_snap_id == snap_id) { in snapshot_lookup_unlocked()
164 rc_snapshot_hold(sp); in snapshot_lookup_unlocked()
165 return (sp); in snapshot_lookup_unlocked()
172 snapshot_insert_unlocked(snapshot_bucket_t *bp, rc_snapshot_t *sp) in snapshot_insert_unlocked() argument
175 assert(bp == SNAPSHOT_BUCKET(sp->rs_snap_id)); in snapshot_insert_unlocked()
177 assert(sp->rs_hash_next == NULL); in snapshot_insert_unlocked()
179 sp->rs_hash_next = bp->sb_head; in snapshot_insert_unlocked()
180 bp->sb_head = sp; in snapshot_insert_unlocked()
184 snapshot_remove_unlocked(snapshot_bucket_t *bp, rc_snapshot_t *sp) in snapshot_remove_unlocked() argument
189 assert(bp == SNAPSHOT_BUCKET(sp->rs_snap_id)); in snapshot_remove_unlocked()
191 assert(sp->rs_hash_next == NULL); in snapshot_remove_unlocked()
194 if (*spp == sp) in snapshot_remove_unlocked()
197 assert(*spp == sp); in snapshot_remove_unlocked()
198 *spp = sp->rs_hash_next; in snapshot_remove_unlocked()
199 sp->rs_hash_next = NULL; in snapshot_remove_unlocked()
213 rc_snapshot_t *sp; in rc_snapshot_get() local
217 sp = snapshot_lookup_unlocked(bp, snap_id); in rc_snapshot_get()
218 if (sp != NULL) { in rc_snapshot_get()
220 (void) pthread_mutex_lock(&sp->rs_lock); in rc_snapshot_get()
221 while (sp->rs_flags & RC_SNAPSHOT_FILLING) in rc_snapshot_get()
222 (void) pthread_cond_wait(&sp->rs_cv, &sp->rs_lock); in rc_snapshot_get()
224 if (sp->rs_flags & RC_SNAPSHOT_DEAD) { in rc_snapshot_get()
225 (void) pthread_mutex_unlock(&sp->rs_lock); in rc_snapshot_get()
226 rc_snapshot_rele(sp); in rc_snapshot_get()
229 assert(sp->rs_flags & RC_SNAPSHOT_READY); in rc_snapshot_get()
230 (void) pthread_mutex_unlock(&sp->rs_lock); in rc_snapshot_get()
231 *snpp = sp; in rc_snapshot_get()
234 sp = snapshot_alloc(); in rc_snapshot_get()
235 sp->rs_snap_id = snap_id; in rc_snapshot_get()
236 sp->rs_flags |= RC_SNAPSHOT_FILLING; in rc_snapshot_get()
237 snapshot_insert_unlocked(bp, sp); in rc_snapshot_get()
243 r = object_fill_snapshot(sp); in rc_snapshot_get()
251 snapshot_remove_unlocked(bp, sp); in rc_snapshot_get()
254 (void) pthread_mutex_lock(&sp->rs_lock); in rc_snapshot_get()
255 sp->rs_flags &= ~RC_SNAPSHOT_FILLING; in rc_snapshot_get()
256 sp->rs_flags |= RC_SNAPSHOT_DEAD; in rc_snapshot_get()
257 (void) pthread_cond_broadcast(&sp->rs_cv); in rc_snapshot_get()
258 (void) pthread_mutex_unlock(&sp->rs_lock); in rc_snapshot_get()
259 rc_snapshot_rele(sp); /* may free sp */ in rc_snapshot_get()
262 (void) pthread_mutex_lock(&sp->rs_lock); in rc_snapshot_get()
263 sp->rs_flags &= ~RC_SNAPSHOT_FILLING; in rc_snapshot_get()
264 sp->rs_flags |= RC_SNAPSHOT_READY; in rc_snapshot_get()
265 (void) pthread_cond_broadcast(&sp->rs_cv); in rc_snapshot_get()
266 (void) pthread_mutex_unlock(&sp->rs_lock); in rc_snapshot_get()
267 *snpp = sp; in rc_snapshot_get()