Lines Matching refs:cmap

775 	cow_map_t	*cmap = &sidp->sid_cowinfo->cow_map;
784 ASSERT(offset + len <= cmap->cmap_chunksz);
789 if (chunk >= (cmap->cmap_bmsize * NBBY)) {
799 if (isclr(cmap->cmap_candidate, chunk)) {
813 rw_enter(&cmap->cmap_rwlock, RW_READER);
814 if (isclr(cmap->cmap_hastrans, chunk)) {
827 snapbuf->b_lblkno = lbtodb(chunk * cmap->cmap_chunksz + offset);
869 rw_exit(&cmap->cmap_rwlock);
882 cmn = transtbl_get(cmap, chunk);
889 rw_exit(&cmap->cmap_rwlock);
898 rw_exit(&cmap->cmap_rwlock);
900 bf_index = chunk / cmap->cmap_chunksperbf;
905 buffer, len, ((chunk % cmap->cmap_chunksperbf) *
906 cmap->cmap_chunksz) + offset, UIO_SYSSPACE, 0,
1189 transtbl_add(cow_map_t *cmap, chunknumber_t chunk, caddr_t buf)
1193 ASSERT(RW_WRITE_HELD(&cmap->cmap_rwlock));
1204 cmnode->cmn_next = cmap->cmap_table;
1207 cmap->cmap_table = cmnode;
1220 transtbl_get(cow_map_t *cmap, chunknumber_t chunk)
1224 ASSERT(RW_READ_HELD(&cmap->cmap_rwlock));
1225 ASSERT(cmap);
1228 for (cmn = cmap->cmap_table; cmn != NULL; cmn = cmn->cmn_next) {
1246 transtbl_delete(cow_map_t *cmap, cow_map_node_t *cmn)
1248 ASSERT(RW_WRITE_HELD(&cmap->cmap_rwlock));
1250 ASSERT(cmap->cmap_table);
1253 if (cmap->cmap_table == cmn) {
1255 cmap->cmap_table = cmn->cmn_next;
1273 kmem_free(cmn->cmn_buf, cmap->cmap_chunksz);
1284 transtbl_free(cow_map_t *cmap)
1289 for (curnode = cmap->cmap_table; curnode != NULL; curnode = tempnode) {
1292 kmem_free(curnode->cmn_buf, cmap->cmap_chunksz);
1447 cow_map_t *cmap = &cowp->cow_map;
1456 startchunk = dbtocowchunk(cmap, wbp->b_lblkno);
1457 endchunk = dbtocowchunk(cmap, wbp->b_lblkno +
1513 if (cowchunk >= (cmap->cmap_bmsize * NBBY))
1522 if (isclr(cmap->cmap_candidate, cowchunk)) {
1530 if (isset(cmap->cmap_hastrans, cowchunk)) {
1545 if (sema_tryp(&cmap->cmap_throttle_sem) == 0) {
1547 atomic_inc_32(&cmap->cmap_waiters);
1548 sema_p(&cmap->cmap_throttle_sem);
1549 atomic_dec_32(&cmap->cmap_waiters);
1557 sema_v(&cmap->cmap_throttle_sem);
1567 rw_enter(&cmap->cmap_rwlock, RW_WRITER);
1568 if (isset(cmap->cmap_hastrans, cowchunk)) {
1570 sema_v(&cmap->cmap_throttle_sem);
1571 rw_exit(&cmap->cmap_rwlock);
1580 oldbp->b_lblkno = cowchunktodb(cmap, cowchunk);
1582 oldbp->b_bcount = cmap->cmap_chunksz;
1583 oldbp->b_bufsize = cmap->cmap_chunksz;
1587 oldbp->b_un.b_addr = kmem_alloc(cmap->cmap_chunksz, KM_SLEEP);
1602 kmem_free(oldbp->b_un.b_addr, cmap->cmap_chunksz);
1604 rw_exit(&cmap->cmap_rwlock);
1606 sema_v(&cmap->cmap_throttle_sem);
1614 cmn = transtbl_add(cmap, cowchunk, oldbp->b_un.b_addr);
1624 setbit(cmap->cmap_hastrans, cowchunk);
1626 rw_exit(&cmap->cmap_rwlock);
1661 cow_map_t *cmap = &cowp->cow_map;
1678 sema_v(&cmap->cmap_throttle_sem);
1683 atomic_inc_64((uint64_t *)&cmap->cmap_nchunks);
1685 if ((cmap->cmap_maxsize != 0) &&
1686 ((cmap->cmap_nchunks * cmap->cmap_chunksz) > cmap->cmap_maxsize)) {
1691 cmap->cmap_maxsize);
1693 sema_v(&cmap->cmap_throttle_sem);
1699 bf_index = cmn->cmn_chunk / cmap->cmap_chunksperbf;
1702 cmn->cmn_buf, cmap->cmap_chunksz,
1703 (cmn->cmn_chunk % cmap->cmap_chunksperbf) * cmap->cmap_chunksz,
1709 cmn->cmn_chunk * cmap->cmap_chunksz, error);
1711 sema_v(&cmap->cmap_throttle_sem);
1719 rw_enter(&cmap->cmap_rwlock, RW_WRITER);
1720 transtbl_delete(cmap, cmn);
1721 rw_exit(&cmap->cmap_rwlock);
1725 sema_v(&cmap->cmap_throttle_sem);
1754 struct cow_map *cmap;
1853 cmap = &cowp->cow_map;
1854 rw_init(&cmap->cmap_rwlock, NULL, RW_DEFAULT, NULL);
1855 rw_enter(&cmap->cmap_rwlock, RW_WRITER);
1857 sema_init(&cmap->cmap_throttle_sem, fssnap_max_mem_chunks, NULL,
1860 cmap->cmap_chunksz = chunksz;
1861 cmap->cmap_maxsize = maxsize;
1862 cmap->cmap_chunksperbf = max_backfile_size / chunksz;
1867 cmap->cmap_bmsize = (nchunks + (NBBY - 1)) / NBBY;
1868 cmap->cmap_hastrans = kmem_zalloc(cmap->cmap_bmsize, KM_SLEEP);
1869 cmap->cmap_candidate = kmem_zalloc(cmap->cmap_bmsize, KM_SLEEP);
1902 struct cow_map *cmap = &cowp->cow_map;
1905 ASSERT(chunknumber < (cmap->cmap_bmsize * NBBY));
1906 setbit(cmap->cmap_candidate, chunknumber);
1922 struct cow_map *cmap = &cowp->cow_map;
1923 ulong_t chunknumber = off / cmap->cmap_chunksz;
1926 ASSERT(chunknumber < (cmap->cmap_bmsize * NBBY));
1927 return (isset(cmap->cmap_candidate, chunknumber));
1943 struct cow_map *cmap;
1947 /* sid rwlock and cmap rwlock should be taken from fssnap_create */
1953 cmap = &cowp->cow_map;
1955 ASSERT(RW_WRITE_HELD(&cmap->cmap_rwlock));
1993 rw_exit(&cmap->cmap_rwlock);
2025 struct cow_map *cmap;
2098 /* remove cmap */
2099 cmap = &cowp->cow_map;
2100 ASSERT(cmap);
2102 if (cmap->cmap_candidate)
2103 kmem_free(cmap->cmap_candidate, cmap->cmap_bmsize);
2105 if (cmap->cmap_hastrans)
2106 kmem_free(cmap->cmap_hastrans, cmap->cmap_bmsize);
2108 if (cmap->cmap_table)
2111 rw_destroy(&cmap->cmap_rwlock);
2113 while (cmap->cmap_waiters) {
2114 sema_p(&cmap->cmap_throttle_sem);
2115 sema_v(&cmap->cmap_throttle_sem);
2117 sema_destroy(&cmap->cmap_throttle_sem);