/* * put device into error state */ void top_seterror(ufsvfs_t *ufsvfsp) { ml_unit_t *ul = ufsvfsp->vfs_log; ASSERT(ufsvfsp->vfs_dev == ul->un_dev); ldl_seterror(ul, "ufs is forcing a ufs log error"); }
void lqfs_read_strategy(ml_unit_t *ul, buf_t *bp) { mt_map_t *logmap = ul->un_logmap; offset_t mof = ldbtob(bp->b_blkno); off_t nb = bp->b_bcount; mapentry_t *age; char *va; int (*saviodone)(); int entire_range; uchar_t ord; qfsvfs_t *qfsvfsp = ul->un_qfsvfs; /* * get a linked list of overlapping deltas * returns with &mtm->mtm_rwlock held */ ord = lqfs_find_ord(qfsvfsp, bp); entire_range = logmap_list_get(logmap, mof, ord, nb, &age); /* * no overlapping deltas were found; read master */ if (age == NULL) { rw_exit(&logmap->mtm_rwlock); if (ul->un_flags & LDL_ERROR) { bp->b_flags |= B_ERROR; bp->b_error = EIO; biodone(bp); } else { LQFS_SET_IOTSTAMP(ul->un_qfsvfs, ddi_get_lbolt()); logstats.ls_lreads.value.ui64++; if ((bp->b_flags & B_READ) == 0) { LQFS_MSG(CE_WARN, "lqfs_read_strategy(): " "bdev_strategy writing mof 0x%x " "edev %ld nb %d\n", bp->b_blkno * 512, bp->b_edev, bp->b_bcount); } else { LQFS_MSG(CE_WARN, "lqfs_read_strategy(): " "bdev_strategy reading mof 0x%x " "edev %ld nb %d\n", bp->b_blkno * 512, bp->b_edev, bp->b_bcount); } (void) bdev_strategy(bp); #ifdef LQFS_TODO_STATS lwp_stat_update(LWP_STAT_INBLK, 1); #endif /* LQFS_TODO_STATS */ } return; } va = bp_mapin_common(bp, VM_SLEEP); /* * if necessary, sync read the data from master * errors are returned in bp */ if (!entire_range) { saviodone = bp->b_iodone; bp->b_iodone = trans_not_done; logstats.ls_mreads.value.ui64++; if ((bp->b_flags & B_READ) == 0) { LQFS_MSG(CE_WARN, "lqfs_read_strategy(): " "bdev_strategy writing mof 0x%x edev %ld " "nb %d\n", bp->b_blkno * 512, bp->b_edev, bp->b_bcount); } else { LQFS_MSG(CE_WARN, "lqfs_read_strategy(): " "bdev_strategy reading mof 0x%x edev %ld " "nb %d\n", bp->b_blkno * 512, bp->b_edev, bp->b_bcount); } (void) bdev_strategy(bp); #ifdef LQFS_TODO_STATS lwp_stat_update(LWP_STAT_INBLK, 1); #endif /* LQFS_TODO_STATS */ if (trans_not_wait(bp)) { ldl_seterror(ul, "Error reading master"); } bp->b_iodone = saviodone; } /* * sync read the data from the log * errors are returned inline */ if (ldl_read(ul, va, mof, ord, nb, age)) { bp->b_flags |= B_ERROR; bp->b_error = EIO; } /* * unlist the deltas */ logmap_list_put(logmap, age); /* * all done */ if (ul->un_flags & LDL_ERROR) { bp->b_flags |= B_ERROR; bp->b_error = EIO; } biodone(bp); }