319 lines
7.8 KiB
Perl
319 lines
7.8 KiB
Perl
.\" Copyright (c) 1986 The Regents of the University of California.
|
|
.\" All rights reserved.
|
|
.\"
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
.\" modification, are permitted provided that the following conditions
|
|
.\" are met:
|
|
.\" 1. Redistributions of source code must retain the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer.
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
.\" documentation and/or other materials provided with the distribution.
|
|
.\" 3. All advertising materials mentioning features or use of this software
|
|
.\" must display the following acknowledgement:
|
|
.\" This product includes software developed by the University of
|
|
.\" California, Berkeley and its contributors.
|
|
.\" 4. Neither the name of the University nor the names of its contributors
|
|
.\" may be used to endorse or promote products derived from this software
|
|
.\" without specific prior written permission.
|
|
.\"
|
|
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
.\" SUCH DAMAGE.
|
|
.\"
|
|
.\" @(#)slides.t 5.2 (Berkeley) 4/16/91
|
|
.\"
|
|
.so macros
|
|
.nf
|
|
.LL
|
|
Encapsulation of namei parameters
|
|
.NP 0
|
|
.ta .5i +\w'caddr_t\0\0'u +\w'struct\0\0'u +\w'vnode *nc_prevdir;\0\0\0\0\0'u
|
|
struct nameidata {
|
|
/* arguments and context: */
|
|
caddr_t ni_dirp;
|
|
enum uio_seg ni_seg;
|
|
short ni_nameiop;
|
|
struct vnode *ni_cdir;
|
|
struct vnode *ni_rdir;
|
|
struct ucred *ni_cred;
|
|
.sp .2
|
|
/* shared with lookup and commit: */
|
|
caddr_t ni_pnbuf;
|
|
char *ni_ptr;
|
|
int ni_pathlen;
|
|
short ni_more;
|
|
short ni_loopcnt;
|
|
.sp .2
|
|
/* results: */
|
|
struct vnode *ni_vp;
|
|
struct vnode *ni_dvp;
|
|
.sp .2
|
|
/* BEGIN UFS SPECIFIC */
|
|
struct diroffcache {
|
|
struct vnode *nc_prevdir;
|
|
long nc_id;
|
|
off_t nc_prevoffset;
|
|
} ni_nc;
|
|
/* END UFS SPECIFIC */
|
|
};
|
|
.bp
|
|
|
|
|
|
.LL
|
|
Namei operations and modifiers
|
|
|
|
.NP 0
|
|
.ta \w'#define\0\0'u +\w'WANTPARENT\0\0'u +\w'0x40\0\0\0\0\0\0\0'u
|
|
#define LOOKUP 0 /* name lookup only */
|
|
#define CREATE 1 /* setup for creation */
|
|
#define DELETE 2 /* setup for deletion */
|
|
#define WANTPARENT 0x10 /* return parent vnode also */
|
|
#define NOCACHE 0x20 /* remove name from cache */
|
|
#define FOLLOW 0x40 /* follow symbolic links */
|
|
.bp
|
|
|
|
.LL
|
|
Namei operations and modifiers
|
|
|
|
.NP 0
|
|
.ta \w'#define\0\0'u +\w'WANTPARENT\0\0'u +\w'0x40\0\0\0\0\0\0\0'u
|
|
#define LOOKUP 0
|
|
#define CREATE 1
|
|
#define DELETE 2
|
|
#define WANTPARENT 0x10
|
|
#define NOCACHE 0x20
|
|
#define FOLLOW 0x40
|
|
.bp
|
|
|
|
|
|
.LL
|
|
Credentials
|
|
|
|
.NP 0
|
|
.ta .5i +\w'caddr_t\0\0\0'u +\w'struct\0\0'u +\w'vnode *nc_prevdir;\0\0\0\0\0'u
|
|
struct ucred {
|
|
u_short cr_ref;
|
|
uid_t cr_uid;
|
|
short cr_ngroups;
|
|
gid_t cr_groups[NGROUPS];
|
|
/*
|
|
* The following either should not be here,
|
|
* or should be treated as opaque.
|
|
*/
|
|
uid_t cr_ruid;
|
|
gid_t cr_svgid;
|
|
};
|
|
.bp
|
|
.LL
|
|
Scatter-gather I/O
|
|
.NP 0
|
|
.ta .5i +\w'caddr_t\0\0\0'u +\w'struct\0\0'u +\w'vnode *nc_prevdir;\0\0\0\0\0'u
|
|
struct uio {
|
|
struct iovec *uio_iov;
|
|
int uio_iovcnt;
|
|
off_t uio_offset;
|
|
int uio_resid;
|
|
enum uio_rw uio_rw;
|
|
};
|
|
|
|
enum uio_rw { UIO_READ, UIO_WRITE };
|
|
|
|
|
|
|
|
.ta .5i +\w'caddr_t\0\0\0'u +\w'vnode *nc_prevdir;\0\0\0\0\0'u
|
|
struct iovec {
|
|
caddr_t iov_base;
|
|
int iov_len;
|
|
enum uio_seg iov_segflg;
|
|
int (*iov_op)();
|
|
};
|
|
.bp
|
|
.LL
|
|
Per-filesystem information
|
|
.NP 0
|
|
.ta .25i +\w'struct vfsops\0\0\0'u +\w'*vfs_vnodecovered;\0\0\0\0\0'u
|
|
struct vfs {
|
|
struct vfs *vfs_next;
|
|
\fB+\fP struct vfs *vfs_prev;
|
|
struct vfsops *vfs_op;
|
|
struct vnode *vfs_vnodecovered;
|
|
int vfs_flag;
|
|
\fB!\fP int vfs_fsize;
|
|
\fB+\fP int vfs_bsize;
|
|
\fB!\fP uid_t vfs_exroot;
|
|
short vfs_exflags;
|
|
caddr_t vfs_data;
|
|
};
|
|
|
|
.NP 0
|
|
.ta \w'\fB+\fP 'u +\w'#define\0\0'u +\w'VFS_EXPORTED\0\0'u +\w'0x40\0\0\0\0\0'u
|
|
/* vfs flags: */
|
|
#define VFS_RDONLY 0x01
|
|
\fB+\fP #define VFS_NOEXEC 0x02
|
|
#define VFS_MLOCK 0x04
|
|
#define VFS_MWAIT 0x08
|
|
#define VFS_NOSUID 0x10
|
|
#define VFS_EXPORTED 0x20
|
|
|
|
/* exported vfs flags: */
|
|
#define EX_RDONLY 0x01
|
|
.bp
|
|
|
|
|
|
.LL
|
|
Operations supported on virtual file system.
|
|
|
|
.NP 0
|
|
.ta .25i +\w'int\0\0'u +\w'*vfs_mountroot();\0'u
|
|
struct vfsops {
|
|
\fB!\fP int (*vfs_mount)(vfs, path, data, len);
|
|
\fB!\fP int (*vfs_unmount)(vfs, forcibly);
|
|
\fB+\fP int (*vfs_mountroot)();
|
|
int (*vfs_root)(vfs, vpp);
|
|
int (*vfs_statfs)(vfs, sbp);
|
|
\fB!\fP int (*vfs_sync)(vfs, waitfor);
|
|
\fB+\fP int (*vfs_fhtovp)(vfs, fhp, vpp);
|
|
\fB+\fP int (*vfs_vptofh)(vp, fhp);
|
|
};
|
|
.bp
|
|
|
|
|
|
.LL
|
|
Dynamic file system information
|
|
|
|
.NP 0
|
|
.ta .5i +\w'struct\0\0\0'u +\w'*vfs_vnodecovered;\0\0\0\0\0'u
|
|
struct statfs {
|
|
\fB!\fP short f_type;
|
|
\fB+\fP short f_flags;
|
|
\fB!\fP long f_fsize;
|
|
\fB+\fP long f_bsize;
|
|
long f_blocks;
|
|
long f_bfree;
|
|
long f_bavail;
|
|
long f_files;
|
|
long f_ffree;
|
|
fsid_t f_fsid;
|
|
\fB+\fP char *f_mntonname;
|
|
\fB+\fP char *f_mntfromname;
|
|
long f_spare[7];
|
|
};
|
|
|
|
typedef long fsid_t[2];
|
|
.bp
|
|
.LL
|
|
Filesystem objects (vnodes)
|
|
.NP 0
|
|
.ta .25i +\w'struct vnodeops\0\0'u +\w'*v_vfsmountedhere;\0\0\0'u
|
|
enum vtype { VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK };
|
|
|
|
struct vnode {
|
|
u_short v_flag;
|
|
u_short v_count;
|
|
u_short v_shlockc;
|
|
u_short v_exlockc;
|
|
struct vfs *v_vfsmountedhere;
|
|
struct vfs *v_vfsp;
|
|
struct vnodeops *v_op;
|
|
\fB+\fP struct text *v_text;
|
|
enum vtype v_type;
|
|
caddr_t v_data;
|
|
};
|
|
.ta \w'#define\0\0'u +\w'NOFOLLOW\0\0'u +\w'0x40\0\0\0\0\0\0\0'u
|
|
|
|
/* vnode flags */
|
|
#define VROOT 0x01
|
|
#define VTEXT 0x02
|
|
#define VEXLOCK 0x10
|
|
#define VSHLOCK 0x20
|
|
#define VLWAIT 0x40
|
|
.bp
|
|
.LL
|
|
Operations on vnodes
|
|
|
|
.NP 0
|
|
.ta .25i +\w'int\0\0'u +\w'(*vn_getattr)(\0\0\0\0\0'u
|
|
struct vnodeops {
|
|
\fB!\fP int (*vn_lookup)(ndp);
|
|
\fB!\fP int (*vn_create)(ndp, vap, fflags);
|
|
\fB+\fP int (*vn_mknod)(ndp, vap, fflags);
|
|
\fB!\fP int (*vn_open)(vp, fflags, cred);
|
|
int (*vn_close)(vp, fflags, cred);
|
|
int (*vn_access)(vp, fflags, cred);
|
|
int (*vn_getattr)(vp, vap, cred);
|
|
int (*vn_setattr)(vp, vap, cred);
|
|
.sp .5
|
|
\fB+\fP int (*vn_read)(vp, uiop,
|
|
offp, ioflag, cred);
|
|
\fB+\fP int (*vn_write)(vp, uiop,
|
|
offp, ioflag, cred);
|
|
\fB!\fP int (*vn_ioctl)(vp, com,
|
|
data, fflag, cred);
|
|
int (*vn_select)(vp, which, cred);
|
|
\fB+\fP int (*vn_mmap)(vp, ..., cred);
|
|
int (*vn_fsync)(vp, cred);
|
|
\fB+\fP int (*vn_seek)(vp, offp, off,
|
|
whence);
|
|
.bp
|
|
.LL
|
|
Operations on vnodes (cont)
|
|
|
|
.NP 0
|
|
.ta .25i +\w'int\0\0'u +\w'(*vn_getattr)(\0\0\0\0\0'u
|
|
|
|
\fB!\fP int (*vn_remove)(ndp);
|
|
\fB!\fP int (*vn_link)(vp, ndp);
|
|
\fB!\fP int (*vn_rename)(sndp, tndp);
|
|
\fB!\fP int (*vn_mkdir)(ndp, vap);
|
|
\fB!\fP int (*vn_rmdir)(ndp);
|
|
\fB!\fP int (*vn_symlink)(ndp, vap, nm);
|
|
\fB!\fP int (*vn_readdir)(vp, uiop,
|
|
offp, ioflag, cred);
|
|
\fB!\fP int (*vn_readlink)(vp, uiop,
|
|
offp, ioflag, cred);
|
|
.sp .5
|
|
\fB+\fP int (*vn_abortop)(ndp);
|
|
\fB!\fP int (*vn_inactive)(vp);
|
|
};
|
|
|
|
.NP 0
|
|
.ta \w'#define\0\0'u +\w'NOFOLLOW\0\0'u +\w'0x40\0\0\0\0\0'u
|
|
/* flags for ioflag */
|
|
#define IO_UNIT 0x01
|
|
#define IO_APPEND 0x02
|
|
#define IO_SYNC 0x04
|
|
.bp
|
|
|
|
.LL
|
|
Vnode attributes
|
|
|
|
.NP 0
|
|
.ta .5i +\w'struct timeval\0\0'u +\w'*v_vfsmountedhere;\0\0\0'u
|
|
struct vattr {
|
|
enum vtype va_type;
|
|
u_short va_mode;
|
|
\fB!\fP uid_t va_uid;
|
|
\fB!\fP gid_t va_gid;
|
|
long va_fsid;
|
|
\fB!\fP long va_fileid;
|
|
short va_nlink;
|
|
u_long va_size;
|
|
\fB+\fP u_long va_size1;
|
|
long va_blocksize;
|
|
struct timeval va_atime;
|
|
struct timeval va_mtime;
|
|
struct timeval va_ctime;
|
|
dev_t va_rdev;
|
|
\fB!\fP u_long va_bytes;
|
|
\fB+\fP u_long va_bytes1;
|
|
};
|