From dbec05ab73b30f655021118e62bc94c547870472 Mon Sep 17 00:00:00 2001 From: Nikolaus Rath Date: Tue, 16 Feb 2016 10:28:16 -0800 Subject: [PATCH 1/2] Make python-llfuse 0.42 compatible. --HG-- extra : amend_source : 6004af01c4ee6f7ddf6f4138bfc9bbdf2a785eb2 --- borg/fuse.py | 38 +++++++++++++++++++++++++++----------- setup.py | 4 ++-- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/borg/fuse.py b/borg/fuse.py index c726a5633..64c1d4cec 100644 --- a/borg/fuse.py +++ b/borg/fuse.py @@ -8,12 +8,20 @@ import tempfile import time from .archive import Archive from .helpers import daemonize - +from distutils.version import LooseVersion import msgpack # Does this version of llfuse support ns precision? have_fuse_xtime_ns = hasattr(llfuse.EntryAttributes, 'st_mtime_ns') +fuse_version = LooseVersion(getattr(llfuse, '__version__', '0.1')) +if fuse_version >= '0.42': + def fuse_main(): + return llfuse.main(workers=1) +else: + def fuse_main(): + llfuse.main(single=True) + return None class ItemCache: def __init__(self): @@ -103,7 +111,7 @@ class FuseOperations(llfuse.Operations): self._inode_count += 1 return self._inode_count - def statfs(self): + def statfs(self, ctx=None): stat_ = llfuse.StatvfsData() stat_.f_bsize = 512 stat_.f_frsize = 512 @@ -128,7 +136,7 @@ class FuseOperations(llfuse.Operations): inode = self.contents[inode][segment] return inode - def getattr(self, inode): + def getattr(self, inode, ctx=None): item = self.get_item(inode) size = 0 dsize = 0 @@ -164,11 +172,11 @@ class FuseOperations(llfuse.Operations): entry.st_ctime = (item.get(b'ctime') or item[b'mtime']) / 1e9 return entry - def listxattr(self, inode): + def listxattr(self, inode, ctx=None): item = self.get_item(inode) return item.get(b'xattrs', {}).keys() - def getxattr(self, inode, name): + def getxattr(self, inode, name, ctx=None): item = self.get_item(inode) try: return item.get(b'xattrs', {})[name] @@ -181,7 +189,7 @@ class FuseOperations(llfuse.Operations): if archive: self.process_archive(archive, [os.fsencode(archive.name)]) - def lookup(self, parent_inode, name): + def lookup(self, parent_inode, name, ctx=None): self._load_pending_archive(parent_inode) if name == b'.': inode = parent_inode @@ -193,10 +201,10 @@ class FuseOperations(llfuse.Operations): raise llfuse.FUSEError(errno.ENOENT) return self.getattr(inode) - def open(self, inode, flags): + def open(self, inode, flags, ctx=None): return inode - def opendir(self, inode): + def opendir(self, inode, ctx=None): self._load_pending_archive(inode) return inode @@ -222,7 +230,7 @@ class FuseOperations(llfuse.Operations): for i, (name, inode) in enumerate(entries[off:], off): yield name, self.getattr(inode), i + 1 - def readlink(self, inode): + def readlink(self, inode, ctx=None): item = self.get_item(inode) return os.fsencode(item[b'source']) @@ -233,7 +241,15 @@ class FuseOperations(llfuse.Operations): llfuse.init(self, mountpoint, options) if not foreground: daemonize() + + # If the file system crashes, we do not want to umount because in that + # case the mountpoint suddenly appears to become empty. This can have + # nasty consequences, imagine the user has e.g. an active rsync mirror + # job - seeing the mountpoint empty, rsync would delete everything in the + # mirror. + umount = False try: - llfuse.main(single=True) + signal = fuse_main() + umount = (signal is None) # no crash and no signal -> umount request finally: - llfuse.close() + llfuse.close(umount) diff --git a/setup.py b/setup.py index d8545be25..c50afe7ea 100644 --- a/setup.py +++ b/setup.py @@ -24,8 +24,8 @@ install_requires = ['msgpack-python>=0.4.6', ] extras_require = { # llfuse 0.40 (tested, proven, ok), needs FUSE version >= 2.8.0 # llfuse 0.41 (tested shortly, looks ok), needs FUSE version >= 2.8.0 - # llfuse 0.42 (tested, does not work, incompatible api changes) - 'fuse': ['llfuse<0.42', ], + # llfuse 1.0 will break API + 'fuse': ['llfuse<1.0', ], } from setuptools import setup, Extension From 44c8a4af808f1c255c88fdbdc570838e569c3117 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Wed, 17 Feb 2016 01:05:04 +0100 Subject: [PATCH 2/2] fix pep8 failures --- borg/fuse.py | 3 ++- setup.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/borg/fuse.py b/borg/fuse.py index 64c1d4cec..366039441 100644 --- a/borg/fuse.py +++ b/borg/fuse.py @@ -23,6 +23,7 @@ else: llfuse.main(single=True) return None + class ItemCache: def __init__(self): self.fd = tempfile.TemporaryFile(prefix='borg-tmp') @@ -250,6 +251,6 @@ class FuseOperations(llfuse.Operations): umount = False try: signal = fuse_main() - umount = (signal is None) # no crash and no signal -> umount request + umount = (signal is None) # no crash and no signal -> umount request finally: llfuse.close(umount) diff --git a/setup.py b/setup.py index c50afe7ea..9730608f8 100644 --- a/setup.py +++ b/setup.py @@ -25,7 +25,7 @@ extras_require = { # llfuse 0.40 (tested, proven, ok), needs FUSE version >= 2.8.0 # llfuse 0.41 (tested shortly, looks ok), needs FUSE version >= 2.8.0 # llfuse 1.0 will break API - 'fuse': ['llfuse<1.0', ], + 'fuse': ['llfuse<1.0', ], } from setuptools import setup, Extension