void disk_buf_free (struct buf *bp) { u_int datalen; u_int data, next; /* unpin pages */ if (bp->b_flags & B_SCSICMD) { struct scsicmd *scsicmd = (struct scsicmd *) bp->b_memaddr; data = (u_int) scsicmd->data_addr; datalen = scsicmd->datalen; free (scsicmd->scsi_cmd); free (scsicmd); } else { data = (u_int)bp->b_memaddr; datalen = bp->b_bcount; } while (datalen > 0) { if (bp->b_flags & B_BC_REQ) { ppage_unpin (kva2pp (data)); } else { struct Env *e; int r; e = env_id2env (bp->b_envid, &r); assert (e); /* XXX - what if an env with an outstanding request dies? */ ppage_unpin (&ppages[PGNO (*env_va2ptep (e, data))]); } /* go to start of next page of data */ next = (data & ~PGMASK) + NBPG; if (next - data >= datalen) break; assert (next > data); datalen -= next - data; data = next; } if (bp->b_resptr) { ppage_unpin (kva2pp ((u_int) bp->b_resptr)); } free (bp); }
static void *translate_address (uint uva, int align) { Pte *ptep; void *ptr = NULL; ptep = env_va2ptep (curenv, uva); if (ptep) { /* && (*ptep & bits) == bits) { */ ptr = (struct dinode *) (ptov (*ptep & ~PGMASK) + (uva % NBPG)); if ((align) && ((uint)ptr % align)) { ptr = NULL; } } if ((ptr == NULL) && (uva != 0)) { printf ("fsprot: translate_address: bad address supplied (%x, align %d)\n", uva, align); } return (ptr); }