Thread: [Libsysio-commit] HEAD: libsysio/include inode.h (Page 2)
Brought to you by:
lward
From: Lee W. <lw...@us...> - 2009-02-04 19:11:47
|
Update of /cvsroot/libsysio/libsysio/include In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv26722/include Modified Files: inode.h Log Message: Added a new flag for namei, ND_NXMNT. This flag will cause namei to refrain from crossing mount points while resolving a path. Index: inode.h =================================================================== RCS file: /cvsroot/libsysio/libsysio/include/inode.h,v retrieving revision 1.51 retrieving revision 1.52 diff -u -w -b -B -p -r1.51 -r1.52 --- inode.h 28 Jan 2009 16:13:19 -0000 1.51 +++ inode.h 4 Feb 2009 19:11:40 -0000 1.52 @@ -664,6 +664,7 @@ struct nameidata { #define ND_NOFOLLOW 0x01 /* no follow symlinks */ #define ND_NEGOK 0x02 /* last missing is ok */ #define ND_NOPERMCHECK 0x04 /* don't check perms */ +#define ND_NXMNT 0x08 /* don't cross mounts */ #ifdef AUTOMOUNT_FILE_NAME #define _ND_INIT_AUTOMOUNT(nd) ((nd)->nd_amcnt = 0) |
From: Lee W. <lw...@us...> - 2009-04-10 21:14:39
|
Update of /cvsroot/libsysio/libsysio/include In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv16754/include Modified Files: inode.h Log Message: Support the new inode op, filldirentries2. Added op member, PNOP call, and type definition for fill directory entries helper, filldir_t. Index: inode.h =================================================================== RCS file: /cvsroot/libsysio/libsysio/include/inode.h,v retrieving revision 1.52 retrieving revision 1.53 diff -u -w -b -B -p -r1.52 -r1.53 --- inode.h 4 Feb 2009 19:11:40 -0000 1.52 +++ inode.h 10 Apr 2009 21:14:20 -0000 1.53 @@ -73,6 +73,16 @@ struct io_arguments; struct ioctx; /* + * Fill directory entry routines. + */ +typedef int (*filldir_t)(void *, + ino_t, + _SYSIO_OFF_T, + const char *, + size_t, + unsigned char); + +/* * Operations on i-nodes. * * Should this be split up into file and name space operations? @@ -90,6 +100,10 @@ struct inode_ops { _SYSIO_OFF_T *posp, char *buf, size_t nbytes); + int (*inop_filldirentries2)(struct pnode *pno, + _SYSIO_OFF_T *, + filldir_t, + void *); int (*inop_mkdir)(struct pnode *pno, mode_t mode); int (*inop_rmdir)(struct pnode *pno); int (*inop_symlink)(struct pnode *pno, const char *data); @@ -575,6 +589,8 @@ struct pnode { (_pno), (_mask), (_stbuf)) #define PNOP_FILLDIRENTRIES(_pno, _posp, _buf, _nbytes) \ _PNOP_CALL((_pno), filldirentries, (_pno), (_posp), (_buf), (_nbytes)) +#define PNOP_FILLDIRENTRIES2(_pno, _posp, _fill, _data) \ + _PNOP_CALL((_pno), filldirentries2, (_pno), (_posp), (_fill), (_data)) #define PNOP_MKDIR(_pno, _mode) \ _PNOP_MKCALL((_pno), mkdir, (_pno), (_mode)) #define PNOP_RMDIR(_pno) \ |
From: Lee W. <lw...@us...> - 2009-05-05 16:34:14
|
Update of /cvsroot/libsysio/libsysio/include In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv30411/include Modified Files: inode.h Log Message: The inode supports a new operation, perms_check, so that we may have per-inode permssions checking. As well, a new routine, _sysio_p_generic_perms_check is available if your file system can just use the default policy for the core. Index: inode.h =================================================================== RCS file: /cvsroot/libsysio/libsysio/include/inode.h,v retrieving revision 1.53 retrieving revision 1.54 diff -u -w -b -B -p -r1.53 -r1.54 --- inode.h 10 Apr 2009 21:14:20 -0000 1.53 +++ inode.h 5 May 2009 16:34:01 -0000 1.54 @@ -125,6 +125,7 @@ struct inode_ops { #ifdef _HAVE_STATVFS int (*inop_statvfs)(struct pnode *pno, struct intnl_statvfs *buf); #endif + int (*inop_perms_check)(struct pnode *pno, int amode, int effective); void (*inop_gone)(struct inode *ino); }; @@ -631,6 +632,8 @@ struct pnode { #define PNOP_STATVFS(_pno, _buf) \ _PNOP_CALL((_pno), statvfs, (_pno), (_buf)) #endif +#define PNOP_PERMS_CHECK(_pno, _amode, _eff) \ + _PNOP_MKCALL((_pno), perms_check, (_pno), (_amode), (_eff)) /* * An intent record allows callers of namei and lookup to pass some information @@ -876,3 +879,6 @@ extern int _sysio_p_awrite(struct pnode struct ioctx **ioctxp); extern int _sysio_mkdir(struct pnode *where, mode_t mode); extern int _sysio_mknod(struct pnode *where, mode_t mode, dev_t dev); +extern int _sysio_p_generic_perms_check(struct pnode *pno, + int amode, + int effective); |
From: Lee W. <lw...@us...> - 2009-08-03 19:33:17
|
Update of /cvsroot/libsysio/libsysio/include In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv27194/include Modified Files: inode.h Log Message: Added macros P_ISLOCKED, PB_ISLOCKED, I_ISLOCKED that return positive if the entity is locked or zero, if not. Index: inode.h =================================================================== RCS file: /cvsroot/libsysio/libsysio/include/inode.h,v retrieving revision 1.54 retrieving revision 1.55 diff -u -w -b -B -p -r1.54 -r1.55 --- inode.h 5 May 2009 16:34:01 -0000 1.54 +++ inode.h 3 Aug 2009 19:33:03 -0000 1.55 @@ -190,10 +190,13 @@ struct inode { _I_INIT_MORE(ino); \ } while (0) +#define I_ISLOCKED(_ino) \ + ((_ino)->i_lckcnt) + #ifdef LOCK_DEBUG #define _I_CHECK_LOCK(_ino, _test) \ - (assert(((_test) && (_ino)->i_lckcnt) || \ - !((_test) || (_ino)->i_lckcnt))) + (assert(((_test) && I_ISLOCKED(_ino)) || \ + !((_test) || I_ISLOCKED(_ino)))) #else #define _I_CHECK_LOCK(_ino, _test) #endif @@ -343,10 +346,13 @@ struct pnode_base { LIST_INIT(&(_pb)->pb_aliases); \ } while (0) +#define PB_ISLOCKED(_pb) \ + ((_pb)->pb_lckcnt) + #ifdef LOCK_DEBUG #define _PB_CHECK_LOCK(_pb, _test) \ - (assert(((_test) && (_pb)->pb_lckcnt) || \ - !((_test) || (_pb)->pb_lckcnt))) + (assert(((_test) && PB_ISLOCKED(_pb)) || \ + !((_test) || PB_ISLOCKED(_pb)))) #else #define _PB_CHECK_LOCK(_pb, _test) #endif @@ -482,10 +488,13 @@ struct pnode { (_pno)->p_cover = (_cover); \ } while (0) +#define P_ISLOCKED(_pno) \ + ((_pno)->p_lckcnt) + #ifdef LOCK_DEBUG #define _P_CHECK_LOCK(_pno, _test) \ - (assert(((_test) && (_pno)->p_lckcnt) || \ - !((_test) || (_pno)->p_lckcnt))) + (assert(((_test) && P_ISLOCKED(_pno)) || \ + !((_test) || P_ISLOCKED(_pno)))) #else #define _P_CHECK_LOCK(_pno, _test) #endif |
From: Lee W. <lw...@us...> - 2009-08-03 19:46:49
|
Update of /cvsroot/libsysio/libsysio/include In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv29491/include Modified Files: inode.h Log Message: Export new global, _sysio_epermitted. Index: inode.h =================================================================== RCS file: /cvsroot/libsysio/libsysio/include/inode.h,v retrieving revision 1.55 retrieving revision 1.56 diff -u -w -b -B -p -r1.55 -r1.56 --- inode.h 3 Aug 2009 19:33:03 -0000 1.55 +++ inode.h 3 Aug 2009 19:46:39 -0000 1.56 @@ -852,6 +852,7 @@ extern int _sysio_path_walk(struct pnode #ifdef AUTOMOUNT_FILE_NAME extern void _sysio_next_component(const char *path, struct qstr *name); #endif +extern int _sysio_epermitted(struct pnode *pno, int amode, int effective); extern int _sysio_permitted(struct pnode *pno, int amode); extern int _sysio_namei(struct pnode *pno, const char *path, |
From: Lee W. <lw...@us...> - 2009-08-04 05:46:35
|
Update of /cvsroot/libsysio/libsysio/include In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv9719/include Modified Files: inode.h Log Message: Altered PB_SET_ASSOC to take a reference on each association ad drop one on disassociates. This to save the effort, everywhere it's used, of doing the same thing. Tracked down everywhere it's used and got rid of all the I_REF logic. Index: inode.h =================================================================== RCS file: /cvsroot/libsysio/libsysio/include/inode.h,v retrieving revision 1.56 retrieving revision 1.57 diff -u -w -b -B -p -r1.56 -r1.57 --- inode.h 3 Aug 2009 19:46:39 -0000 1.56 +++ inode.h 4 Aug 2009 05:46:24 -0000 1.57 @@ -411,6 +411,7 @@ struct pnode_base { assert(!(_ino)); \ _I_CHECK_LOCK((_pb)->pb_ino, 1); \ LIST_REMOVE((_pb), pb_alinks); \ + _I_RELE_NO_LOCK((_pb)->pb_ino); \ } \ (_pb)->pb_ino = (_ino); \ if ((_pb)->pb_ino) { \ @@ -418,13 +419,22 @@ struct pnode_base { LIST_INSERT_HEAD(&(_pb)->pb_ino->i_assoc, \ (_pb), \ pb_alinks); \ + _I_REF_NO_LOCK((_pb)->pb_ino); \ } \ } while (0) #else #define PB_SET_ASSOC(_pb, _ino) \ do { \ assert(!((_pb)->pb_ino && (_ino))); \ + if ((_pb)->pb_ino) { \ + _I_CHECK_LOCK((_pb)->pb_ino, 1); \ + _I_RELE_NO_LOCK((_pb)->pb_ino); \ + } \ (_pb)->pb_ino = (_ino); \ + if ((_pb)->pb_ino) { \ + _I_CHECK_LOCK((_pb)->pb_ino, 1); \ + _I_REF_NO_LOCK((_pb)->pb_ino); \ + } \ } while (0) #endif |
From: Lee W. <lw...@us...> - 2009-08-04 14:19:10
|
Update of /cvsroot/libsysio/libsysio/include In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv18445/include Modified Files: inode.h Log Message: The namei family now takes the ND_WANTPARENT flag as well. This new flag causes a lock to be taken on the parent of the returned pnode when the return indicates success. Updated copyright date and contact. Index: inode.h =================================================================== RCS file: /cvsroot/libsysio/libsysio/include/inode.h,v retrieving revision 1.57 retrieving revision 1.58 diff -u -w -b -B -p -r1.57 -r1.58 --- inode.h 4 Aug 2009 05:46:24 -0000 1.57 +++ inode.h 4 Aug 2009 14:19:01 -0000 1.58 @@ -703,6 +703,7 @@ struct nameidata { #define ND_NEGOK 0x02 /* last missing is ok */ #define ND_NOPERMCHECK 0x04 /* don't check perms */ #define ND_NXMNT 0x08 /* don't cross mounts */ +#define ND_WANTPARENT 0x0a /* want parent too */ #ifdef AUTOMOUNT_FILE_NAME #define _ND_INIT_AUTOMOUNT(nd) ((nd)->nd_amcnt = 0) |
From: Lee W. <lw...@us...> - 2009-08-17 17:45:19
|
Update of /cvsroot/libsysio/libsysio/include In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv29439/include Modified Files: inode.h Log Message: ND_WANTPARENT was defined as 0x0a. I'm thinking I can't do hex :( It's now defined to be 0x10, a unique flag. Index: inode.h =================================================================== RCS file: /cvsroot/libsysio/libsysio/include/inode.h,v retrieving revision 1.58 retrieving revision 1.59 diff -u -w -b -B -p -r1.58 -r1.59 --- inode.h 4 Aug 2009 14:19:01 -0000 1.58 +++ inode.h 17 Aug 2009 17:45:09 -0000 1.59 @@ -703,7 +703,7 @@ struct nameidata { #define ND_NEGOK 0x02 /* last missing is ok */ #define ND_NOPERMCHECK 0x04 /* don't check perms */ #define ND_NXMNT 0x08 /* don't cross mounts */ -#define ND_WANTPARENT 0x0a /* want parent too */ +#define ND_WANTPARENT 0x10 /* want parent too */ #ifdef AUTOMOUNT_FILE_NAME #define _ND_INIT_AUTOMOUNT(nd) ((nd)->nd_amcnt = 0) |
From: Lee W. <lw...@us...> - 2009-08-17 22:56:56
|
Update of /cvsroot/libsysio/libsysio/include In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv31324 Modified Files: inode.h Log Message: Moved I_ISASSOC and I_GONE up. Switched _I_RELE_NO_LOCK to use the I_GONE macro instead of calling _sysio_i_gone directly. Index: inode.h =================================================================== RCS file: /cvsroot/libsysio/libsysio/include/inode.h,v retrieving revision 1.59 retrieving revision 1.60 diff -u -w -b -B -p -r1.59 -r1.60 --- inode.h 17 Aug 2009 17:45:09 -0000 1.59 +++ inode.h 17 Aug 2009 22:56:45 -0000 1.60 @@ -171,6 +171,20 @@ struct inode { #endif /* + * Check association; Logical true if so, otherwise false. + * + * NB: The given i-node should be locked or otherwise protected from + * manipulation by others. + */ +#ifdef I_ASSOCIATIONS +#define I_ISASSOC(_ino) \ + ((_ino)->i_assoc.lh_first) +#else +#define I_ISASSOC(_ino) \ + (0) +#endif + +/* * Init an i-node record. */ #define I_INIT(ino, fs, stat, ops, fid, immunity, private) \ @@ -201,6 +215,15 @@ struct inode { #define _I_CHECK_LOCK(_ino, _test) #endif +/* + * Attempt to kill an inode. + */ +#define I_GONE(_ino) \ + do { \ + _I_CHECK_LOCK((_ino), 1); \ + _sysio_i_gone(_ino); \ + } while (0) + #define I_LOCK(_ino) \ do { \ mutex_lock(&(_ino)->i_mutex); \ @@ -241,7 +264,7 @@ struct inode { _I_CHECK_LOCK((_ino), 1); \ assert((_ino)->i_ref); \ if (!--(_ino)->i_ref && (_ino)->i_zombie) \ - _sysio_i_gone((_ino)); \ + I_GONE(_ino); \ } while (0) #define I_RELE(_ino) \ @@ -270,29 +293,6 @@ struct inode { } while (0) /* - * Attempt to kill an inode. - */ -#define I_GONE(_ino) \ - do { \ - _I_CHECK_LOCK((_ino), 1); \ - _sysio_i_gone(_ino); \ - } while (0) - -/* - * Check association; Logical true if so, otherwise false. - * - * NB: The given i-node should be locked or otherwise protected from - * manipulation by others. - */ -#ifdef I_ASSOCIATIONS -#define I_ISASSOC(_ino) \ - ((_ino)->i_assoc.lh_first) -#else -#define I_ISASSOC(_ino) \ - (0) -#endif - -/* * The "quick string" record (inspired by the structure of the same name * from Linux) is used to pass a string without delimiters as well as useful * information about the string. |
From: Lee W. <lw...@us...> - 2009-08-31 21:38:42
|
Update of /cvsroot/libsysio/libsysio/include In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv27009/include Modified Files: inode.h Log Message: The children of a directory are now maintained as a tree, instead of as a list. Along with this, the nasty resursive implementation of pb_prune is now a de-recursed implementation. This method is 1 to 1.5 percent slower than the previous list implementation in my tests. Index: inode.h =================================================================== RCS file: /cvsroot/libsysio/libsysio/include/inode.h,v retrieving revision 1.60 retrieving revision 1.61 diff -u -w -b -B -p -r1.60 -r1.61 --- inode.h 17 Aug 2009 22:56:45 -0000 1.60 +++ inode.h 31 Aug 2009 21:38:29 -0000 1.61 @@ -318,8 +318,8 @@ struct pnode_base { struct pnode_base *pbk_parent; /* parent */ } pb_key; struct inode *pb_ino; /* inode */ - LIST_HEAD(, pnode_base) pb_children; /* children if a dir */ - LIST_ENTRY(pnode_base) pb_sibs; /* links to siblings */ + struct tree_node *pb_children; /* children if a dir */ + struct tree_node pb_sib; /* sibling tree rec */ LIST_HEAD(, pnode) pb_aliases; /* aliases */ #ifdef I_ASSOCIATIONS LIST_ENTRY(pnode_base) pb_alinks; /* names to same ino */ @@ -342,7 +342,9 @@ struct pnode_base { (_pb)->pb_key.pbk_name = *(_name); \ (_pb)->pb_key.pbk_parent = (_parent); \ (_pb)->pb_ino = NULL; \ - LIST_INIT(&(_pb)->pb_children); \ + (_pb)->pb_children = NULL; \ + (_pb)->pb_sib.tn_key = (_pb); \ + (_pb)->pb_sib.tn_left = (_pb)->pb_sib.tn_right = NULL; \ LIST_INIT(&(_pb)->pb_aliases); \ } while (0) |
From: Lee W. <lw...@us...> - 2009-09-09 22:46:51
|
Update of /cvsroot/libsysio/libsysio/include In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv31444/include Modified Files: inode.h Log Message: Reformatted to fit style and tab widths in the rest of the source. No functional changes. Index: inode.h =================================================================== RCS file: /cvsroot/libsysio/libsysio/include/inode.h,v retrieving revision 1.61 retrieving revision 1.62 diff -u -w -b -B -p -r1.61 -r1.62 --- inode.h 31 Aug 2009 21:38:29 -0000 1.61 +++ inode.h 9 Sep 2009 22:46:38 -0000 1.62 @@ -78,9 +78,7 @@ struct ioctx; typedef int (*filldir_t)(void *, ino_t, _SYSIO_OFF_T, - const char *, - size_t, - unsigned char); + const char *, size_t, unsigned char); /* * Operations on i-nodes. @@ -115,17 +113,22 @@ struct inode_ops { int (*inop_rename)(struct pnode *old, struct pnode *new); int (*inop_read)(struct ioctx *ioctx); int (*inop_write)(struct ioctx *ioctx); - _SYSIO_OFF_T (*inop_pos)(struct pnode *pno, _SYSIO_OFF_T off); + _SYSIO_OFF_T \ + (*inop_pos)(struct pnode *pno, _SYSIO_OFF_T off); int (*inop_iodone)(struct ioctx *ioctx); int (*inop_fcntl)(struct pnode *pno, int cmd, va_list ap, int *rtn); int (*inop_sync)(struct pnode *pno); int (*inop_datasync)(struct pnode *pno); - int (*inop_ioctl)(struct pnode *pno, unsigned long int request, va_list ap); + int (*inop_ioctl)(struct pnode *pno, + unsigned long int request, + va_list ap); int (*inop_mknod)(struct pnode *pno, mode_t mode, dev_t dev); #ifdef _HAVE_STATVFS int (*inop_statvfs)(struct pnode *pno, struct intnl_statvfs *buf); #endif - int (*inop_perms_check)(struct pnode *pno, int amode, int effective); + int (*inop_perms_check)(struct pnode *pno, + int amode, + int effective); void (*inop_gone)(struct inode *ino); }; @@ -826,8 +830,7 @@ extern void _sysio_p_gone(struct pnode * extern size_t _sysio_p_prune(struct pnode *root); extern void _sysio_p_get2(struct pnode *pno1, struct pnode *pno2); extern int _sysio_pb_pathof(struct pnode_base *pb, - char separator, - char **pathp); + char separator, char **pathp); extern char *_sysio_pb_path(struct pnode_base *pb, char separator); extern ssize_t _sysio_p_filldirentries(struct pnode *pno, char *buf, @@ -845,9 +848,11 @@ extern int _sysio_p_rename(struct pnode extern int _sysio_p_iiox(int (*f)(struct ioctx *), struct pnode *pno, _SYSIO_OFF_T limit, - const struct iovec *iov, size_t iov_count, + const struct iovec *iov, + size_t iov_count, void (*release_iov)(struct ioctx *, void *), - const struct intnl_xtvec *xtv, size_t xtv_count, + const struct intnl_xtvec *xtv, + size_t xtv_count, void (*release_xtv)(struct ioctx *, void *), void (*completio)(struct ioctx *, void *), void *data, |
From: Lee W. <lw...@us...> - 2009-09-22 22:33:47
|
Update of /cvsroot/libsysio/libsysio/include In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv26122 Modified Files: inode.h Log Message: Depending on whether I_ASSOCIATIONS was defined the PB_SET_ASSOC macro was being built in two pretty different ways. With this change, the majority of the logic is the same and only whether or not to perform the pertinent list manipulations is different. Index: inode.h =================================================================== RCS file: /cvsroot/libsysio/libsysio/include/inode.h,v retrieving revision 1.62 retrieving revision 1.63 diff -u -w -b -B -p -r1.62 -r1.63 --- inode.h 9 Sep 2009 22:46:38 -0000 1.62 +++ inode.h 22 Sep 2009 22:33:37 -0000 1.63 @@ -397,6 +397,22 @@ struct pnode_base { PB_UNLOCK(_pb); \ } while (0) +#ifdef I_ASSOCIATIONS +#define _PB_ADD_ASSOC(_pb) \ + do { \ + LIST_INSERT_HEAD(&(_pb)->pb_ino->i_assoc, \ + (_pb), \ + pb_alinks); \ + } while (0) +#define _PB_REMOVE_ASSOC(_pb) \ + do { \ + LIST_REMOVE((_pb), pb_alinks); \ + } while (0) +#else +#define _PB_ADD_ASSOC(_pb) +#define _PB_REMOVE_ASSOC(_pb) +#endif + /* * Set path-base node association. * @@ -408,40 +424,22 @@ struct pnode_base { * NB(2): We no longer support re-association. Now, an association can be * set, anew, or cleared (only when destroying the path-base node. */ -#ifdef I_ASSOCIATIONS #define PB_SET_ASSOC(_pb, _ino) \ do { \ _PB_CHECK_LOCK((_pb), 1); \ if ((_pb)->pb_ino) { \ assert(!(_ino)); \ _I_CHECK_LOCK((_pb)->pb_ino, 1); \ - LIST_REMOVE((_pb), pb_alinks); \ + _PB_REMOVE_ASSOC(_pb); \ _I_RELE_NO_LOCK((_pb)->pb_ino); \ } \ (_pb)->pb_ino = (_ino); \ if ((_pb)->pb_ino) { \ _I_CHECK_LOCK((_pb)->pb_ino, 1); \ - LIST_INSERT_HEAD(&(_pb)->pb_ino->i_assoc, \ - (_pb), \ - pb_alinks); \ + _PB_ADD_ASSOC(_pb); \ _I_REF_NO_LOCK((_pb)->pb_ino); \ } \ } while (0) -#else -#define PB_SET_ASSOC(_pb, _ino) \ - do { \ - assert(!((_pb)->pb_ino && (_ino))); \ - if ((_pb)->pb_ino) { \ - _I_CHECK_LOCK((_pb)->pb_ino, 1); \ - _I_RELE_NO_LOCK((_pb)->pb_ino); \ - } \ - (_pb)->pb_ino = (_ino); \ - if ((_pb)->pb_ino) { \ - _I_CHECK_LOCK((_pb)->pb_ino, 1); \ - _I_REF_NO_LOCK((_pb)->pb_ino); \ - } \ - } while (0) -#endif /* * Since a file system may be multiply mounted, in different parts of the local |