Lines Matching defs:sp

78 static void g_bde_delete_sector(struct g_bde_softc *wp, struct g_bde_sector *sp);
82 static int g_bde_start_read(struct g_bde_sector *sp);
133 g_bde_delete_sector(struct g_bde_softc *sc, struct g_bde_sector *sp)
138 if (sp->malloc)
139 free(sp->data, M_GBDE);
140 free(sp, M_GBDE);
146 struct g_bde_sector *sp;
148 sp = malloc(sizeof *sp, M_GBDE, M_NOWAIT | M_ZERO);
149 if (sp == NULL)
150 return (sp);
152 sp->data = malloc(len, M_GBDE, M_NOWAIT | M_ZERO);
153 if (sp->data == NULL) {
154 free(sp, M_GBDE);
157 sp->malloc = 1;
161 sp->size = len;
162 sp->softc = wp->softc;
163 sp->ref = 1;
164 sp->owner = wp;
165 sp->offset = wp->so;
166 sp->state = JUNK;
167 return (sp);
187 g_bde_purge_one_sector(struct g_bde_softc *sc, struct g_bde_sector *sp)
190 g_trace(G_T_TOPOLOGY, "g_bde_purge_one_sector(%p, %p)", sc, sp);
191 if (sp->ref != 0)
193 TAILQ_REMOVE(&sc->freelist, sp, list);
196 bzero(sp->data, sp->size);
197 g_bde_delete_sector(sc, sp);
203 struct g_bde_sector *sp;
214 sp = TAILQ_FIRST(&sc->freelist);
215 if (sp != NULL && sp->ref == 0 && sp->used + 300 < time_uptime)
216 g_bde_purge_one_sector(sc, sp);
218 TAILQ_FOREACH(sp, &sc->freelist, list) {
219 if (sp->offset == offset)
222 if (sp != NULL) {
223 sp->ref++;
224 KASSERT(sp->offset == offset, ("wrong offset"));
225 KASSERT(sp->softc == wp->softc, ("wrong softc"));
226 if (sp->ref == 1)
227 sp->owner = wp;
230 TAILQ_FOREACH(sp, &sc->freelist, list)
231 if (sp->ref == 0)
234 if (sp == NULL && !TAILQ_EMPTY(&sc->freelist))
235 sp = TAILQ_FIRST(&sc->freelist);
236 if (sp != NULL && sp->ref > 0)
237 sp = NULL;
238 if (sp == NULL) {
239 sp = g_bde_new_sector(wp, sc->sectorsize);
240 if (sp != NULL) {
243 TAILQ_INSERT_TAIL(&sc->freelist, sp, list);
244 sp->malloc = 2;
247 if (sp != NULL) {
248 sp->offset = offset;
249 sp->softc = wp->softc;
250 sp->ref = 1;
251 sp->owner = wp;
252 sp->state = JUNK;
253 sp->error = 0;
256 if (sp != NULL) {
257 TAILQ_REMOVE(&sc->freelist, sp, list);
258 TAILQ_INSERT_TAIL(&sc->freelist, sp, list);
259 sp->used = time_uptime;
261 wp->ksp = sp;
262 return(sp);
270 struct g_bde_sector *sp;
272 sp = wp->ksp;
273 g_trace(G_T_TOPOLOGY, "g_bde_release_keysector(%p)", sp);
274 KASSERT(sp->malloc == 2, ("Wrong sector released"));
275 sc = sp->softc;
276 KASSERT(sc != NULL, ("NULL sp->softc"));
277 KASSERT(wp == sp->owner, ("Releasing, not owner"));
278 sp->owner = NULL;
280 sp->ref--;
281 if (sp->ref > 0) {
282 TAILQ_REMOVE(&sc->freelist, sp, list);
283 TAILQ_INSERT_TAIL(&sc->freelist, sp, list);
285 if (wp2->ksp == sp) {
287 sp->owner = wp2;
288 wakeup(sp->softc);
292 KASSERT(wp2 != NULL, ("Failed to pick up owner for %p\n", sp));
293 } else if (sp->error != 0) {
294 sp->offset = ~0;
295 sp->error = 0;
296 sp->state = JUNK;
298 TAILQ_REMOVE(&sc->freelist, sp, list);
299 TAILQ_INSERT_HEAD(&sc->freelist, sp, list);
305 struct g_bde_sector *sp;
318 TAILQ_FOREACH(sp, &sc->freelist, list) {
319 if (sp->ref != 0)
321 TAILQ_REMOVE(&sc->freelist, sp, list);
324 bzero(sp->data, sp->size);
325 g_bde_delete_sector(sc, sp);
334 struct g_bde_sector *sp;
337 sp = g_bde_get_keysector(wp);
338 if (sp == NULL) {
340 sp = g_bde_get_keysector(wp);
342 if (sp == NULL)
343 return (sp);
344 if (sp->owner != wp)
345 return (sp);
346 if (sp->state == VALID)
347 return (sp);
348 if (g_bde_start_read(sp) == 0)
349 return (sp);
397 if (wp->sp != NULL)
398 g_bde_delete_sector(wp->softc, wp->sp);
412 struct g_bde_sector *sp;
416 sp = bp->bio_caller1;
419 KASSERT(sp != NULL, ("NULL sp"));
421 KASSERT(sp->owner != NULL, ("NULL sp->owner"));
422 g_trace(G_T_TOPOLOGY, "g_bde_write_done(%p)", sp);
423 if (bp->bio_error == 0 && bp->bio_completed != sp->size)
425 sp->error = bp->bio_error;
427 wp = sp->owner;
429 wp->error = sp->error;
432 KASSERT(sp == wp->sp, ("trashed delete op"));
439 KASSERT(sp == wp->sp || sp == wp->ksp, ("trashed write op"));
440 if (wp->sp == sp) {
441 g_bde_delete_sector(sc, wp->sp);
442 wp->sp = NULL;
444 sp->state = VALID;
446 if (wp->sp == NULL && wp->ksp != NULL && wp->ksp->state == VALID)
457 g_bde_start_write(struct g_bde_sector *sp)
462 g_trace(G_T_TOPOLOGY, "g_bde_start_write(%p)", sp);
463 sc = sp->softc;
465 KASSERT(sp->owner != NULL, ("NULL sp->owner in g_bde_start_write"));
470 bp->bio_offset = sp->offset;
471 bp->bio_data = sp->data;
472 bp->bio_length = sp->size;
474 bp->bio_caller1 = sp;
476 sp->state = IO;
489 struct g_bde_sector *sp;
492 sp = bp->bio_caller1;
493 g_trace(G_T_TOPOLOGY, "g_bde_read_done(%p)", sp);
496 if (bp->bio_error == 0 && bp->bio_completed != sp->size)
498 sp->error = bp->bio_error;
499 if (sp->error == 0)
500 sp->state = VALID;
502 sp->state = JUNK;
513 g_bde_start_read(struct g_bde_sector *sp)
518 g_trace(G_T_TOPOLOGY, "g_bde_start_read(%p)", sp);
519 sc = sp->softc;
520 KASSERT(sc != NULL, ("Null softc in sp %p", sp));
525 bp->bio_offset = sp->offset;
526 bp->bio_data = sp->data;
527 bp->bio_length = sp->size;
529 bp->bio_caller1 = sp;
531 sp->state = IO;
569 KASSERT(wp->sp != NULL, ("NULL wp->sp"));
581 if (wp->bp->bio_cmd == BIO_READ && wp->sp->state == IO)
596 if (wp->sp->error != 0) {
597 g_bde_work_done(wp, wp->sp->error);
604 g_bde_work_done(wp, wp->sp->error);
608 KASSERT(wp->sp->owner == wp,
609 ("Write not owner sp"));
616 error = g_bde_start_write(wp->sp);
631 g_bde_start_write(wp->sp);
687 wp->sp = g_bde_new_sector(wp, 0);
688 if (wp->sp == NULL) {
692 wp->sp->size = wp->length;
693 wp->sp->data = wp->data;
694 if (g_bde_start_read(wp->sp) != 0) {
703 wp->sp = g_bde_new_sector(wp, wp->length);
704 if (wp->sp == NULL) {
710 wp->sp = g_bde_new_sector(wp, wp->length);
711 if (wp->sp == NULL) {