fallocate the space needed for the file header beforehand
This makes sure writing to a file fails early if the underlying filesystem does not support fallocate. It also prevents partial header write due to ENOSPC.
This commit is contained in:
parent
edc289fb75
commit
56888d83dd
|
@ -22,6 +22,7 @@ type DirIVCache struct {
|
||||||
lock sync.RWMutex
|
lock sync.RWMutex
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// lookup - fetch entry for "dir" from the cache
|
||||||
func (c *DirIVCache) lookup(dir string) (bool, []byte, string) {
|
func (c *DirIVCache) lookup(dir string) (bool, []byte, string) {
|
||||||
c.lock.RLock()
|
c.lock.RLock()
|
||||||
defer c.lock.RUnlock()
|
defer c.lock.RUnlock()
|
||||||
|
@ -31,6 +32,7 @@ func (c *DirIVCache) lookup(dir string) (bool, []byte, string) {
|
||||||
return false, nil, ""
|
return false, nil, ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// store - write entry for "dir" into the caches
|
||||||
func (c *DirIVCache) store(dir string, iv []byte, translatedDir string) {
|
func (c *DirIVCache) store(dir string, iv []byte, translatedDir string) {
|
||||||
c.lock.Lock()
|
c.lock.Lock()
|
||||||
defer c.lock.Unlock()
|
defer c.lock.Unlock()
|
||||||
|
|
|
@ -93,7 +93,18 @@ func (f *file) readHeader() error {
|
||||||
func (f *file) createHeader() error {
|
func (f *file) createHeader() error {
|
||||||
h := cryptfs.RandomHeader()
|
h := cryptfs.RandomHeader()
|
||||||
buf := h.Pack()
|
buf := h.Pack()
|
||||||
_, err := f.fd.WriteAt(buf, 0)
|
|
||||||
|
// Prevent partially written (=corrupt) header by preallocating the space beforehand
|
||||||
|
f.fdLock.Lock()
|
||||||
|
defer f.fdLock.Unlock()
|
||||||
|
err := syscall.Fallocate(int(f.fd.Fd()), FALLOC_FL_KEEP_SIZE, 0, cryptfs.HEADER_LEN)
|
||||||
|
if err != nil {
|
||||||
|
cryptfs.Warn.Printf("createHeader: Fallocate failed: %s\n", err.Error())
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Actually write header
|
||||||
|
_, err = f.fd.WriteAt(buf, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue