645 goto cleanup;
646 }
647
648 if (pages == NULL) {
649 /*
650 * Need page_t list, really only need
651 * a pfn list so build one.
652 */
653 pfn_t *pfnp;
654 int pcnt = len >> PAGESHIFT;
655
656 if (off)
657 pcnt++;
658 if ((pfnp = kmem_alloc(pcnt * sizeof (pfnp),
659 KM_NOSLEEP)) == NULL) {
660 error = ENOMEM;
661 goto cleanup;
662 }
663 locked->uioa_ppp = (void **)pfnp;
664 locked->uioa_pfncnt = pcnt;
665 AS_LOCK_ENTER(as, &as->a_lock, RW_READER);
666 while (pcnt-- > 0) {
667 *pfnp++ = hat_getpfnum(as->a_hat, addr);
668 addr += PAGESIZE;
669 }
670 AS_LOCK_EXIT(as, &as->a_lock);
671 } else {
672 /* Have a page_t list, save it */
673 locked->uioa_ppp = (void **)pages;
674 locked->uioa_pfncnt = 0;
675 }
676 /* Save for as_pageunlock() in uioafini() */
677 locked->uioa_base = iov->iov_base;
678 locked->uioa_len = iov->iov_len;
679 locked++;
680
681 /* Next iovec_t */
682 iov++;
683 iovcnt--;
684 }
685 /* Initialize curret pointer into uioa_locked[] and it's uioa_ppp */
686 uioap->uioa_lcur = uioap->uioa_locked;
687 uioap->uioa_lppp = uioap->uioa_lcur->uioa_ppp;
688 return (0);
689
690 cleanup:
|
645 goto cleanup;
646 }
647
648 if (pages == NULL) {
649 /*
650 * Need page_t list, really only need
651 * a pfn list so build one.
652 */
653 pfn_t *pfnp;
654 int pcnt = len >> PAGESHIFT;
655
656 if (off)
657 pcnt++;
658 if ((pfnp = kmem_alloc(pcnt * sizeof (pfnp),
659 KM_NOSLEEP)) == NULL) {
660 error = ENOMEM;
661 goto cleanup;
662 }
663 locked->uioa_ppp = (void **)pfnp;
664 locked->uioa_pfncnt = pcnt;
665 AS_LOCK_ENTER(as, RW_READER);
666 while (pcnt-- > 0) {
667 *pfnp++ = hat_getpfnum(as->a_hat, addr);
668 addr += PAGESIZE;
669 }
670 AS_LOCK_EXIT(as);
671 } else {
672 /* Have a page_t list, save it */
673 locked->uioa_ppp = (void **)pages;
674 locked->uioa_pfncnt = 0;
675 }
676 /* Save for as_pageunlock() in uioafini() */
677 locked->uioa_base = iov->iov_base;
678 locked->uioa_len = iov->iov_len;
679 locked++;
680
681 /* Next iovec_t */
682 iov++;
683 iovcnt--;
684 }
685 /* Initialize curret pointer into uioa_locked[] and it's uioa_ppp */
686 uioap->uioa_lcur = uioap->uioa_locked;
687 uioap->uioa_lppp = uioap->uioa_lcur->uioa_ppp;
688 return (0);
689
690 cleanup:
|