sftp: Fix ENOSPC check

We now check for space that is not reserved for the root user on the
remote, and the check is no longer in a defer block because it wouldn't
fire. Some change in the surrounding code may have led the deferred
function to capture the wrong err variable.

Fixes #3336.
This commit is contained in:
greatroar 2022-12-07 09:13:19 +01:00
parent 57d8eedb88
commit 62520bb7b4

View file

@ -354,14 +354,13 @@ func (r *SFTP) Save(ctx context.Context, h restic.Handle, rd restic.RewindReader
debug.Log("sftp: failed to remove broken file %v: %v",
f.Name(), rmErr)
}
err = r.checkNoSpace(dirname, rd.Length(), err)
}()
// save data, make sure to use the optimized sftp upload method
wbytes, err := f.ReadFrom(rd)
if err != nil {
_ = f.Close()
err = r.checkNoSpace(dirname, rd.Length(), err)
return errors.Wrap(err, "Write")
}
@ -403,7 +402,7 @@ func (r *SFTP) checkNoSpace(dir string, size int64, origErr error) error {
debug.Log("sftp: StatVFS returned %v", err)
return origErr
}
if fsinfo.Favail == 0 || fsinfo.FreeSpace() < uint64(size) {
if fsinfo.Favail == 0 || fsinfo.Frsize*fsinfo.Bavail < uint64(size) {
err := errors.New("sftp: no space left on device")
return backoff.Permanent(err)
}