From 63f015d05293cd853dbd44e5115e6b378644dfb6 Mon Sep 17 00:00:00 2001 From: Andrew Deason Date: Wed, 16 Jan 2019 23:44:58 -0600 Subject: [PATCH] LINUX: Propagate afs_linux_readdir BlobScan errors In afs_linux_readdir, if we detect an error code from BlobScan, currently we 'break' out of the current while() loop. But right after this loop, we reset 'code' to 0, ignoring the error we just got from BlobScan, and acting like we just reached the end of the directory. This means that if BlobScan could not process the given directory at all, we'll just fail to iterate through some of the entries in the given directory, and not report an error. To fix this, process errors from BlobScan like we do for afs_dir_GetVerifiedBlob, and return an error code and log a message about the corrupted dir. Change-Id: I8bd628624ffc04fc55fd6a0820c73018bd9e4a18 Reviewed-on: https://gerrit.openafs.org/13430 Tested-by: BuildBot Reviewed-by: Benjamin Kaduk --- src/afs/LINUX/osi_vnodeops.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c index 966e98a9d5..ee8b41474e 100644 --- a/src/afs/LINUX/osi_vnodeops.c +++ b/src/afs/LINUX/osi_vnodeops.c @@ -401,11 +401,17 @@ afs_linux_readdir(struct file *fp, void *dirbuf, filldir_t filldir) offset = (int) fp->f_pos; #endif while (1) { + dirpos = 0; code = BlobScan(tdc, offset, &dirpos); - if (code || !dirpos) - break; + if (code == 0 && dirpos == 0) { + /* We've reached EOF of the dir blob, so we can stop looking for + * entries. */ + break; + } - code = afs_dir_GetVerifiedBlob(tdc, dirpos, &entry); + if (code == 0) { + code = afs_dir_GetVerifiedBlob(tdc, dirpos, &entry); + } if (code) { if (!(avc->f.states & CCorrupt)) { struct cell *tc = afs_GetCellStale(avc->f.fid.Cell, READ_LOCK);