Lines Matching defs:amp

96 off2ext(const struct activemap *amp, off_t offset)
100 PJDLOG_ASSERT(offset >= 0 && offset < amp->am_mediasize);
101 extent = (offset >> amp->am_extentshift);
102 PJDLOG_ASSERT(extent >= 0 && extent < amp->am_nextents);
107 ext2off(const struct activemap *amp, int extent)
111 PJDLOG_ASSERT(extent >= 0 && extent < amp->am_nextents);
112 offset = ((off_t)extent << amp->am_extentshift);
113 PJDLOG_ASSERT(offset >= 0 && offset < amp->am_mediasize);
122 ext2reqs(const struct activemap *amp, int ext)
126 if (ext < amp->am_nextents - 1)
127 return (((amp->am_extentsize - 1) / MAXPHYS) + 1);
129 PJDLOG_ASSERT(ext == amp->am_nextents - 1);
130 left = amp->am_mediasize % amp->am_extentsize;
132 left = amp->am_extentsize;
144 struct activemap *amp;
154 amp = malloc(sizeof(*amp));
155 if (amp == NULL)
158 amp->am_mediasize = mediasize;
159 amp->am_nkeepdirty_limit = keepdirty;
160 amp->am_extentsize = extentsize;
161 amp->am_extentshift = bitcount32(extentsize - 1);
162 amp->am_nextents = ((mediasize - 1) / extentsize) + 1;
163 amp->am_mapsize = bitstr_size(amp->am_nextents);
164 amp->am_diskmapsize = roundup2(amp->am_mapsize, sectorsize);
165 amp->am_ndirty = 0;
166 amp->am_syncoff = -2;
167 TAILQ_INIT(&amp->am_keepdirty);
168 amp->am_nkeepdirty = 0;
170 amp->am_memtab = calloc(amp->am_nextents, sizeof(amp->am_memtab[0]));
171 amp->am_diskmap = calloc(1, amp->am_diskmapsize);
172 amp->am_memmap = bit_alloc(amp->am_nextents);
173 amp->am_syncmap = bit_alloc(amp->am_nextents);
178 if (amp->am_memtab == NULL || amp->am_diskmap == NULL ||
179 amp->am_memmap == NULL || amp->am_syncmap == NULL) {
180 if (amp->am_memtab != NULL)
181 free(amp->am_memtab);
182 if (amp->am_diskmap != NULL)
183 free(amp->am_diskmap);
184 if (amp->am_memmap != NULL)
185 free(amp->am_memmap);
186 if (amp->am_syncmap != NULL)
187 free(amp->am_syncmap);
188 amp->am_magic = 0;
189 free(amp);
194 amp->am_magic = ACTIVEMAP_MAGIC;
195 *ampp = amp;
201 keepdirty_find(struct activemap *amp, int extent)
205 TAILQ_FOREACH(kd, &amp->am_keepdirty, kd_next) {
213 keepdirty_add(struct activemap *amp, int extent)
217 kd = keepdirty_find(amp, extent);
222 TAILQ_REMOVE(&amp->am_keepdirty, kd, kd_next);
223 TAILQ_INSERT_HEAD(&amp->am_keepdirty, kd, kd_next);
230 if (amp->am_nkeepdirty >= amp->am_nkeepdirty_limit) {
231 kd = TAILQ_LAST(&amp->am_keepdirty, skeepdirty);
233 TAILQ_REMOVE(&amp->am_keepdirty, kd, kd_next);
234 amp->am_nkeepdirty--;
235 PJDLOG_ASSERT(amp->am_nkeepdirty > 0);
242 amp->am_nkeepdirty++;
243 TAILQ_INSERT_HEAD(&amp->am_keepdirty, kd, kd_next);
250 keepdirty_fill(struct activemap *amp)
254 TAILQ_FOREACH(kd, &amp->am_keepdirty, kd_next)
255 bit_set(amp->am_diskmap, kd->kd_extent);
259 keepdirty_free(struct activemap *amp)
263 while ((kd = TAILQ_FIRST(&amp->am_keepdirty)) != NULL) {
264 TAILQ_REMOVE(&amp->am_keepdirty, kd, kd_next);
265 amp->am_nkeepdirty--;
268 PJDLOG_ASSERT(amp->am_nkeepdirty == 0);
275 activemap_free(struct activemap *amp)
278 PJDLOG_ASSERT(amp->am_magic == ACTIVEMAP_MAGIC);
280 amp->am_magic = 0;
282 keepdirty_free(amp);
283 free(amp->am_memtab);
284 free(amp->am_diskmap);
285 free(amp->am_memmap);
286 free(amp->am_syncmap);
294 activemap_write_start(struct activemap *amp, off_t offset, off_t length)
300 PJDLOG_ASSERT(amp->am_magic == ACTIVEMAP_MAGIC);
306 for (ext = off2ext(amp, offset); ext <= off2ext(amp, end); ext++) {
313 if (amp->am_memtab[ext]++ == 0) {
314 PJDLOG_ASSERT(!bit_test(amp->am_memmap, ext));
315 bit_set(amp->am_memmap, ext);
316 amp->am_ndirty++;
318 if (keepdirty_add(amp, ext))
330 activemap_write_complete(struct activemap *amp, off_t offset, off_t length)
336 PJDLOG_ASSERT(amp->am_magic == ACTIVEMAP_MAGIC);
342 for (ext = off2ext(amp, offset); ext <= off2ext(amp, end); ext++) {
349 PJDLOG_ASSERT(amp->am_memtab[ext] > 0);
350 PJDLOG_ASSERT(bit_test(amp->am_memmap, ext));
351 if (--amp->am_memtab[ext] == 0) {
352 bit_clear(amp->am_memmap, ext);
353 amp->am_ndirty--;
354 if (keepdirty_find(amp, ext) == NULL)
367 activemap_extent_complete(struct activemap *amp, int extent)
372 PJDLOG_ASSERT(amp->am_magic == ACTIVEMAP_MAGIC);
373 PJDLOG_ASSERT(extent >= 0 && extent < amp->am_nextents);
377 reqs = ext2reqs(amp, extent);
378 PJDLOG_ASSERT(amp->am_memtab[extent] >= reqs);
379 amp->am_memtab[extent] -= reqs;
380 PJDLOG_ASSERT(bit_test(amp->am_memmap, extent));
381 if (amp->am_memtab[extent] == 0) {
382 bit_clear(amp->am_memmap, extent);
383 amp->am_ndirty--;
394 activemap_ndirty(const struct activemap *amp)
397 PJDLOG_ASSERT(amp->am_magic == ACTIVEMAP_MAGIC);
399 return (amp->am_ndirty);
407 activemap_differ(const struct activemap *amp)
410 PJDLOG_ASSERT(amp->am_magic == ACTIVEMAP_MAGIC);
412 return (memcmp(amp->am_diskmap, amp->am_memmap,
413 amp->am_mapsize) != 0);
420 activemap_size(const struct activemap *amp)
423 PJDLOG_ASSERT(amp->am_magic == ACTIVEMAP_MAGIC);
425 return (amp->am_mapsize);
433 activemap_ondisk_size(const struct activemap *amp)
436 PJDLOG_ASSERT(amp->am_magic == ACTIVEMAP_MAGIC);
438 return (amp->am_diskmapsize);
445 activemap_copyin(struct activemap *amp, const unsigned char *buf, size_t size)
449 PJDLOG_ASSERT(amp->am_magic == ACTIVEMAP_MAGIC);
450 PJDLOG_ASSERT(size >= amp->am_mapsize);
452 memcpy(amp->am_diskmap, buf, amp->am_mapsize);
453 memcpy(amp->am_memmap, buf, amp->am_mapsize);
454 memcpy(amp->am_syncmap, buf, amp->am_mapsize);
456 bit_ffs(amp->am_memmap, amp->am_nextents, &ext);
464 activemap_sync_rewind(amp);
470 amp->am_ndirty = 0;
471 for (; ext < amp->am_nextents; ext++) {
472 if (bit_test(amp->am_memmap, ext)) {
473 amp->am_memtab[ext] = ext2reqs(amp, ext);
474 amp->am_ndirty++;
483 activemap_merge(struct activemap *amp, const unsigned char *buf, size_t size)
488 PJDLOG_ASSERT(amp->am_magic == ACTIVEMAP_MAGIC);
489 PJDLOG_ASSERT(size >= amp->am_mapsize);
491 bit_ffs(remmap, amp->am_nextents, &ext);
501 for (; ext < amp->am_nextents; ext++) {
503 if (bit_test(amp->am_syncmap, ext))
508 bit_set(amp->am_syncmap, ext);
509 bit_set(amp->am_memmap, ext);
510 bit_set(amp->am_diskmap, ext);
511 if (amp->am_memtab[ext] == 0)
512 amp->am_ndirty++;
513 amp->am_memtab[ext] = ext2reqs(amp, ext);
518 activemap_sync_rewind(amp);
525 activemap_bitmap(struct activemap *amp, size_t *sizep)
528 PJDLOG_ASSERT(amp->am_magic == ACTIVEMAP_MAGIC);
531 *sizep = amp->am_diskmapsize;
532 memcpy(amp->am_diskmap, amp->am_memmap, amp->am_mapsize);
533 keepdirty_fill(amp);
534 return ((const unsigned char *)amp->am_diskmap);
561 activemap_sync_rewind(struct activemap *amp)
565 PJDLOG_ASSERT(amp->am_magic == ACTIVEMAP_MAGIC);
567 bit_ffs(amp->am_syncmap, amp->am_nextents, &ext);
570 amp->am_syncoff = -2;
576 amp->am_syncoff = -1;
583 activemap_sync_offset(struct activemap *amp, off_t *lengthp, int *syncextp)
588 PJDLOG_ASSERT(amp->am_magic == ACTIVEMAP_MAGIC);
594 if (amp->am_syncoff == -2)
597 if (amp->am_syncoff >= 0 &&
598 (amp->am_syncoff + MAXPHYS >= amp->am_mediasize ||
599 off2ext(amp, amp->am_syncoff) !=
600 off2ext(amp, amp->am_syncoff + MAXPHYS))) {
604 ext = off2ext(amp, amp->am_syncoff);
605 bit_clear(amp->am_syncmap, ext);
607 amp->am_syncoff = -1;
610 if (amp->am_syncoff == -1) {
614 bit_ffs(amp->am_syncmap, amp->am_nextents, &ext);
616 amp->am_syncoff = -2;
619 amp->am_syncoff = ext2off(amp, ext);
624 amp->am_syncoff += MAXPHYS;
625 if (amp->am_syncoff >= amp->am_mediasize) {
626 amp->am_syncoff = -2;
631 syncoff = amp->am_syncoff;
632 left = ext2off(amp, off2ext(amp, syncoff)) +
633 amp->am_extentsize - syncoff;
634 if (syncoff + left > amp->am_mediasize)
635 left = amp->am_mediasize - syncoff;
640 PJDLOG_ASSERT(syncoff >= 0 && syncoff < amp->am_mediasize);
642 syncoff + left <= amp->am_mediasize);
653 activemap_need_sync(struct activemap *amp, off_t offset, off_t length)
659 PJDLOG_ASSERT(amp->am_magic == ACTIVEMAP_MAGIC);
664 for (ext = off2ext(amp, offset); ext <= off2ext(amp, end); ext++) {
665 if (bit_test(amp->am_syncmap, ext)) {
667 PJDLOG_ASSERT(bit_test(amp->am_memmap, ext));
670 bit_set(amp->am_syncmap, ext);
671 if (!bit_test(amp->am_memmap, ext)) {
672 bit_set(amp->am_memmap, ext);
673 amp->am_ndirty++;
675 amp->am_memtab[ext] += ext2reqs(amp, ext);
683 activemap_dump(const struct activemap *amp)
688 for (bit = 0; bit < amp->am_nextents; bit++)
689 printf("%d", bit_test(amp->am_memmap, bit) ? 1 : 0);
692 for (bit = 0; bit < amp->am_nextents; bit++)
693 printf("%d", bit_test(amp->am_diskmap, bit) ? 1 : 0);
696 for (bit = 0; bit < amp->am_nextents; bit++)
697 printf("%d", bit_test(amp->am_syncmap, bit) ? 1 : 0);