Print this page
patch as-lock-macro-simplification


 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: