diff options
| -rw-r--r-- | main_test.go | 8 | ||||
| -rw-r--r-- | pathfs_frontend/file.go | 13 | 
2 files changed, 11 insertions, 10 deletions
| diff --git a/main_test.go b/main_test.go index de433c7..16b9619 100644 --- a/main_test.go +++ b/main_test.go @@ -127,22 +127,22 @@ func TestTruncate(t *testing.T) {  	// Grow to two blocks  	file.Truncate(7000)  	if md5fn(fn) != "95d4ec7038e3e4fdbd5f15c34c3f0b34" { -		t.Fail() +		t.Errorf("Fail 7000")  	}  	// Shrink - needs RMW  	file.Truncate(6999)  	if md5fn(fn) != "35fd15873ec6c35380064a41b9b9683b" { -		t.Fail() +		t.Errorf("Fail 6999")  	}  	// Shrink to one partial block  	file.Truncate(465)  	if md5fn(fn) != "a1534d6e98a6b21386456a8f66c55260" { -		t.Fail() +		t.Errorf("Fail 465")  	}  	// Grow to exactly one block  	file.Truncate(4096)  	if md5fn(fn) != "620f0b67a91f7f74151bc5be745b7110" { -		t.Fail() +		t.Errorf("Fail 4096")  	}  } diff --git a/pathfs_frontend/file.go b/pathfs_frontend/file.go index b328b61..697d58d 100644 --- a/pathfs_frontend/file.go +++ b/pathfs_frontend/file.go @@ -270,29 +270,30 @@ func (f *file) Truncate(newSize uint64) fuse.Status {  			}  		}  		return fuse.OK -		// File shrinks  	} else { +		// File shrinks  		blockNo := f.cfs.BlockNoPlainOff(newSize) -		lastBlockOff := blockNo * f.cfs.CipherBS() -		lastBlockLen := newSize - blockNo * f.cfs.PlainBS() +		cipherOff := blockNo * f.cfs.CipherBS() +		plainOff := blockNo * f.cfs.PlainBS() +		lastBlockLen := newSize - plainOff  		var data []byte  		if lastBlockLen > 0 {  			var status fuse.Status -			data, status = f.doRead(lastBlockOff, lastBlockLen) +			data, status = f.doRead(plainOff, lastBlockLen)  			if status != fuse.OK {  				cryptfs.Warn.Printf("shrink doRead returned error: %v", err)  				return status  			}  		}  		f.lock.Lock() -		err = syscall.Ftruncate(int(f.fd.Fd()), int64(lastBlockOff)) +		err = syscall.Ftruncate(int(f.fd.Fd()), int64(cipherOff))  		f.lock.Unlock()  		if err != nil {  			cryptfs.Warn.Printf("shrink Ftruncate returned error: %v", err)  			return fuse.ToStatus(err)  		}  		if lastBlockLen > 0 { -			_, status := f.doWrite(data, int64(lastBlockOff)) +			_, status := f.doWrite(data, int64(plainOff))  			return status  		}  		return fuse.OK | 
