# dict of inodes to collection entry
self._inodes = {}
- i = 1
+ i = llfuse.ROOT_INODE
self.root = Directory(i, i)
self._inodes[i] = self.root
# dict of inode to filehandle
self._filehandles = {}
- self._filehandles_lock = threading.Lock()
self._filehandles_counter = 1
def access(self, inode, mode, ctx):
else:
raise llfuse.FUSEError(errno.ENOENT)
- self._filehandles_lock.acquire()
- try:
- fh = self._filehandles_counter
- self._filehandles_counter += 1
- self._filehandles[fh] = FileHandle(fh, p)
- return fh
- finally:
- self._filehandles_lock.release()
+ if isinstance(p, Directory):
+ raise llfuse.FUSEError(errno.EISDIR)
+
+ fh = self._filehandles_counter
+ self._filehandles_counter += 1
+ self._filehandles[fh] = FileHandle(fh, p)
+ return fh
def read(self, fh, off, size):
- self._filehandles_lock.acquire()
- try:
- if fh in self._filehandles:
- handle = self._filehandles[fh]
- else:
- raise llfuse.FUSEError(errno.EBADF)
- finally:
- self._filehandles_lock.release()
-
- try:
- return handle.entry.reader.readfrom(off, size)
- except:
- raise llfuse.FUSEError(errno.EPIPE)
+ if fh in self._filehandles:
+ handle = self._filehandles[fh]
+ else:
+ raise llfuse.FUSEError(errno.EBADF)
+
+ with llfuse.lock_released:
+ try:
+ return handle.entry.reader.readfrom(off, size)
+ except:
+ raise llfuse.FUSEError(errno.EIO)
def release(self, fh):
- self._filehandles_lock.acquire()
- try:
- del self._filehandles[fh]
- finally:
- self._filehandles_lock.release()
+ del self._filehandles[fh]
def opendir(self, inode):
#print "opendir: inode", inode
else:
raise llfuse.FUSEError(errno.ENOENT)
- self._filehandles_lock.acquire()
- try:
- fh = self._filehandles_counter
- self._filehandles_counter += 1
- self._filehandles[fh] = FileHandle(fh, list(p.entries.items()))
- return fh
- finally:
- self._filehandles_lock.release()
+ if not isinstance(p, Directory):
+ raise llfuse.FUSEError(errno.ENOTDIR)
+
+ fh = self._filehandles_counter
+ self._filehandles_counter += 1
+ self._filehandles[fh] = FileHandle(fh, [('.', p), ('..', self._inodes[p.parent])] + list(p.entries.items()))
+ return fh
def readdir(self, fh, off):
#print "readdir: fh", fh, "off", off
- self._filehandles_lock.acquire()
- try:
- if fh in self._filehandles:
- handle = self._filehandles[fh]
- else:
- raise llfuse.FUSEError(errno.EBADF)
- finally:
- self._filehandles_lock.release()
+ if fh in self._filehandles:
+ handle = self._filehandles[fh]
+ else:
+ raise llfuse.FUSEError(errno.EBADF)
#print "handle.entry", handle.entry
e += 1
def releasedir(self, fh):
- self._filehandles_lock.acquire()
- try:
- del self._filehandles[fh]
- finally:
- self._filehandles_lock.release()
+ del self._filehandles[fh]
if __name__ == '__main__':
args = parser.parse_args()
# for testing only!
- manifest = open('/home/tetron/work/arvados/sdk/python/testdata/jlake_manifest').read()
+ manifest = open('/home/peter/work/arvados/sdk/python/testdata/jlake_manifest').read()
operations = Operations(arvados.CollectionReader(manifest))
#operations = Operations(arvados.CollectionReader(arvados.Keep.get(args.collection)))
- llfuse.init(operations, args.mountpoint, [ b'fsname=keepfuse' ])
+ llfuse.init(operations, args.mountpoint, [ b'fsname=keepfuse', 'debug' ])
try:
llfuse.main()