|
@@ -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))
|
|
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)
|
|
logger.debug('mount data cache capacity: %d chunks', data_cache_capacity)
|
|
self.data_cache = LRUCache(capacity=data_cache_capacity, dispose=lambda _: None)
|
|
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:
|
|
if archive:
|
|
self.process_archive(archive)
|
|
self.process_archive(archive)
|
|
else:
|
|
else:
|
|
- # Create root inode
|
|
|
|
- self.parent[1] = self.allocate_inode()
|
|
|
|
- self.items[1] = self.default_dir
|
|
|
|
for archive_name in manifest.archives:
|
|
for archive_name in manifest.archives:
|
|
# Create archive placeholder inode
|
|
# 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.contents[1][os.fsencode(archive_name)] = archive_inode
|
|
self.pending_archives[archive_inode] = Archive(repository, key, manifest, archive_name)
|
|
self.pending_archives[archive_inode] = Archive(repository, key, manifest, archive_name)
|
|
|
|
|
|
@@ -106,6 +102,14 @@ class FuseOperations(llfuse.Operations):
|
|
finally:
|
|
finally:
|
|
llfuse.close(umount)
|
|
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=[]):
|
|
def process_archive(self, archive, prefix=[]):
|
|
"""Build fuse inode hierarchy from archive metadata
|
|
"""Build fuse inode hierarchy from archive metadata
|
|
"""
|
|
"""
|
|
@@ -129,11 +133,6 @@ class FuseOperations(llfuse.Operations):
|
|
num_segments = len(segments)
|
|
num_segments = len(segments)
|
|
parent = 1
|
|
parent = 1
|
|
for i, segment in enumerate(segments, 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?
|
|
# Leaf segment?
|
|
if i == num_segments:
|
|
if i == num_segments:
|
|
if b'source' in item and stat.S_ISREG(item[b'mode']):
|
|
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]:
|
|
elif segment in self.contents[parent]:
|
|
parent = self.contents[parent][segment]
|
|
parent = self.contents[parent][segment]
|
|
else:
|
|
else:
|
|
- inode = self.allocate_inode()
|
|
|
|
- self.items[inode] = self.default_dir
|
|
|
|
- self.parent[inode] = parent
|
|
|
|
|
|
+ inode = self._create_dir(parent)
|
|
if segment:
|
|
if segment:
|
|
self.contents[parent][segment] = inode
|
|
self.contents[parent][segment] = inode
|
|
parent = inode
|
|
parent = inode
|