-
-/*
- * Advisory record locking support
- */
-ufs_advlock(vp, id, op, fl, flags)
- struct vnode *vp;
- caddr_t id;
- int op;
- register struct flock *fl;
- int flags;
-{
- register struct inode *ip = VTOI(vp);
- register struct lockf *lock;
- off_t start, end;
- int error;
-
- /*
- * Avoid the common case of unlocking when inode has no locks.
- */
- if (ip->i_lockf == (struct lockf *)0) {
- if (op != F_SETLK) {
- fl->l_type = F_UNLCK;
- return (0);
- }
- }
- /*
- * Convert the flock structure into a start and end.
- */
- switch (fl->l_whence) {
-
- case SEEK_SET:
- case SEEK_CUR:
- /*
- * Caller is responsible for adding any necessary offset
- * when SEEK_CUR is used.
- */
- start = fl->l_start;
- break;
-
- case SEEK_END:
- start = ip->i_size + fl->l_start;
- break;
-
- default:
- return (EINVAL);
- }
- if (start < 0)
- return (EINVAL);
- if (fl->l_len == 0)
- end = -1;
- else
- end = start + fl->l_len - 1;
- /*
- * Create the lockf structure
- */
- MALLOC(lock, struct lockf *, sizeof *lock, M_LOCKF, M_WAITOK);
- lock->lf_start = start;
- lock->lf_end = end;
- lock->lf_id = id;
- lock->lf_inode = ip;
- lock->lf_type = fl->l_type;
- lock->lf_next = (struct lockf *)0;
- lock->lf_block = (struct lockf *)0;
- lock->lf_flags = flags;
- /*
- * Do the requested operation.
- */
- switch(op) {
- case F_SETLK:
- return (lf_setlock(lock));
-
- case F_UNLCK:
- error = lf_clearlock(lock);
- FREE(lock, M_LOCKF);
- return (error);
-
- case F_GETLK:
- error = lf_getlock(lock, fl);
- FREE(lock, M_LOCKF);
- return (error);
-
- default:
- free(lock, M_LOCKF);
- return (EINVAL);
- }
- /* NOTREACHED */
-}
-
-/*
- * Global vfs data structures for ufs
- */
-struct vnodeops ufs_vnodeops = {
- ufs_lookup, /* lookup */
- ufs_create, /* create */
- ufs_mknod, /* mknod */
- ufs_open, /* open */
- ufs_close, /* close */
- ufs_access, /* access */
- ufs_getattr, /* getattr */
- ufs_setattr, /* setattr */
- ufs_read, /* read */
- ufs_write, /* write */
- ufs_ioctl, /* ioctl */
- ufs_select, /* select */
- ufs_mmap, /* mmap */
- ufs_fsync, /* fsync */
- ufs_seek, /* seek */
- ufs_remove, /* remove */
- ufs_link, /* link */
- ufs_rename, /* rename */
- ufs_mkdir, /* mkdir */
- ufs_rmdir, /* rmdir */
- ufs_symlink, /* symlink */
- ufs_readdir, /* readdir */
- ufs_readlink, /* readlink */
- ufs_abortop, /* abortop */
- ufs_inactive, /* inactive */
- ufs_reclaim, /* reclaim */
- ufs_lock, /* lock */
- ufs_unlock, /* unlock */
- ufs_bmap, /* bmap */
- ufs_strategy, /* strategy */
- ufs_print, /* print */
- ufs_islocked, /* islocked */
- ufs_advlock, /* advlock */
-};
-
-struct vnodeops spec_inodeops = {
- spec_lookup, /* lookup */
- spec_create, /* create */
- spec_mknod, /* mknod */
- spec_open, /* open */
- ufsspec_close, /* close */
- ufs_access, /* access */
- ufs_getattr, /* getattr */
- ufs_setattr, /* setattr */
- ufsspec_read, /* read */
- ufsspec_write, /* write */
- spec_ioctl, /* ioctl */
- spec_select, /* select */
- spec_mmap, /* mmap */
- spec_fsync, /* fsync */
- spec_seek, /* seek */
- spec_remove, /* remove */
- spec_link, /* link */
- spec_rename, /* rename */
- spec_mkdir, /* mkdir */
- spec_rmdir, /* rmdir */
- spec_symlink, /* symlink */
- spec_readdir, /* readdir */
- spec_readlink, /* readlink */
- spec_abortop, /* abortop */
- ufs_inactive, /* inactive */
- ufs_reclaim, /* reclaim */
- ufs_lock, /* lock */
- ufs_unlock, /* unlock */
- spec_bmap, /* bmap */
- spec_strategy, /* strategy */
- ufs_print, /* print */
- ufs_islocked, /* islocked */
- spec_advlock, /* advlock */
-};
-
-#ifdef FIFO
-struct vnodeops fifo_inodeops = {
- fifo_lookup, /* lookup */
- fifo_create, /* create */
- fifo_mknod, /* mknod */
- fifo_open, /* open */
- ufsfifo_close, /* close */
- ufs_access, /* access */
- ufs_getattr, /* getattr */
- ufs_setattr, /* setattr */
- ufsfifo_read, /* read */
- ufsfifo_write, /* write */
- fifo_ioctl, /* ioctl */
- fifo_select, /* select */
- fifo_mmap, /* mmap */
- fifo_fsync, /* fsync */
- fifo_seek, /* seek */
- fifo_remove, /* remove */
- fifo_link, /* link */
- fifo_rename, /* rename */
- fifo_mkdir, /* mkdir */
- fifo_rmdir, /* rmdir */
- fifo_symlink, /* symlink */
- fifo_readdir, /* readdir */
- fifo_readlink, /* readlink */
- fifo_abortop, /* abortop */
- ufs_inactive, /* inactive */
- ufs_reclaim, /* reclaim */
- ufs_lock, /* lock */
- ufs_unlock, /* unlock */
- fifo_bmap, /* bmap */
- fifo_strategy, /* strategy */
- ufs_print, /* print */
- ufs_islocked, /* islocked */
- fifo_advlock, /* advlock */
-};
-#endif /* FIFO */
-
-enum vtype iftovt_tab[16] = {
- VNON, VFIFO, VCHR, VNON, VDIR, VNON, VBLK, VNON,
- VREG, VNON, VLNK, VNON, VSOCK, VNON, VNON, VBAD,
-};
-int vttoif_tab[9] = {
- 0, IFREG, IFDIR, IFBLK, IFCHR, IFLNK, IFSOCK, IFIFO, IFMT,
-};