On Wed, Mar 25, 2009 at 07:07:07PM +0530, Krishna Kumar wrote: > @@ -1337,12 +1321,30 @@ nfsd_read(struct svc_rqst *rqstp, struct > goto out; > err = nfsd_vfs_read(rqstp, fhp, file, offset, vec, vlen, count); > } else { > - err = nfsd_open(rqstp, fhp, S_IFREG, NFSD_MAY_READ, &file); > - if (err) > - goto out; > - err = nfsd_vfs_read(rqstp, fhp, file, offset, vec, vlen, count); > - nfsd_close(file); > + struct fhcache *fh; > + > + /* Check if this fh is cached */ > + fh = nfsd_get_fhcache(fhp->fh_handle.fh_auth[3]); How do you know fh_auth[3] is sufficient to identify the file reliably? This looks very fragile to me. If the goal is to bypass rqst_exp_find(), exportfs_decode_fh() and friends--that makes me nervous. We should figure out how to make those lookups faster instead. Or at the very least, make sure we're keying on the entire filehandle instead of just part of it. --b. > + if (fh && fh->p_filp) { > + /* Got cached values */ > + file = fh->p_filp; > + fhp->fh_dentry = file->f_dentry; > + fhp->fh_export = fh->p_exp; > + err = fh_verify(rqstp, fhp, S_IFREG, NFSD_MAY_READ); > + } else { > + /* Nothing in cache */ > + err = nfsd_open(rqstp, fhp, S_IFREG, NFSD_MAY_READ, > + &file); > + } > + > + if (!err) > + err = nfsd_vfs_read(rqstp, fhp, file, offset, vec, vlen, > + count); > + > + /* Update cached values if required, and clean up */ > + fh_cache_upd(fh, file, fhp->fh_export); > } > + > out: > return err; > } -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html