Lines Matching defs:eccline
147 #define UDF_LOCK_ECCLINE(eccline) udf_lock_eccline(eccline, __FILE__, __LINE__)
148 #define UDF_UNLOCK_ECCLINE(eccline) udf_unlock_eccline(eccline, __FILE__, __LINE__)
152 udf_lock_eccline(struct udf_eccline *eccline, const char *fname, int sline)
154 struct strat_private *priv = PRIV(eccline->ump);
164 eccline->refcnt++;
165 while (eccline->flags & ECC_LOCKED) {
166 DPRINTF(ECCLINE, ("waiting for lock at %s:%d\n",
168 DPRINTF(ECCLINE, ("was locked at %s:%d\n",
169 eccline->fname, eccline->sline));
170 eccline->flags |= ECC_WANTED;
174 DPRINTF(LOCKING, ("eccline lock held, waiting for "
177 eccline->flags |= ECC_LOCKED;
178 eccline->flags &= ~ECC_WANTED;
179 eccline->refcnt--;
181 eccline->fname = fname;
182 eccline->sline = sline;
191 udf_unlock_eccline(struct udf_eccline *eccline, const char *fname, int sline)
193 struct strat_private *priv = PRIV(eccline->ump);
202 eccline->flags &= ~ECC_LOCKED;
212 udf_dispose_eccline(struct udf_eccline *eccline)
214 struct strat_private *priv = PRIV(eccline->ump);
218 DPRINTF(ECCLINE, ("dispose eccline with start sector %d, "
219 "present %0"PRIx64"\n", eccline->start_sector,
220 eccline->present));
222 KASSERT(eccline->refcnt == 0);
223 KASSERT(eccline->dirty == 0);
224 KASSERT(eccline->queued_on == 0);
225 KASSERT(eccline->flags & ECC_FLOATING);
226 KASSERT(eccline->flags & ECC_LOCKED);
228 LIST_REMOVE(eccline, hashchain);
231 putiobuf(eccline->buf);
232 pool_put(&priv->ecclineblob_pool, eccline->blob);
233 pool_put(&priv->eccline_pool, eccline);
239 udf_push_eccline(struct udf_eccline *eccline, int newqueue)
241 struct strat_private *priv = PRIV(eccline->ump);
245 DPRINTF(PARANOIA, ("DEBUG: buf %p pushed on queue %d\n", eccline->buf, newqueue));
247 KASSERT(eccline->queued_on == 0);
248 KASSERT(eccline->flags & ECC_FLOATING);
251 eccline->buf->b_lblkno = eccline->start_sector;
252 eccline->buf->b_blkno = eccline->start_sector;
253 eccline->buf->b_rawblkno = eccline->start_sector;
256 eccline->flags &= ~ECC_FLOATING;
258 eccline->queued_on = newqueue;
260 bufq_put(priv->queues[newqueue], eccline->buf);
262 UDF_UNLOCK_ECCLINE(eccline);
273 struct udf_eccline *eccline;
284 eccline = BTOE(buf);
285 UDF_LOCK_ECCLINE(eccline);
288 if (eccline->queued_on == queued_on)
291 UDF_UNLOCK_ECCLINE(eccline);
294 KASSERT(eccline->queued_on == queued_on);
295 KASSERT((eccline->flags & ECC_FLOATING) == 0);
298 eccline->buf, queued_on));
300 return eccline;
307 struct udf_eccline *eccline;
319 eccline = BTOE(buf);
320 UDF_LOCK_ECCLINE(eccline);
323 if (eccline->queued_on == queued_on)
326 UDF_UNLOCK_ECCLINE(eccline);
329 KASSERT(eccline->queued_on == queued_on);
330 KASSERT((eccline->flags & ECC_FLOATING) == 0);
333 eccline->queued_on = 0;
335 eccline->flags |= ECC_FLOATING;
339 eccline->buf, queued_on));
341 return eccline;
346 udf_unqueue_eccline(struct strat_private *priv, struct udf_eccline *eccline)
350 UDF_LOCK_ECCLINE(eccline);
351 if (eccline->queued_on == 0) {
352 KASSERT(eccline->flags & ECC_FLOATING);
356 ret = bufq_cancel(priv->queues[eccline->queued_on], eccline->buf);
357 KASSERT(ret == eccline->buf);
359 priv->num_queued[eccline->queued_on]--;
360 eccline->queued_on = 0;
362 eccline->flags |= ECC_FLOATING;
371 struct udf_eccline *eccline;
387 DPRINTF(ECCLINE, ("get line sector %d, line %d\n", sector, line));
388 LIST_FOREACH(eccline, &priv->eccline_hash[line], hashchain) {
389 if (eccline->start_sector == start_sector) {
390 DPRINTF(ECCLINE, ("\tfound eccline, start_sector %d\n",
391 eccline->start_sector));
392 udf_unqueue_eccline(priv, eccline);
395 return eccline;
399 /* not found in eccline cache */
400 DPRINTF(ECCLINE, ("\tnot found in eccline cache\n"));
406 DPRINTF(ECCLINE, ("\tallocating new eccline\n"));
415 eccline = pool_get(&priv->eccline_pool, PR_NOWAIT);
416 if ((eccline_blob == NULL) || (eccline == NULL)) {
419 if (eccline)
420 pool_put(&priv->eccline_pool, eccline);
423 eccline = udf_pop_eccline(priv, UDF_SHED_FREE);
424 if (eccline == NULL) {
432 if (eccline->flags & ECC_WANTED) {
434 udf_push_eccline(eccline, UDF_SHED_FREE);
439 LIST_REMOVE(eccline, hashchain);
440 KASSERT(eccline->flags & ECC_FLOATING);
441 KASSERT(eccline->queued_on == 0);
443 eccline_blob = eccline->blob;
444 eccline->flags = ECC_FLOATING | ECC_LOCKED;
446 eccline->flags = ECC_FLOATING | ECC_LOCKED;
450 eccline->queued_on = 0;
451 eccline->blob = eccline_blob;
452 eccline->buf = getiobuf(NULL, true);
453 eccline->buf->b_private = eccline; /* IMPORTANT */
455 /* initialise eccline blob */
457 memset(eccline->blob, 0, blobsize);
459 eccline->ump = ump;
460 eccline->present = eccline->readin = eccline->dirty = 0;
461 eccline->error = 0;
462 eccline->refcnt = 0;
463 memset(eccline->bufs, 0, UDF_MAX_PACKET_SIZE * sizeof(struct buf *));
465 eccline->start_sector = start_sector;
466 eccline->buf->b_lblkno = start_sector;
467 eccline->buf->b_blkno = start_sector;
468 eccline->buf->b_rawblkno = start_sector;
470 LIST_INSERT_HEAD(&priv->eccline_hash[line], eccline, hashchain);
474 * to get a clue on future eccline usage
477 KASSERT(eccline->refcnt == 0);
478 KASSERT(eccline->flags & ECC_FLOATING);
479 KASSERT(eccline->flags & ECC_LOCKED);
482 return eccline;
487 udf_puteccline(struct udf_eccline *eccline)
489 struct strat_private *priv = PRIV(eccline->ump);
490 struct udf_mount *ump = eccline->ump;
496 DPRINTF(ECCLINE, ("put eccline start sector %d, refcnt %d\n",
497 eccline->start_sector, eccline->refcnt));
499 KASSERT(eccline->flags & ECC_LOCKED);
500 KASSERT(eccline->flags & ECC_FLOATING);
503 if (eccline->readin & eccline->present)
504 eccline->readin &= (~eccline->present) & allbits;
507 if (eccline->refcnt > 1)
508 eccline->flags &= ~ECC_SEQWRITING;
512 if (eccline->refcnt > 0)
514 if (eccline->flags & ECC_WANTED)
516 if (eccline->readin)
518 if (eccline->dirty) {
520 vfs_timestamp(&eccline->wait_time);
521 eccline->wait_time.tv_sec += ECC_WAITTIME;
523 if (eccline->present == allbits) {
525 if (eccline->flags & ECC_SEQWRITING)
529 udf_push_eccline(eccline, new_queue);
542 struct udf_eccline *eccline;
554 /* get our eccline */
555 eccline = udf_geteccline(ump, sectornr, 0);
556 eccsect = sectornr - eccline->start_sector;
559 eccline->readin &= ~bit; /* just in case */
560 eccline->present |= bit;
561 eccline->dirty &= ~bit; /* Err... euhm... clean? */
563 eccline->refcnt++;
566 mem = ((uint8_t *) eccline->blob) + eccsect * lb_size;
569 udf_puteccline(eccline);
581 struct udf_eccline *eccline;
590 /* get our eccline */
591 eccline = udf_geteccline(ump, sectornr, 0);
592 eccsect = sectornr - eccline->start_sector;
595 KASSERT(eccline->present & bit);
597 eccline->readin &= ~bit; /* just in case */
598 /* XXX eccline->dirty? */
600 KASSERT(eccline->refcnt >= 1);
601 eccline->refcnt--;
603 udf_puteccline(eccline);
614 struct udf_eccline *eccline;
627 /* get our eccline */
628 eccline = udf_geteccline(ump, sectornr, 0);
629 eccsect = sectornr - eccline->start_sector;
632 if ((eccline->present & bit) == 0) {
634 eccline->readin |= bit;
635 eccline->refcnt++; /* prevent recycling */
636 KASSERT(eccline->bufs[eccsect] == NULL);
637 udf_puteccline(eccline);
640 priv = PRIV(eccline->ump);
642 while (((eccline->present | eccline->error) & bit) == 0) {
647 DPRINTF(LOCKING, ("eccline waiting for read\n"));
652 eccline = udf_geteccline(ump, sectornr, 0);
653 KASSERT(eccline->refcnt >= 1);
654 eccline->refcnt--; /* undo refcnt */
656 if (eccline->error & bit) {
658 udf_puteccline(eccline);
664 (((uint8_t *) eccline->blob) + eccsect * sector_size);
680 udf_puteccline(eccline);
689 udf_puteccline(eccline);
694 eccline->refcnt++;
695 udf_puteccline(eccline);
708 struct udf_eccline *eccline;
722 /* get our eccline */
723 eccline = udf_geteccline(ump, sectornr, 0);
724 eccsect = sectornr - eccline->start_sector;
729 if (eccline->bufs[eccsect]) {
732 nestiobuf_done(eccline->bufs[eccsect],
733 eccline->bufs_len[eccsect],
735 eccline->bufs[eccsect] = NULL;
740 (((uint8_t *) eccline->blob) + eccsect * sector_size);
750 KASSERT(eccline->present & bit);
751 eccline->dirty |= bit;
761 udf_puteccline(eccline);
775 struct udf_eccline *eccline;
815 eccline = udf_geteccline(ump, sectornr, 0);
816 eccsect = sectornr - eccline->start_sector;
821 udf_puteccline(eccline);
822 eccline = udf_geteccline(ump, sectornr, 0);
823 eccsect = sectornr - eccline->start_sector;
826 error = eccline->error & bit ? EIO : 0;
827 if (eccline->present & bit) {
828 src = (uint8_t *) eccline->blob +
835 eccline->readin |= bit;
836 KASSERT(eccline->bufs[eccsect] == NULL);
837 eccline->bufs[eccsect] = buf;
838 eccline->bufs_bpos[eccsect] = bpos;
839 eccline->bufs_len[eccsect] = len;
846 udf_puteccline(eccline);
865 eccline = udf_geteccline(ump, sectornr, 0);
866 eccsect = sectornr - eccline->start_sector;
871 udf_puteccline(eccline);
872 eccline = udf_geteccline(ump, sectornr, 0);
873 eccsect = sectornr - eccline->start_sector;
876 KASSERT((eccline->readin & bit) == 0);
877 eccline->present |= bit;
878 eccline->dirty |= bit;
879 if (eccline->bufs[eccsect]) {
881 nestiobuf_done(eccline->bufs[eccsect],
882 eccline->bufs_len[eccsect],
884 eccline->bufs[eccsect] = NULL;
888 dst = (uint8_t *) eccline->blob + eccsect * sector_size;
894 eccline->bufs[eccsect] = NULL;
902 udf_puteccline(eccline);
969 eccline = udf_geteccline(ump, sectornr, ECC_SEQWRITING);
970 eccsect = sectornr - eccline->start_sector;
974 eccsect = sectornr - eccline->start_sector;
976 eccline->flags |= ECC_SEQWRITING;
977 udf_puteccline(eccline);
978 eccline = udf_geteccline(ump, sectornr, ECC_SEQWRITING);
979 eccsect = sectornr - eccline->start_sector;
982 KASSERT((eccline->readin & bit) == 0);
983 eccline->present |= bit;
984 eccline->dirty |= bit;
985 eccline->bufs[eccsect] = NULL;
989 eccline->blob + eccsect * sector_size;
1001 eccline->flags |= ECC_SEQWRITING;
1002 udf_puteccline(eccline);
1021 struct udf_eccline *eccline = BTOE(buf);
1022 struct udf_mount *ump = eccline->ump;
1028 DPRINTF(ECCLINE, ("read callback called on buf %p\n", buf));
1031 KASSERT(eccline->flags & ECC_LOCKED);
1036 dst = (uint8_t *) eccline->blob + i * sector_size;
1037 if (eccline->present & bit)
1039 eccline->present |= bit;
1041 eccline->error |= bit;
1042 if (eccline->bufs[i]) {
1043 dst = (uint8_t *) eccline->bufs[i]->b_data +
1044 eccline->bufs_bpos[i];
1045 len = eccline->bufs_len[i];
1048 nestiobuf_done(eccline->bufs[i], len, error);
1049 eccline->bufs[i] = NULL;
1053 KASSERT(buf->b_data == eccline->blob);
1054 KASSERT(eccline->present == ((uint64_t) 1 << ump->packet_size)-1);
1061 udf_puteccline(eccline);
1062 DPRINTF(ECCLINE, ("read callback finished\n"));
1069 struct udf_eccline *eccline = BTOE(buf);
1070 struct udf_mount *ump = eccline->ump;
1074 DPRINTF(ECCLINE, ("write callback called on buf %p\n", buf));
1077 KASSERT(eccline->flags & ECC_LOCKED);
1081 if ((eccline->dirty & bit) == 0)
1084 eccline->error |= bit;
1086 eccline->dirty &= ~bit;
1089 KASSERT(eccline->bufs[i] == 0);
1091 KASSERT(eccline->dirty == 0);
1098 udf_puteccline(eccline);
1099 DPRINTF(ECCLINE, ("write callback finished\n"));
1104 udf_issue_eccline(struct udf_eccline *eccline, int queued_on)
1106 struct udf_mount *ump = eccline->ump;
1115 KASSERT(eccline->flags & ECC_LOCKED);
1120 eccline->readin = (~eccline->present) & allbits;
1121 KASSERT(eccline->readin);
1122 start = eccline->start_sector;
1123 buf = eccline->buf;
1128 buf->b_data = eccline->blob;
1132 buf->b_private = eccline;
1137 if (eccline->present != 0) {
1140 if (eccline->present & bit) {
1166 "dirty %"PRIx64"\n\t", eccline->present, eccline->readin,
1167 eccline->dirty));
1168 KASSERT(eccline->present == allbits);
1170 start = eccline->start_sector;
1171 buf = eccline->buf;
1176 buf->b_data = eccline->blob;
1180 buf->b_private = eccline;
1201 struct udf_eccline *eccline;
1216 /* maintenance: handle eccline state machine */
1219 eccline = udf_peek_eccline(priv, UDF_SHED_WAITING);
1220 if (eccline == NULL)
1225 (eccline->wait_time.tv_sec - now.tv_sec > 0)) {
1226 UDF_UNLOCK_ECCLINE(eccline);
1232 UDF_UNLOCK_ECCLINE(eccline);
1235 eccline = udf_pop_eccline(priv, UDF_SHED_WAITING);
1239 if (eccline->refcnt > 0)
1241 if (eccline->flags & ECC_WANTED)
1243 if (eccline->readin)
1245 if (eccline->dirty) {
1247 if (eccline->present == allbits) {
1249 if (eccline->flags & ECC_SEQWRITING)
1253 udf_push_eccline(eccline, new_queue);
1258 eccline = udf_pop_eccline(priv, UDF_SHED_FREE);
1259 KASSERT(eccline);
1260 KASSERT(eccline->refcnt == 0);
1261 if (eccline->flags & ECC_WANTED) {
1263 DPRINTF(ECCLINE, ("Tried removing, pushed back to free list\n"));
1264 udf_push_eccline(eccline, UDF_SHED_IDLE);
1266 DPRINTF(ECCLINE, ("Removing entry from free list\n"));
1267 udf_dispose_eccline(eccline);
1277 eccline = udf_pop_eccline(priv, priv->cur_queue);
1278 if (eccline) {
1281 DPRINTF(ECCLINE, ("UDF_ISSUE_ECCLINE\n"));
1283 udf_issue_eccline(eccline, priv->cur_queue);
1351 eccline = udf_pop_eccline(priv, UDF_SHED_FREE);
1352 while (eccline) {
1353 udf_dispose_eccline(eccline);
1354 eccline = udf_pop_eccline(priv, UDF_SHED_FREE);
1423 /* initialise struct eccline pool */
1427 /* initialise eccline blob pool */