Print this page
5382 pvn_getpages handles lengths <= PAGESIZE just fine

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/cachefs/cachefs_vnops.c
          +++ new/usr/src/uts/common/fs/cachefs/cachefs_vnops.c
↓ open down ↓ 12 lines elided ↑ open up ↑
  13   13   * When distributing Covered Code, include this CDDL HEADER in each
  14   14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  /*
  22   22   * Copyright (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
       23 + * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
  23   24   */
  24   25  
  25   26  #include <sys/param.h>
  26   27  #include <sys/types.h>
  27   28  #include <sys/systm.h>
  28   29  #include <sys/cred.h>
  29   30  #include <sys/proc.h>
  30   31  #include <sys/user.h>
  31   32  #include <sys/time.h>
  32   33  #include <sys/vnode.h>
↓ open down ↓ 7345 lines elided ↑ open up ↑
7378 7379                   * operation the local file size might not be extended yet.
7379 7380                   * In this case we want to be able to return pages of zeroes.
7380 7381                   */
7381 7382                  if ((u_offset_t)off + len >
7382 7383                      ((cp->c_size + PAGEOFFSET) & (offset_t)PAGEMASK)) {
7383 7384                          if (seg != segkmap) {
7384 7385                                  error = EFAULT;
7385 7386                                  break;
7386 7387                          }
7387 7388                  }
7388      -                if (len <= PAGESIZE)
7389      -                        error = cachefs_getapage(vp, (u_offset_t)off, len,
7390      -                            protp, pl, plsz, seg, addr, rw, cr);
7391      -                else
7392      -                        error = pvn_getpages(cachefs_getapage, vp,
7393      -                            (u_offset_t)off, len, protp, pl, plsz, seg, addr,
7394      -                            rw, cr);
     7389 +                error = pvn_getpages(cachefs_getapage, vp, (u_offset_t)off,
     7390 +                    len, protp, pl, plsz, seg, addr, rw, cr);
7395 7391                  if (error == 0)
7396 7392                          break;
7397 7393  
7398 7394                  if (((cp->c_flags & CN_NOCACHE) && (error == ENOSPC)) ||
7399 7395                      error == EAGAIN) {
7400 7396                          connected = 0;
7401 7397                          continue;
7402 7398                  }
7403 7399                  if (fscp->fs_cdconnected == CFS_CD_CONNECTED) {
7404 7400                          if (CFS_TIMEOUT(fscp, error)) {
7405 7401                                  cachefs_cd_release(fscp);
7406 7402                                  held = 0;
7407 7403                                  cachefs_cd_timedout(fscp);
7408 7404                                  connected = 0;
7409 7405                                  continue;
7410 7406                          }
7411 7407                  } else {
7412 7408                          if (CFS_TIMEOUT(fscp, error)) {
7413 7409                                  if (cachefs_cd_access_miss(fscp)) {
7414      -                                        if (len <= PAGESIZE)
7415      -                                                error = cachefs_getapage_back(
7416      -                                                    vp, (u_offset_t)off,
7417      -                                                    len, protp, pl,
7418      -                                                    plsz, seg, addr, rw, cr);
7419      -                                        else
7420      -                                                error = pvn_getpages(
7421      -                                                    cachefs_getapage_back, vp,
7422      -                                                    (u_offset_t)off, len,
7423      -                                                    protp, pl,
7424      -                                                    plsz, seg, addr, rw, cr);
     7410 +                                        error = pvn_getpages(
     7411 +                                            cachefs_getapage_back, vp,
     7412 +                                            (u_offset_t)off, len, protp, pl,
     7413 +                                            plsz, seg, addr, rw, cr);
7425 7414                                          if (!CFS_TIMEOUT(fscp, error) &&
7426 7415                                              (error != EAGAIN))
7427 7416                                                  break;
7428 7417                                          delay(5*hz);
7429 7418                                          connected = 0;
7430 7419                                          continue;
7431 7420                                  }
7432 7421                                  connected = 1;
7433 7422                                  continue;
7434 7423                          }
↓ open down ↓ 56 lines elided ↑ open up ↑
7491 7480          CFS_DPRINT_BACKFS_NFSV4(fscp,
7492 7481              ("cachefs_getpage_backfs_nfsv4: cnode %p, backvp %p\n",
7493 7482              cp, backvp));
7494 7483          error = VOP_GETPAGE(backvp, off, len, protp, pl, plsz, seg,
7495 7484              addr, rw, cr, NULL);
7496 7485  
7497 7486          return (error);
7498 7487  }
7499 7488  
7500 7489  /*
7501      - * Called from pvn_getpages or cachefs_getpage to get a particular page.
     7490 + * Called from pvn_getpages to get a particular page.
7502 7491   */
7503 7492  /*ARGSUSED*/
7504 7493  static int
7505 7494  cachefs_getapage(struct vnode *vp, u_offset_t off, size_t len, uint_t *protp,
7506 7495          struct page *pl[], size_t plsz, struct seg *seg, caddr_t addr,
7507 7496          enum seg_rw rw, cred_t *cr)
7508 7497  {
7509 7498          cnode_t *cp = VTOC(vp);
7510 7499          page_t **ppp, *pp = NULL;
7511 7500          fscache_t *fscp = C_TO_FSCACHE(cp);
↓ open down ↓ 2749 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX