mirror of https://github.com/borgbackup/borg.git
FUSE: always create a root dir, fixes #1125
also: refactor / deduplicate directory creation
This commit is contained in:
parent
e06b89abb3
commit
32320c2f9f
25
borg/fuse.py
25
borg/fuse.py
|
@ -66,17 +66,13 @@ class FuseOperations(llfuse.Operations):
|
|||
data_cache_capacity = int(os.environ.get('BORG_MOUNT_DATA_CACHE_ENTRIES', os.cpu_count() or 1))
|
||||
logger.debug('mount data cache capacity: %d chunks', data_cache_capacity)
|
||||
self.data_cache = LRUCache(capacity=data_cache_capacity, dispose=lambda _: None)
|
||||
self._create_dir(parent=1) # first call, create root dir (inode == 1)
|
||||
if archive:
|
||||
self.process_archive(archive)
|
||||
else:
|
||||
# Create root inode
|
||||
self.parent[1] = self.allocate_inode()
|
||||
self.items[1] = self.default_dir
|
||||
for archive_name in manifest.archives:
|
||||
# Create archive placeholder inode
|
||||
archive_inode = self.allocate_inode()
|
||||
self.items[archive_inode] = self.default_dir
|
||||
self.parent[archive_inode] = 1
|
||||
archive_inode = self._create_dir(parent=1)
|
||||
self.contents[1][os.fsencode(archive_name)] = archive_inode
|
||||
self.pending_archives[archive_inode] = Archive(repository, key, manifest, archive_name)
|
||||
|
||||
|
@ -106,6 +102,14 @@ class FuseOperations(llfuse.Operations):
|
|||
finally:
|
||||
llfuse.close(umount)
|
||||
|
||||
def _create_dir(self, parent):
|
||||
"""Create directory
|
||||
"""
|
||||
ino = self.allocate_inode()
|
||||
self.items[ino] = self.default_dir
|
||||
self.parent[ino] = parent
|
||||
return ino
|
||||
|
||||
def process_archive(self, archive, prefix=[]):
|
||||
"""Build fuse inode hierarchy from archive metadata
|
||||
"""
|
||||
|
@ -129,11 +133,6 @@ class FuseOperations(llfuse.Operations):
|
|||
num_segments = len(segments)
|
||||
parent = 1
|
||||
for i, segment in enumerate(segments, 1):
|
||||
# Insert a default root inode if needed
|
||||
if self._inode_count == 0 and segment:
|
||||
archive_inode = self.allocate_inode()
|
||||
self.items[archive_inode] = self.default_dir
|
||||
self.parent[archive_inode] = parent
|
||||
# Leaf segment?
|
||||
if i == num_segments:
|
||||
if b'source' in item and stat.S_ISREG(item[b'mode']):
|
||||
|
@ -149,9 +148,7 @@ class FuseOperations(llfuse.Operations):
|
|||
elif segment in self.contents[parent]:
|
||||
parent = self.contents[parent][segment]
|
||||
else:
|
||||
inode = self.allocate_inode()
|
||||
self.items[inode] = self.default_dir
|
||||
self.parent[inode] = parent
|
||||
inode = self._create_dir(parent)
|
||||
if segment:
|
||||
self.contents[parent][segment] = inode
|
||||
parent = inode
|
||||
|
|
Loading…
Reference in New Issue