Print this page
patch lower-case-segops


 123         if (pagesavail < (spgcnt_t)btopr(vp_len)) {
 124                 /*
 125                  * Don't have enough free memory for the
 126                  * max request, try sizing down vp request.
 127                  */
 128                 deltab = (ssize_t)(off - vp_off);
 129                 vp_len -= deltab;
 130                 vp_off += deltab;
 131                 if (pagesavail < btopr(vp_len)) {
 132                         /*
 133                          * Still not enough memory, just settle for
 134                          * pagesavail which is at least 1.
 135                          */
 136                         vp_len = ptob(pagesavail);
 137                 }
 138         }
 139 
 140         vp_end = vp_off + vp_len;
 141         ASSERT(off >= vp_off && off < vp_end);
 142 
 143         if (isra && SEGOP_KLUSTER(seg, addr, 0))
 144                 return ((page_t *)NULL);        /* segment driver says no */
 145 
 146         if ((plist = page_create_va(vp, off,
 147             PAGESIZE, PG_EXCL | PG_WAIT, seg, addr)) == NULL)
 148                 return ((page_t *)NULL);
 149 
 150         if (vp_len <= PAGESIZE || pvn_nofodklust) {
 151                 *offp = off;
 152                 *lenp = MIN(vp_len, PAGESIZE);
 153         } else {
 154                 /*
 155                  * Scan back from front by incrementing "deltab" and
 156                  * comparing "off" with "vp_off + deltab" to avoid
 157                  * "signed" versus "unsigned" conversion problems.
 158                  */
 159                 for (deltab = PAGESIZE; off >= vp_off + deltab;
 160                     deltab += PAGESIZE) {
 161                         /*
 162                          * Call back to the segment driver to verify that
 163                          * the klustering/read ahead operation makes sense.
 164                          */
 165                         if (SEGOP_KLUSTER(seg, addr, -deltab))
 166                                 break;          /* page not eligible */
 167                         if ((pp = page_create_va(vp, off - deltab,
 168                             PAGESIZE, PG_EXCL, seg, addr - deltab))
 169                             == NULL)
 170                                 break;          /* already have the page */
 171                         /*
 172                          * Add page to front of page list.
 173                          */
 174                         page_add(&plist, pp);
 175                 }
 176                 deltab -= PAGESIZE;
 177 
 178                 /* scan forward from front */
 179                 for (deltaf = PAGESIZE; off + deltaf < vp_end;
 180                     deltaf += PAGESIZE) {
 181                         /*
 182                          * Call back to the segment driver to verify that
 183                          * the klustering/read ahead operation makes sense.
 184                          */
 185                         if (SEGOP_KLUSTER(seg, addr, deltaf))
 186                                 break;          /* page not file extension */
 187                         if ((pp = page_create_va(vp, off + deltaf,
 188                             PAGESIZE, PG_EXCL, seg, addr + deltaf))
 189                             == NULL)
 190                                 break;          /* already have page */
 191 
 192                         /*
 193                          * Add page to end of page list.
 194                          */
 195                         page_add(&plist, pp);
 196                         plist = plist->p_next;
 197                 }
 198                 *offp = off = off - deltab;
 199                 *lenp = deltab + deltaf;
 200                 ASSERT(off >= vp_off);
 201 
 202                 /*
 203                  * If we ended up getting more than was actually
 204                  * requested, retract the returned length to only
 205                  * reflect what was requested.  This might happen




 123         if (pagesavail < (spgcnt_t)btopr(vp_len)) {
 124                 /*
 125                  * Don't have enough free memory for the
 126                  * max request, try sizing down vp request.
 127                  */
 128                 deltab = (ssize_t)(off - vp_off);
 129                 vp_len -= deltab;
 130                 vp_off += deltab;
 131                 if (pagesavail < btopr(vp_len)) {
 132                         /*
 133                          * Still not enough memory, just settle for
 134                          * pagesavail which is at least 1.
 135                          */
 136                         vp_len = ptob(pagesavail);
 137                 }
 138         }
 139 
 140         vp_end = vp_off + vp_len;
 141         ASSERT(off >= vp_off && off < vp_end);
 142 
 143         if (isra && segop_kluster(seg, addr, 0))
 144                 return ((page_t *)NULL);        /* segment driver says no */
 145 
 146         if ((plist = page_create_va(vp, off,
 147             PAGESIZE, PG_EXCL | PG_WAIT, seg, addr)) == NULL)
 148                 return ((page_t *)NULL);
 149 
 150         if (vp_len <= PAGESIZE || pvn_nofodklust) {
 151                 *offp = off;
 152                 *lenp = MIN(vp_len, PAGESIZE);
 153         } else {
 154                 /*
 155                  * Scan back from front by incrementing "deltab" and
 156                  * comparing "off" with "vp_off + deltab" to avoid
 157                  * "signed" versus "unsigned" conversion problems.
 158                  */
 159                 for (deltab = PAGESIZE; off >= vp_off + deltab;
 160                     deltab += PAGESIZE) {
 161                         /*
 162                          * Call back to the segment driver to verify that
 163                          * the klustering/read ahead operation makes sense.
 164                          */
 165                         if (segop_kluster(seg, addr, -deltab))
 166                                 break;          /* page not eligible */
 167                         if ((pp = page_create_va(vp, off - deltab,
 168                             PAGESIZE, PG_EXCL, seg, addr - deltab))
 169                             == NULL)
 170                                 break;          /* already have the page */
 171                         /*
 172                          * Add page to front of page list.
 173                          */
 174                         page_add(&plist, pp);
 175                 }
 176                 deltab -= PAGESIZE;
 177 
 178                 /* scan forward from front */
 179                 for (deltaf = PAGESIZE; off + deltaf < vp_end;
 180                     deltaf += PAGESIZE) {
 181                         /*
 182                          * Call back to the segment driver to verify that
 183                          * the klustering/read ahead operation makes sense.
 184                          */
 185                         if (segop_kluster(seg, addr, deltaf))
 186                                 break;          /* page not file extension */
 187                         if ((pp = page_create_va(vp, off + deltaf,
 188                             PAGESIZE, PG_EXCL, seg, addr + deltaf))
 189                             == NULL)
 190                                 break;          /* already have page */
 191 
 192                         /*
 193                          * Add page to end of page list.
 194                          */
 195                         page_add(&plist, pp);
 196                         plist = plist->p_next;
 197                 }
 198                 *offp = off = off - deltab;
 199                 *lenp = deltab + deltaf;
 200                 ASSERT(off >= vp_off);
 201 
 202                 /*
 203                  * If we ended up getting more than was actually
 204                  * requested, retract the returned length to only
 205                  * reflect what was requested.  This might happen