code = afs_dir_GetVerifiedBlob(tdc, dirpos, &entry);
if (code) {
- afs_warn("Corrupt directory (inode %lx, dirpos %d)",
- (unsigned long)&tdc->f.inode, dirpos);
+ if (!(avc->f.states & CCorrupt)) {
+ struct cell *tc = afs_GetCellStale(avc->f.fid.Cell, READ_LOCK);
+ afs_warn("Corrupt directory (%d.%d.%d.%d [%s] @%lx, pos %d)",
+ avc->f.fid.Cell, avc->f.fid.Fid.Volume,
+ avc->f.fid.Fid.Vnode, avc->f.fid.Fid.Unique,
+ tc ? tc->cellName : "",
+ (unsigned long)&tdc->f.inode, dirpos);
+ if (tc)
+ afs_PutCell(tc, READ_LOCK);
+ UpgradeSToWLock(&avc->lock, 814);
+ avc->f.states |= CCorrupt;
+ }
code = -ENOENT;
goto unlock_out;
}
#endif
#define CCreating 0x00400000 /* avoid needless store after open truncate */
#define CPageHog 0x00800000 /* AIX - dumping large cores is a page hog. */
+#define CCorrupt 0x01000000 /* corrupt dir already reported */
#define CDCLock 0x02000000 /* Vnode lock held over call to GetDownD */
#define CBulkFetching 0x04000000 /* stats are being fetched by bulk stat */
#define CExtendedFile 0x08000000 /* extended file via ftruncate call. */