The code which recovered from a modified directory situation did not check
for eof when re-caching the directory. This could cause it to loop forever if a directory was truncated.
This commit is contained in:
parent
138b38c068
commit
363880128c
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=24577
@ -34,7 +34,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)nfs_bio.c 8.9 (Berkeley) 3/30/95
|
||||
* $Id: nfs_bio.c,v 1.32 1997/02/22 09:42:35 peter Exp $
|
||||
* $Id: nfs_bio.c,v 1.33 1997/03/09 10:21:26 bde Exp $
|
||||
*/
|
||||
|
||||
|
||||
@ -293,6 +293,10 @@ nfs_bioread(vp, uio, ioflag, cred)
|
||||
break;
|
||||
case VDIR:
|
||||
nfsstats.biocache_readdirs++;
|
||||
if (np->n_direofoffset
|
||||
&& uio->uio_offset >= np->n_direofoffset) {
|
||||
return (0);
|
||||
}
|
||||
lbn = uio->uio_offset / NFS_DIRBLKSIZ;
|
||||
on = uio->uio_offset & (NFS_DIRBLKSIZ - 1);
|
||||
bp = nfs_getcacheblk(vp, lbn, NFS_DIRBLKSIZ, p);
|
||||
@ -315,6 +319,9 @@ nfs_bioread(vp, uio, ioflag, cred)
|
||||
* offset cookies.
|
||||
*/
|
||||
for (i = 0; i <= lbn && !error; i++) {
|
||||
if (np->n_direofoffset
|
||||
&& (i * NFS_DIRBLKSIZ) >= np->n_direofoffset)
|
||||
return (0);
|
||||
bp = nfs_getcacheblk(vp, i, NFS_DIRBLKSIZ, p);
|
||||
if (!bp)
|
||||
return (EINTR);
|
||||
|
@ -34,7 +34,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)nfs_bio.c 8.9 (Berkeley) 3/30/95
|
||||
* $Id: nfs_bio.c,v 1.32 1997/02/22 09:42:35 peter Exp $
|
||||
* $Id: nfs_bio.c,v 1.33 1997/03/09 10:21:26 bde Exp $
|
||||
*/
|
||||
|
||||
|
||||
@ -293,6 +293,10 @@ nfs_bioread(vp, uio, ioflag, cred)
|
||||
break;
|
||||
case VDIR:
|
||||
nfsstats.biocache_readdirs++;
|
||||
if (np->n_direofoffset
|
||||
&& uio->uio_offset >= np->n_direofoffset) {
|
||||
return (0);
|
||||
}
|
||||
lbn = uio->uio_offset / NFS_DIRBLKSIZ;
|
||||
on = uio->uio_offset & (NFS_DIRBLKSIZ - 1);
|
||||
bp = nfs_getcacheblk(vp, lbn, NFS_DIRBLKSIZ, p);
|
||||
@ -315,6 +319,9 @@ nfs_bioread(vp, uio, ioflag, cred)
|
||||
* offset cookies.
|
||||
*/
|
||||
for (i = 0; i <= lbn && !error; i++) {
|
||||
if (np->n_direofoffset
|
||||
&& (i * NFS_DIRBLKSIZ) >= np->n_direofoffset)
|
||||
return (0);
|
||||
bp = nfs_getcacheblk(vp, i, NFS_DIRBLKSIZ, p);
|
||||
if (!bp)
|
||||
return (EINTR);
|
||||
|
Loading…
Reference in New Issue
Block a user