← Back to team overview

pytagsfs team mailing list archive

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