fsck: rename "CorruptItems" channel to "MitigatedCorruptions"

Make it clear that this channel is only used to report corruptions
that are transparently mitigated and do not return an error to
the user.
This commit is contained in:
Jakob Unterwurzacher 2018-07-01 15:48:53 +02:00
parent 283184dd5a
commit 1a18d8e609
5 changed files with 24 additions and 16 deletions

View File

@ -38,7 +38,7 @@ func (ck *fsckObj) dir(path string) {
go func() {
for {
select {
case item := <-ck.fs.CorruptItems:
case item := <-ck.fs.MitigatedCorruptions:
fmt.Printf("fsck: corrupt entry in dir %q: %q\n", path, item)
ck.markCorrupt(filepath.Join(path, item))
case <-done:
@ -102,7 +102,7 @@ func (ck *fsckObj) file(path string) {
go func() {
for {
select {
case item := <-ck.fs.CorruptItems:
case item := <-ck.fs.MitigatedCorruptions:
fmt.Printf("fsck: corrupt file %q (inode %s)\n", path, item)
ck.markCorrupt(path)
case <-done:
@ -132,7 +132,7 @@ func (ck *fsckObj) xattrs(path string) {
go func() {
for {
select {
case item := <-ck.fs.CorruptItems:
case item := <-ck.fs.MitigatedCorruptions:
fmt.Printf("fsck: corrupt xattr name on file %q: %q\n", path, item)
ck.markCorrupt(path + " xattr:" + item)
case <-done:
@ -164,7 +164,7 @@ func fsck(args *argContainer) {
args.allow_other = false
pfs, wipeKeys := initFuseFrontend(args)
fs := pfs.(*fusefrontend.FS)
fs.CorruptItems = make(chan string)
fs.MitigatedCorruptions = make(chan string)
ck := fsckObj{
fs: fs,
}

View File

@ -100,7 +100,7 @@ func (f *file) readFileID() ([]byte, error) {
if err == io.EOF && n != 0 {
tlog.Warn.Printf("readFileID %d: incomplete file, got %d instead of %d bytes",
f.qIno.Ino, n, readLen)
f.fs.reportCorruptItem(fmt.Sprint(f.qIno.Ino))
f.fs.reportMitigatedCorruption(fmt.Sprint(f.qIno.Ino))
}
return nil, err
}

View File

@ -38,11 +38,15 @@ type FS struct {
// This lock is used by openWriteOnlyFile() to block concurrent opens while
// it relaxes the permissions on a file.
openWriteOnlyLock sync.RWMutex
// CorruptItems is filled with file or xattr names that have been
// skipped (ignored) because they were corrupt. This is used by fsck
// to inform the user.
// Use the reportCorruptItem() function to push an item.
CorruptItems chan string
// MitigatedCorruptions is used to report data corruption that is internally
// mitigated by ignoring the corrupt item. For example, when OpenDir() finds
// a corrupt filename, we still return the other valid filenames.
// The corruption is logged to syslog to inform the user, and in addition,
// the corrupt filename is logged to this channel via
// reportMitigatedCorruption().
// "gocryptfs -fsck" reads from the channel to also catch these transparently-
// mitigated corruptions.
MitigatedCorruptions chan string
}
var _ pathfs.FileSystem = &FS{} // Verify that interface is implemented.
@ -607,12 +611,16 @@ func (fs *FS) Access(path string, mode uint32, context *fuse.Context) (code fuse
return fuse.ToStatus(syscall.Access(cPath, mode))
}
func (fs *FS) reportCorruptItem(item string) {
if fs.CorruptItems == nil {
// reportMitigatedCorruption is used to report a corruption that was transparently
// mitigated and did not return an error to the user. Pass the name of the corrupt
// item (filename for OpenDir(), xattr name for ListXAttr() etc).
// See the MitigatedCorruptions channel for more info.
func (fs *FS) reportMitigatedCorruption(item string) {
if fs.MitigatedCorruptions == nil {
return
}
select {
case fs.CorruptItems <- item:
case fs.MitigatedCorruptions <- item:
case <-time.After(1 * time.Second):
tlog.Warn.Printf("BUG: reportCorruptItem: timeout")
//debug.PrintStack()

View File

@ -326,7 +326,7 @@ func (fs *FS) OpenDir(dirName string, context *fuse.Context) ([]fuse.DirEntry, f
if err != nil {
tlog.Warn.Printf("OpenDir %q: invalid entry %q: Could not read .name: %v",
cDirName, cName, err)
fs.reportCorruptItem(cName)
fs.reportMitigatedCorruption(cName)
errorCount++
continue
}
@ -339,7 +339,7 @@ func (fs *FS) OpenDir(dirName string, context *fuse.Context) ([]fuse.DirEntry, f
if err != nil {
tlog.Warn.Printf("OpenDir %q: invalid entry %q: %v",
cDirName, cName, err)
fs.reportCorruptItem(cName)
fs.reportMitigatedCorruption(cName)
if runtime.GOOS == "darwin" && cName == dsStoreName {
// MacOS creates lots of these files. Log the warning but don't
// increment errorCount - does not warrant returning EIO.

View File

@ -106,7 +106,7 @@ func (fs *FS) ListXAttr(path string, context *fuse.Context) ([]string, fuse.Stat
name, err := fs.decryptXattrName(curName)
if err != nil {
tlog.Warn.Printf("ListXAttr: invalid xattr name %q: %v", curName, err)
fs.reportCorruptItem(curName)
fs.reportMitigatedCorruption(curName)
continue
}
names = append(names, name)