pytagsfs team mailing list archive
-
pytagsfs team
-
Mailing list archive
-
Message #00076
Re: xattr metastore: an initial attempt
On Sat, Jun 04, 2011 at 04:20:19PM -0400, Forest Bond wrote:
> Hi Raph,
>
> On Thu, Jun 02, 2011 at 05:43:21PM +0200, Raphaël Droz wrote:
> > You'll find attached an initial attempt to create an xattr metastore for
> > pytagsfs.
> > It's far from perfect but basically working.
> > I'm really in need of advices about the _right_ way to implement bases
> > classes from pytagsfs.
>
> You are on the right track.
>
> The pytags utility was a bit of a hack and was written specifically for mutagen
> rather than as a general front end to the pytagsfs MetaStore API. We have
> changed this, so now it supports arbitrary metastores.
you're right, pytags now works and XattrMetaStore is cleaner !
>
> The MetaStore API itself consists only of the "get" and "set" methods. You do
> not need to define "extract", "inject, "tags_class", etc. Those were
> implementation details of the mutagen module that the pytags utility happened to
> use. I think you can simplify your module now by dropping them. You should
> also be able to drop SimpleXAttrFile unless you have a reason to keep
> it.
I've dropped it but I have some problems which I do not know if a
SimpleXAttrFile class is the solution:
It's about the
> > I would also appreciate clarification about "cp -r" / "mv" support.
So:
$ listattr() { for i in *.avi; do for j in $(attr -ql $i); do echo "$i ($j = $(attr -q -g $j $i))"; done; done; }
$ listattr
Argentina_history.avi (subject = history)
Jaffa_Palestine.avi (subject = palestine,orient,history)
Nuclear_wastes.avi (subject = ecology)
# these files all use the 'subject' attribute to store multiple values
separated by commas.
PYTHONPATH=modules ./pytagsfs -ds \
-o metastores='pytagsfs.metastore.xattr_.XattrMetaStore;pytagsfs.metastore.path.PathMetaStore' \
-o format='/%{subject}/%f' ~/tagsfs/sources ~/tagsfs/mnt/
[ a bit cleaner xattr_.py attached ]
$ tree mnt/
mnt/
├── ecology
│ └── Nuclear_wastes.avi
├── history
│ ├── Argentina_history.avi
│ └── Jaffa_Palestine.avi
├── orient
│ └── Jaffa_Palestine.avi
└── palestine
└── Jaffa_Palestine.avi
* I can rename a tag (= directory):
$ mv history economy
* I can change (= move) the tag of a file:
$ mv palestine/Jaffa_Palestine.avi ecology/
* I can create a new tag and affect a file to it (if it replace another one):
$ mkdir palestine && mv ecology/Jaffa_Palestine.avi palestine/
[ please note here that it would be nice if an empty directory (unused
tag) stayed in the tree until the umount so it can be easily reused ]
$ I can NOT add a new tag to a file (explanation below on how it is
different than above):
$ mkdir nuclear && cp ecology/Nuclear_wastes.avi nuclear/
cp: cannot create regular file `nuclear/Nuclear_wastes.avi': Function not implemented
[ attached as attempt1.log ]
Consequence is that the following obviously does NOT work:
$ mkdir waste && cp -a ecology waste
`ecology' -> `waste'
`ecology/Nuclear_wastes.avi' -> `waste/Nuclear_wastes.avi'
cp: cannot create regular file `waste/Nuclear_wastes.avi': Function not implemented
cp: failed to preserve ownership for `waste': Bad address
# Also note that the same also applies with a "simple" cp -r.
* I can not remove a tag by removing a file:
$ rm economy/Argentina_history.avi
rm: cannot remove `economy/Argentina_history.avi': Function not implemented
[ attached as attempt2.log ]
I think that the impossibility to unlink is the root of the copy
problems. Any hints about this ?
Raphaël
# coding: utf-8
# Copyright (c) 2011 Raphaël Droz.
# This file is part of the pytagsfs software package.
#
# pytagsfs is free software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License version 2 as published by the Free
# Software Foundation.
#
# A copy of the license has been included in the COPYING file.
import os.path
# for debugging purpose
import inspect, traceback, sys, re
import xattr
from pytagsfs.metastore import MetaStore
# todo: implement this ?
from pytagsfs.values import Values
# TODO:
# $ mv mnt/tag1/filename.avi mnt/tag2/filename2.avi
# should fail as 'filename.avi' will be kept (tag will change though)
# TODO: the following fails
# $ mkdir mnt/tag2
# $ cp mnt/tag1/file.avi mnt/tag2/
# as is:
# $ cp -a mnt/tag1 mnt/tag2
def __function__ ():
caller = inspect.stack()[1]
return caller[3]
# TODO:
# sync or async...
# with update() we have to (re)set all tags
# (and remove obsolete ones) !
# TODO:
# two consecutive --add for the same key failed
# TODO: inherit from Values if possible !
class SimpleXAttrFile(dict):
# dictionary containing all attributes and their value
d = {}
# filename
f = None
def __init__(self,filename):
print "IMPL:", __function__()
# test the file is regular/exists/...
if not os.path.exists(filename):
print "failed to find", filename
# todo: how to return (raise ?) a failure here ?
self.d = None
return None
# todo: test the filesystem supports xattr
# or, todo: simply test pyxattr supports it
self.f = filename
self.d = dict ( xattr.get_all(filename, namespace=xattr.NS_USER) )
print "__init__ => d = ", self.d
# needed when one extends the dict class
self.update(self.d.keys(), self.d.values())
# needed (print SimpleXAttrFile)
def __repr__(self):
return repr(self.d)
# used by pytags --add
def get(self, key, failobj=None):
print "IMPL:", __function__()
if key not in self.d:
return failobj
return self.d[key]
# needed (by, eg, update and others)
def __setitem__(self, key, value):
print "IMPL:", __function__()
self.d[key] = value
return
# needed by pytags --remove
def __delitem__(self, key):
print "IMPL:", __function__()
self.d.pop(key)
# needed when initialization happens in __init__
def update(self, args, kwargs):
print "IMPL:", __function__()
for k, v in dict(zip(args, kwargs)).iteritems():
self.d[k] = v
# needed by ... pytags, why ?
def save(self):
print "IMPL:", __function__()
for k, v in self.d.iteritems():
# todo:
# with pytags --set, v = [ value ] so we need v[0]
# with pytags --add, v = value so we need v
print "save", k, "=", v
if isinstance(v, (list, tuple)):
xattr.set(self.f, k, v[0], namespace=xattr.NS_USER)
else:
xattr.set(self.f, k, v, namespace=xattr.NS_USER)
# needed by all *.items(), Values.from_flat_dict(), ... in the _XattrMetaStore class below
def items(self):
print "IMPL:", __function__()
return self.d.items()
# followings uneeded ?
def keys(self):
print "IMPL:", __function__()
return self.d.keys()
def values(self):
print "IMPL:", __function__()
return self.d.values()
def __getitem__(self, key):
print "IMPL:", __function__()
return self.d[key]
def iteritems(self):
print "IMPL:", __function__()
return self.d.iteritems()
def __iteritems__(self):
print "IMPL:", __function__()
return self.d.__iteritems__()
def viewitems(self):
print "IMPL:", __function__()
return self.d.viewitems()
def __contains__(self, key):
print "IMPL:", __function__()
return key in self.d
class XattrMetaStore(MetaStore):
# needed by pytagsfs --format
# called by sourcetreerep/__init__.py: add_source_file()
# through the DelegateMultiMetaStore:get() function
def get(self, path):
#traceback.print_stack()
# todo, how is it merged if one do, eg, attr -s extension -V X file.avi ?
d = dict ( xattr.get_all(path, namespace=xattr.NS_USER ) )
for k in d:
d[k] = d[k].split(',')
values = Values(d)
return values
# called by a move on the destination filesystem
def set(self, path, values):
print "IMPL:", self.__class__.__name__, __function__()
#print path
#print values
for k,v in values.iteritems():
# concatenate the elements in a string with ',' as separator
xattr.set(path, k, ','.join(v), namespace=xattr.NS_USER)
return values.keys()
# needed by pytags --format
#def extract(self, tags):
# needed: used by pytags --set
#def inject(cls, tags, values):
# PYTHONPATH=modules ./pytags --metastores=pytagsfs.metastore.xattr_.XattrMetaStore --set subject=eco ~/tagsfs/sources/Into_Eternity.avi
# how to set the title ?
# PYTHONPATH=modules ./pytags --metastores=pytagsfs.metastore.xattr_.XattrMetaStore --format='/%{path}/%{title}.%{extension}' ~/tagsfs/sources/Into_Eternity.avi
# pytagsfs.metastore.path.PathMetaStore is needed to "inherit" %f, %p and %e !
# (in the last position to override potential conflicting attributes from XattrMetaStore)
# PYTHONPATH=modules ./pytagsfs -ds -o metastores='pytagsfs.metastore.xattr_.XattrMetaStore;pytagsfs.metastore.path.PathMetaStore' -o format='/%{subject}/%f' ~/tagsfs/sources ~/tagsfs/mnt
# PYTHONPATH=modules ./pytagsfs -ds -o metastores='pytagsfs.metastore.maildir.MaildirMetaStore;pytagsfs.metastore.path.PathMetaStore' -o format='/%{maildir_tag}/%f' ~/tagsfs/sources/mail/cur/ ~/tagsfs/mnt/
# ===
# PYTHONPATH=modules ./pymailtagsfs -ds -o format='/%{maildir_tag}/%f' ~/tagsfs/sources/mail/cur/ ~/tagsfs/mnt/
# reset attr:
#for i in *.avi; do for j in $(attr -ql $i); do [[ $j != subject ]] && attr -r $j $i && continue; attr -g subject $i; done; done
#for i in *.avi; do for j in $(attr -ql $i); do echo "$i ($j = $(attr -q -g $j $i))"; done; done
$ cp ecology/Nuclear_wastes.avi nuclear/
unique: 970, opcode: GETATTR (3), nodeid: 1, insize: 56
getattr /
[13:36:09,700] getattr('/')
[13:36:09,700] getattr(...) -> Stat({'st_ctime': 1308655897.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 8, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308656053.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 970, success, outsize: 120
unique: 971, opcode: LOOKUP (1), nodeid: 1, insize: 48
LOOKUP /nuclear
getattr /nuclear
[13:36:09,701] getattr('/nuclear')
[13:36:09,702] getattr(...) -> Stat({'st_ctime': 1308655229.0, 'st_rdev': 0, 'st_mtime': 1308655229.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308655235.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
NODEID: 12
unique: 971, success, outsize: 144
unique: 972, opcode: GETATTR (3), nodeid: 12, insize: 56
getattr /nuclear
[13:36:09,703] getattr('/nuclear')
[13:36:09,703] getattr(...) -> Stat({'st_ctime': 1308655229.0, 'st_rdev': 0, 'st_mtime': 1308655229.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308655235.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 972, success, outsize: 120
unique: 973, opcode: GETATTR (3), nodeid: 1, insize: 56
getattr /
[13:36:09,705] getattr('/')
[13:36:09,706] getattr(...) -> Stat({'st_ctime': 1308655897.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 8, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308656053.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 973, success, outsize: 120
unique: 974, opcode: LOOKUP (1), nodeid: 1, insize: 48
LOOKUP /ecology
getattr /ecology
[13:36:09,707] getattr('/ecology')
[13:36:09,707] getattr(...) -> Stat({'st_ctime': 1308655273.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308655282.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
NODEID: 4
unique: 974, success, outsize: 144
unique: 975, opcode: GETATTR (3), nodeid: 4, insize: 56
getattr /ecology
[13:36:09,708] getattr('/ecology')
[13:36:09,709] getattr(...) -> Stat({'st_ctime': 1308655273.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308655282.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 975, success, outsize: 120
unique: 976, opcode: LOOKUP (1), nodeid: 4, insize: 59
LOOKUP /ecology/Nuclear_wastes.avi
getattr /ecology/Nuclear_wastes.avi
[13:36:09,710] getattr('/ecology/Nuclear_wastes.avi')
[13:36:09,710] getattr(...) -> Stat({'st_ctime': 1308655273.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 1, 'st_nlink': 1, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 5, 'st_atime': 1308655282.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 33188})
NODEID: 6
unique: 976, success, outsize: 144
unique: 977, opcode: GETATTR (3), nodeid: 6, insize: 56
getattr /ecology/Nuclear_wastes.avi
[13:36:09,711] getattr('/ecology/Nuclear_wastes.avi')
[13:36:09,711] getattr(...) -> Stat({'st_ctime': 1308655273.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 1, 'st_nlink': 1, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 5, 'st_atime': 1308655282.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 33188})
unique: 977, success, outsize: 120
unique: 978, opcode: GETATTR (3), nodeid: 1, insize: 56
getattr /
[13:36:09,712] getattr('/')
[13:36:09,713] getattr(...) -> Stat({'st_ctime': 1308655897.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 8, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308656053.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 978, success, outsize: 120
unique: 979, opcode: LOOKUP (1), nodeid: 1, insize: 48
LOOKUP /nuclear
getattr /nuclear
[13:36:09,713] getattr('/nuclear')
[13:36:09,714] getattr(...) -> Stat({'st_ctime': 1308655229.0, 'st_rdev': 0, 'st_mtime': 1308655229.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308655235.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
NODEID: 12
unique: 979, success, outsize: 144
unique: 980, opcode: GETATTR (3), nodeid: 12, insize: 56
getattr /nuclear
[13:36:09,715] getattr('/nuclear')
[13:36:09,715] getattr(...) -> Stat({'st_ctime': 1308655229.0, 'st_rdev': 0, 'st_mtime': 1308655229.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308655235.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 980, success, outsize: 120
unique: 981, opcode: LOOKUP (1), nodeid: 12, insize: 59
LOOKUP /nuclear/Nuclear_wastes.avi
getattr /nuclear/Nuclear_wastes.avi
[13:36:09,716] getattr('/nuclear/Nuclear_wastes.avi')
[13:36:09,717] getattr(...) -> -2
unique: 981, error: -2 (No such file or directory), outsize: 16
unique: 982, opcode: GETATTR (3), nodeid: 1, insize: 56
getattr /
[13:36:09,718] getattr('/')
[13:36:09,718] getattr(...) -> Stat({'st_ctime': 1308655897.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 8, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308656053.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 982, success, outsize: 120
unique: 983, opcode: LOOKUP (1), nodeid: 1, insize: 48
LOOKUP /ecology
getattr /ecology
[13:36:09,719] getattr('/ecology')
[13:36:09,719] getattr(...) -> Stat({'st_ctime': 1308655273.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308655282.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
NODEID: 4
unique: 983, success, outsize: 144
unique: 984, opcode: GETATTR (3), nodeid: 4, insize: 56
getattr /ecology
[13:36:09,720] getattr('/ecology')
[13:36:09,721] getattr(...) -> Stat({'st_ctime': 1308655273.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308655282.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 984, success, outsize: 120
unique: 985, opcode: LOOKUP (1), nodeid: 4, insize: 59
LOOKUP /ecology/Nuclear_wastes.avi
getattr /ecology/Nuclear_wastes.avi
[13:36:09,722] getattr('/ecology/Nuclear_wastes.avi')
[13:36:09,722] getattr(...) -> Stat({'st_ctime': 1308655273.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 1, 'st_nlink': 1, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 5, 'st_atime': 1308655282.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 33188})
NODEID: 6
unique: 985, success, outsize: 144
unique: 986, opcode: GETATTR (3), nodeid: 6, insize: 56
getattr /ecology/Nuclear_wastes.avi
[13:36:09,723] getattr('/ecology/Nuclear_wastes.avi')
[13:36:09,723] getattr(...) -> Stat({'st_ctime': 1308655273.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 1, 'st_nlink': 1, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 5, 'st_atime': 1308655282.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 33188})
unique: 986, success, outsize: 120
unique: 987, opcode: OPEN (14), nodeid: 6, insize: 48
open flags: 0x8000 /ecology/Nuclear_wastes.avi
[13:36:09,724] open('/ecology/Nuclear_wastes.avi', 32768)
[13:36:09,725] open(...) -> FileInfo({'fh': 0, 'keep_cache': None, 'keep': False, 'direct_io': False})
open[10771088] flags: 0x8000 /ecology/Nuclear_wastes.avi
unique: 987, success, outsize: 32
unique: 988, opcode: GETATTR (3), nodeid: 6, insize: 56
getattr /ecology/Nuclear_wastes.avi
[13:36:09,726] getattr('/ecology/Nuclear_wastes.avi')
[13:36:09,726] getattr(...) -> Stat({'st_ctime': 1308655273.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 1, 'st_nlink': 1, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 5, 'st_atime': 1308655282.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 33188})
unique: 988, success, outsize: 120
unique: 989, opcode: GETATTR (3), nodeid: 1, insize: 56
getattr /
[13:36:09,727] getattr('/')
[13:36:09,728] getattr(...) -> Stat({'st_ctime': 1308655897.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 8, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308656053.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 989, success, outsize: 120
unique: 990, opcode: LOOKUP (1), nodeid: 1, insize: 48
LOOKUP /nuclear
getattr /nuclear
[13:36:09,729] getattr('/nuclear')
[13:36:09,729] getattr(...) -> Stat({'st_ctime': 1308655229.0, 'st_rdev': 0, 'st_mtime': 1308655229.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308655235.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
NODEID: 12
unique: 990, success, outsize: 144
unique: 991, opcode: GETATTR (3), nodeid: 12, insize: 56
getattr /nuclear
[13:36:09,730] getattr('/nuclear')
[13:36:09,730] getattr(...) -> Stat({'st_ctime': 1308655229.0, 'st_rdev': 0, 'st_mtime': 1308655229.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308655235.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 991, success, outsize: 120
unique: 992, opcode: GETATTR (3), nodeid: 12, insize: 56
getattr /nuclear
[13:36:09,731] getattr('/nuclear')
[13:36:09,732] getattr(...) -> Stat({'st_ctime': 1308655229.0, 'st_rdev': 0, 'st_mtime': 1308655229.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308655235.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 992, success, outsize: 120
unique: 993, opcode: LOOKUP (1), nodeid: 12, insize: 59
LOOKUP /nuclear/Nuclear_wastes.avi
getattr /nuclear/Nuclear_wastes.avi
[13:36:09,732] getattr('/nuclear/Nuclear_wastes.avi')
[13:36:09,733] getattr(...) -> -2
unique: 993, error: -2 (No such file or directory), outsize: 16
unique: 994, opcode: GETATTR (3), nodeid: 12, insize: 56
getattr /nuclear
[13:36:09,734] getattr('/nuclear')
[13:36:09,734] getattr(...) -> Stat({'st_ctime': 1308655229.0, 'st_rdev': 0, 'st_mtime': 1308655229.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308655235.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 994, success, outsize: 120
unique: 995, opcode: MKNOD (8), nodeid: 12, insize: 75
create flags: 0xc1 /nuclear/Nuclear_wastes.avi 0100644 umask=0022
[13:36:09,735] create('/nuclear/Nuclear_wastes.avi', 193, 33188)
[13:36:09,735] create(...) -> -38
mknod /nuclear/Nuclear_wastes.avi 0100644 0x0 umask=0022
[13:36:09,736] mknod('/nuclear/Nuclear_wastes.avi', 33188, 0)
[13:36:09,736] mknod(...) -> -38
unique: 995, error: -38 (Function not implemented), outsize: 16
unique: 996, opcode: RELEASE (18), nodeid: 6, insize: 64
release[10771088] flags: 0x8000
[13:36:09,737] release('/ecology/Nuclear_wastes.avi', 32768, FileInfo({'fh': 0, 'keep_cache': None, 'keep': False, 'direct_io': False}))
[13:36:09,738] release(...) -> 0
unique: 996, success, outsize: 16
$ tree
.
├── economy
│ └── Argentina_history.avi
├── history
│ ├── Argentina_history.avi
│ └── Jaffa_Palestine.a
####
unique: 942, opcode: GETATTR (3), nodeid: 1, insize: 56
getattr /
[13:52:04,057] getattr('/')
[13:52:04,058] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 8, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 942, success, outsize: 120
unique: 943, opcode: LOOKUP (1), nodeid: 1, insize: 48
LOOKUP /economy
getattr /economy
[13:52:04,058] getattr('/economy')
[13:52:04,059] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
NODEID: 11
unique: 943, success, outsize: 144
unique: 944, opcode: GETATTR (3), nodeid: 11, insize: 56
getattr /economy
[13:52:04,060] getattr('/economy')
[13:52:04,061] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 944, success, outsize: 120
unique: 945, opcode: LOOKUP (1), nodeid: 11, insize: 62
LOOKUP /economy/Argentina_history.avi
getattr /economy/Argentina_history.avi
[13:52:04,061] getattr('/economy/Argentina_history.avi')
[13:52:04,062] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 1, 'st_nlink': 1, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 6, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 33188})
NODEID: 12
unique: 945, success, outsize: 144
unique: 946, opcode: GETATTR (3), nodeid: 12, insize: 56
getattr /economy/Argentina_history.avi
[13:52:04,063] getattr('/economy/Argentina_history.avi')
[13:52:04,064] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 1, 'st_nlink': 1, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 6, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 33188})
unique: 946, success, outsize: 120
unique: 947, opcode: GETATTR (3), nodeid: 1, insize: 56
getattr /
[13:52:04,065] getattr('/')
[13:52:04,065] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 8, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 947, success, outsize: 120
unique: 948, opcode: LOOKUP (1), nodeid: 1, insize: 48
LOOKUP /economy
getattr /economy
[13:52:04,066] getattr('/economy')
[13:52:04,067] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
NODEID: 11
unique: 948, success, outsize: 144
unique: 949, opcode: GETATTR (3), nodeid: 11, insize: 56
getattr /economy
[13:52:04,068] getattr('/economy')
[13:52:04,068] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 949, success, outsize: 120
unique: 950, opcode: LOOKUP (1), nodeid: 11, insize: 62
LOOKUP /economy/Argentina_history.avi
getattr /economy/Argentina_history.avi
[13:52:04,069] getattr('/economy/Argentina_history.avi')
[13:52:04,070] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 1, 'st_nlink': 1, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 6, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 33188})
NODEID: 12
unique: 950, success, outsize: 144
unique: 951, opcode: GETATTR (3), nodeid: 12, insize: 56
getattr /economy/Argentina_history.avi
[13:52:04,070] getattr('/economy/Argentina_history.avi')
[13:52:04,071] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 1, 'st_nlink': 1, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 6, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 33188})
unique: 951, success, outsize: 120
unique: 952, opcode: GETATTR (3), nodeid: 1, insize: 56
getattr /
[13:52:04,072] getattr('/')
[13:52:04,072] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 8, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 952, success, outsize: 120
unique: 953, opcode: LOOKUP (1), nodeid: 1, insize: 48
LOOKUP /economy
getattr /economy
[13:52:04,073] getattr('/economy')
[13:52:04,074] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
NODEID: 11
unique: 953, success, outsize: 144
unique: 954, opcode: GETATTR (3), nodeid: 11, insize: 56
getattr /economy
[13:52:04,075] getattr('/economy')
[13:52:04,075] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 954, success, outsize: 120
unique: 955, opcode: LOOKUP (1), nodeid: 11, insize: 62
LOOKUP /economy/Argentina_history.avi
getattr /economy/Argentina_history.avi
[13:52:04,076] getattr('/economy/Argentina_history.avi')
[13:52:04,077] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 1, 'st_nlink': 1, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 6, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 33188})
NODEID: 12
unique: 955, success, outsize: 144
unique: 956, opcode: GETATTR (3), nodeid: 12, insize: 56
getattr /economy/Argentina_history.avi
[13:52:04,077] getattr('/economy/Argentina_history.avi')
[13:52:04,078] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 1, 'st_nlink': 1, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 6, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 33188})
unique: 956, success, outsize: 120
unique: 957, opcode: GETATTR (3), nodeid: 1, insize: 56
getattr /
[13:52:04,079] getattr('/')
[13:52:04,079] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 8, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 957, success, outsize: 120
unique: 958, opcode: LOOKUP (1), nodeid: 1, insize: 48
LOOKUP /economy
getattr /economy
[13:52:04,080] getattr('/economy')
[13:52:04,081] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
NODEID: 11
unique: 958, success, outsize: 144
unique: 959, opcode: GETATTR (3), nodeid: 11, insize: 56
getattr /economy
[13:52:04,082] getattr('/economy')
[13:52:04,082] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 959, success, outsize: 120
unique: 960, opcode: GETATTR (3), nodeid: 11, insize: 56
getattr /economy
[13:52:04,083] getattr('/economy')
[13:52:04,083] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 960, success, outsize: 120
unique: 961, opcode: LOOKUP (1), nodeid: 11, insize: 62
LOOKUP /economy/Argentina_history.avi
getattr /economy/Argentina_history.avi
[13:52:04,084] getattr('/economy/Argentina_history.avi')
[13:52:04,085] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 1, 'st_nlink': 1, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 6, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 33188})
NODEID: 12
unique: 961, success, outsize: 144
unique: 962, opcode: GETATTR (3), nodeid: 11, insize: 56
getattr /economy
[13:52:04,086] getattr('/economy')
[13:52:04,086] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 962, success, outsize: 120
unique: 963, opcode: UNLINK (10), nodeid: 11, insize: 62
unlink /economy/Argentina_history.avi
[13:52:04,087] unlink('/economy/Argentina_history.avi')
[13:52:04,088] unlink(...) -> -38
unique: 963, error: -38 (Function not implemented), outsize: 16
unique: 964, opcode: GETATTR (3), nodeid: 1, insize: 56
getattr /
[13:52:04,088] getattr('/')
[13:52:04,088] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 8, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 964, success, outsize: 120
unique: 965, opcode: LOOKUP (1), nodeid: 1, insize: 48
LOOKUP /economy
getattr /economy
[13:52:04,089] getattr('/economy')
[13:52:04,090] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
NODEID: 11
unique: 965, success, outsize: 144
unique: 966, opcode: GETATTR (3), nodeid: 11, insize: 56
getattr /economy
[13:52:04,091] getattr('/economy')
[13:52:04,091] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 966, success, outsize: 120
unique: 967, opcode: GETATTR (3), nodeid: 11, insize: 56
getattr /economy
[13:52:04,092] getattr('/economy')
[13:52:04,092] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 967, success, outsize: 120
unique: 968, opcode: LOOKUP (1), nodeid: 11, insize: 62
LOOKUP /economy/Argentina_history.avi
getattr /economy/Argentina_history.avi
[13:52:04,093] getattr('/economy/Argentina_history.avi')
[13:52:04,094] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 1, 'st_nlink': 1, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 6, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 33188})
NODEID: 12
unique: 968, success, outsize: 144
unique: 969, opcode: GETATTR (3), nodeid: 11, insize: 56
getattr /economy
[13:52:04,095] getattr('/economy')
[13:52:04,095] getattr(...) -> Stat({'st_ctime': 1308657071.0, 'st_rdev': 0, 'st_mtime': 1305795618.0, 'st_blocks': 0, 'st_nlink': 2, 'st_gid': 1000, 'st_blksize': 4096, 'st_dev': 0, 'st_size': 0, 'st_atime': 1308657073.0, 'st_uid': 1000, 'st_ino': 0, 'st_mode': 16877})
unique: 969, success, outsize: 120
unique: 970, opcode: UNLINK (10), nodeid: 11, insize: 62
unlink /economy/Argentina_history.avi
[13:52:04,096] unlink('/economy/Argentina_history.avi')
[13:52:04,096] unlink(...) -> -38
unique: 970, error: -38 (Function not implemented), outsize: 16
Follow ups
References