📄 inode.h
字号:
* * The links list entry holds pointers to other aliases for the base path * node entry. * * The nodes link is bookkeeping. */struct pnode { unsigned p_ref; /* soft ref count */ struct pnode *p_parent; /* parent */ struct pnode_base *p_base; /* base part */ struct mount *p_mount; /* mount info */ struct pnode *p_cover; /* covering pnode */ LIST_ENTRY(pnode) p_links; /* other aliases */ TAILQ_ENTRY(pnode) p_nodes; /* all nodes links */};/* * Reference path-tree node. */#define P_REF(pno) \ do { \ TAILQ_REMOVE(&_sysio_pnodes, (pno), p_nodes); \ TAILQ_INSERT_TAIL(&_sysio_pnodes, (pno), p_nodes); \ (pno)->p_ref++; \ assert((pno)->p_ref); \ } while (0)/* * Release reference to path-tree node. */#define P_RELE(pno) \ do { \ assert((pno)->p_ref); \ --(pno)->p_ref; \ } while (0)/* * An intent record allows callers of namei and lookup to pass some information * about what they want to accomplish in the end. */struct intent { unsigned int_opmask; void *int_arg1; void *int_arg2;};/* * Intent operations. */#define INT_GETATTR 0x01 /* get attrs */#define INT_SETATTR 0x02 /* set attrs */#define INT_UPDPARENT 0x04 /* insert/delete */#define INT_OPEN 0x08 /* open */#define INT_CREAT (INT_UPDPARENT|0x10) /* insert */#define INT_READLINK 0x12 /* readlink */#define INTENT_INIT(intnt, mask, arg1, arg2) \ do { \ (intnt)->int_opmask = (mask); \ (intnt)->int_arg1 = (arg1); \ (intnt)->int_arg2 = (arg2); \ } while (0)/* * Bundled up arguments to _sysio_path_walk. */struct nameidata { unsigned nd_flags; /* flags (see below) */ const char *nd_path; /* path arg */ struct pnode *nd_pno; /* returned pnode */ struct pnode *nd_root; /* system/user root */ struct intent *nd_intent; /* intent (NULL ok) */ unsigned nd_slicnt; /* symlink indirects */#ifdef AUTOMOUNT_FILE_NAME unsigned nd_amcnt; /* automounts */#endif};/* * Values for nameidata flags field. */#define ND_NOFOLLOW 0x01 /* no follow symlinks */#define ND_NEGOK 0x02 /* last missing is ok */#define ND_NOPERMCHECK 0x04 /* don't check perms */#ifdef AUTOMOUNT_FILE_NAME#define _ND_INIT_AUTOMOUNT(nd) ((nd)->nd_amcnt = 0)#else#define _ND_INIT_AUTOMOUNT(nd)#endif#define _ND_INIT_OTHERS(nd) \ _ND_INIT_AUTOMOUNT(nd)/* * Init nameidata record. */#define ND_INIT(nd, flags, path, root, intnt) \ do { \ (nd)->nd_flags = (flags); \ (nd)->nd_path = (path); \ (nd)->nd_pno = NULL; \ (nd)->nd_root = (root); \ (nd)->nd_intent = (intnt); \ (nd)->nd_slicnt = 0; \ _ND_INIT_OTHERS(nd); \ } while (0)/* * IO completion callback record. */struct ioctx_callback { TAILQ_ENTRY(ioctx_callback) iocb_next; /* list link */ void (*iocb_f)(struct ioctx *, void *); /* cb func */ void *iocb_data; /* cb data */};/* * All IO internally is done with an asynchronous mechanism. This record * holds the completion information. It's too big :-( */struct ioctx { LIST_ENTRY(ioctx) ioctx_link; /* AIO list link */ unsigned ioctx_fast : 1, /* from stack space */ ioctx_done : 1, /* transfer complete */ ioctx_write : 1; /* op is a write */ struct inode *ioctx_ino; /* i-node */ const struct iovec *ioctx_iov; /* scatter/gather vec */ size_t ioctx_iovlen; /* iovec length */ const struct intnl_xtvec *ioctx_xtv; /* extents */ size_t ioctx_xtvlen; /* xtv length */ ssize_t ioctx_cc; /* rtn char count */ int ioctx_errno; /* error number */ TAILQ_HEAD(, ioctx_callback) ioctx_cbq; /* callback queue */ void *ioctx_private; /* driver data */};/* * Init IO context record. */#define IOCTX_INIT(ioctx, fast, wr, ino, iov, iovlen, xtv, xtvlen) \ do { \ (ioctx)->ioctx_fast = (fast); \ (ioctx)->ioctx_done = 0; \ (ioctx)->ioctx_write = (wr) ? 1 : 0; \ (ioctx)->ioctx_ino = (ino); \ (ioctx)->ioctx_iov = (iov); \ (ioctx)->ioctx_iovlen = (iovlen); \ (ioctx)->ioctx_xtv = (xtv); \ (ioctx)->ioctx_xtvlen = (xtvlen); \ (ioctx)->ioctx_cc = 0; \ (ioctx)->ioctx_errno = 0; \ TAILQ_INIT(&(ioctx)->ioctx_cbq); \ (ioctx)->ioctx_private = NULL; \ } while (0)/* * Return whether access to a pnode is read-only. */#define IS_RDONLY(pno) \ ((pno)->p_mount->mnt_flags & MOUNT_F_RO)extern struct pnode *_sysio_root;extern TAILQ_HEAD(inodes_head, inode) _sysio_inodes;extern TAILQ_HEAD(pnodes_head, pnode) _sysio_pnodes;extern int _sysio_i_init(void);#ifdef ZERO_SUM_MEMORYextern void _sysio_i_shutdown(void);#endifextern struct inode *_sysio_i_new(struct filesys *fs, struct file_identifier *fid, struct intnl_stat *stat, unsigned immunity, struct inode_ops *ops, void *private);extern struct inode *_sysio_i_find(struct filesys *fs, struct file_identifier *fid);extern void _sysio_i_gone(struct inode *ino);extern void _sysio_i_undead(struct inode *ino);extern int _sysio_p_find_alias(struct pnode *parent, struct qstr *name, struct pnode **pnop);extern int _sysio_p_validate(struct pnode *pno, struct intent *intnt, const char *path);extern struct pnode_base *_sysio_pb_new(struct qstr *name, struct pnode_base *parent, struct inode *ino);extern void _sysio_pb_gone(struct pnode_base *pb);extern struct pnode *_sysio_p_new_alias(struct pnode *parent, struct pnode_base *pb, struct mount *mnt);extern void _sysio_p_gone(struct pnode *pno);extern size_t _sysio_p_prune(struct pnode *root);extern int _sysio_p_kill_all(struct pnode *root);extern char *_sysio_pb_path(struct pnode_base *pb, char separator);extern int _sysio_setattr(struct pnode *pno, struct inode *ino, unsigned mask, struct intnl_stat *stbuf);extern void _sysio_do_noop(void);extern void _sysio_do_illop(void);extern int _sysio_do_ebadf(void);extern int _sysio_do_einval(void);extern int _sysio_do_enoent(void);extern int _sysio_do_enodev(void);extern int _sysio_do_espipe(void);extern int _sysio_do_eisdir(void);extern int _sysio_do_enosys(void);extern int _sysio_path_walk(struct pnode *parent, struct nameidata *nd);#ifdef AUTOMOUNT_FILE_NAMEextern void _sysio_next_component(const char *path, struct qstr *name);#endifextern int _sysio_permitted(struct pnode *pno, int amode);extern int _sysio_namei(struct pnode *pno, const char *path, unsigned flags, struct intent *intnt, struct pnode **pnop);extern int _sysio_p_chdir(struct pnode *pno);extern int _sysio_ioctx_init(void);extern void _sysio_ioctx_enter(struct ioctx *ioctx);extern struct ioctx *_sysio_ioctx_new(struct inode *ino, int wr, const struct iovec *iov, size_t iovlen, const struct intnl_xtvec *xtv, size_t xtvlen);extern int _sysio_ioctx_cb(struct ioctx *ioctx, void (*f)(struct ioctx *, void *), void *data);extern void _sysio_ioctx_cb_free(struct ioctx_callback *cb);extern struct ioctx *_sysio_ioctx_find(void *id);extern int _sysio_ioctx_done(struct ioctx *ioctx);extern ssize_t _sysio_ioctx_wait(struct ioctx *ioctx);extern void _sysio_ioctx_complete(struct ioctx *ioctx);extern int _sysio_open(struct pnode *pno, int flags, mode_t mode);extern int _sysio_mkdir(struct pnode *where, mode_t mode);extern int _sysio_mknod(struct pnode *where, mode_t mode, dev_t dev);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -