From b9c96ea703dcc84fcd8e3c051617c25579c4e4e1 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sat, 8 Oct 2022 16:25:54 -0600 Subject: mount: Allow ignoring file checksum errors --- lib/btrfs/io4_fs.go | 40 +++++++++++++++++++----------------- lib/btrfsprogs/btrfsinspect/mount.go | 12 ++++++----- 2 files changed, 28 insertions(+), 24 deletions(-) (limited to 'lib') diff --git a/lib/btrfs/io4_fs.go b/lib/btrfs/io4_fs.go index 9391820..ea81bc2 100644 --- a/lib/btrfs/io4_fs.go +++ b/lib/btrfs/io4_fs.go @@ -66,7 +66,8 @@ type Subvolume struct { Superblock() (*btrfstree.Superblock, error) ReadAt(p []byte, off btrfsvol.LogicalAddr) (int, error) } - TreeID btrfsprim.ObjID + TreeID btrfsprim.ObjID + NoChecksums bool rootOnce sync.Once rootVal btrfsitem.Root @@ -414,26 +415,27 @@ func (file *File) maybeShortReadAt(dat []byte, off int64) (int, error) { if err != nil { return 0, err } + if !file.SV.NoChecksums { + sumRun, err := LookupCSum(file.SV.FS, sb.ChecksumType, blockBeg) + if err != nil { + return 0, fmt.Errorf("checksum@%v: %w", blockBeg, err) + } + _expSum, ok := sumRun.SumForAddr(blockBeg) + if !ok { + panic(fmt.Errorf("run from LookupCSum(fs, typ, %v) did not contain %v: %#v", + blockBeg, blockBeg, sumRun)) + } + expSum := _expSum.ToFullSum() - sumRun, err := LookupCSum(file.SV.FS, sb.ChecksumType, blockBeg) - if err != nil { - return 0, fmt.Errorf("checksum@%v: %w", blockBeg, err) - } - _expSum, ok := sumRun.SumForAddr(blockBeg) - if !ok { - panic(fmt.Errorf("run from LookupCSum(fs, typ, %v) did not contain %v: %#v", - blockBeg, blockBeg, sumRun)) - } - expSum := _expSum.ToFullSum() - - actSum, err := sb.ChecksumType.Sum(block[:]) - if err != nil { - return 0, fmt.Errorf("checksum@%v: %w", blockBeg, err) - } + actSum, err := sb.ChecksumType.Sum(block[:]) + if err != nil { + return 0, fmt.Errorf("checksum@%v: %w", blockBeg, err) + } - if actSum != expSum { - return 0, fmt.Errorf("checksum@%v: actual sum %v != expected sum %v", - blockBeg, actSum, expSum) + if actSum != expSum { + return 0, fmt.Errorf("checksum@%v: actual sum %v != expected sum %v", + blockBeg, actSum, expSum) + } } return n, nil } diff --git a/lib/btrfsprogs/btrfsinspect/mount.go b/lib/btrfsprogs/btrfsinspect/mount.go index 6cf6317..2a0b232 100644 --- a/lib/btrfsprogs/btrfsinspect/mount.go +++ b/lib/btrfsprogs/btrfsinspect/mount.go @@ -30,7 +30,7 @@ import ( "git.lukeshu.com/btrfs-progs-ng/lib/slices" ) -func MountRO(ctx context.Context, fs *btrfs.FS, mountpoint string) error { +func MountRO(ctx context.Context, fs *btrfs.FS, mountpoint string, noChecksums bool) error { pvs := fs.LV.PhysicalVolumes() if len(pvs) < 1 { return errors.New("no devices") @@ -43,8 +43,9 @@ func MountRO(ctx context.Context, fs *btrfs.FS, mountpoint string) error { rootSubvol := &subvolume{ Subvolume: btrfs.Subvolume{ - FS: btrfsutil.NewBrokenTrees(ctx, fs), - TreeID: btrfsprim.FS_TREE_OBJECTID, + FS: btrfsutil.NewBrokenTrees(ctx, fs), + TreeID: btrfsprim.FS_TREE_OBJECTID, + NoChecksums: noChecksums, }, DeviceName: deviceName, Mountpoint: mountpoint, @@ -185,8 +186,9 @@ func (sv *subvolume) LoadDir(inode btrfsprim.ObjID) (val *btrfs.Dir, err error) sv.grp.Go(workerName, func(ctx context.Context) error { subSv := &subvolume{ Subvolume: btrfs.Subvolume{ - FS: sv.FS, - TreeID: entry.Location.ObjectID, + FS: sv.FS, + TreeID: entry.Location.ObjectID, + NoChecksums: sv.NoChecksums, }, DeviceName: sv.DeviceName, Mountpoint: filepath.Join(sv.Mountpoint, subMountpoint[1:]), -- cgit v1.2.3-2-g168b