#include <rev_endian_fs.h>
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/resourcevar.h>
#include <sys/kernel.h>
#include <sys/file.h>
#include <sys/stat.h>
#include <sys/proc.h>
#include <sys/conf.h>
#include <sys/mount_internal.h>
#include <sys/vnode_internal.h>
#include <sys/malloc.h>
#include <sys/ubc.h>
#include <sys/quota.h>
#include <sys/vm.h>
#include <vfs/vfs_support.h>
#include <miscfs/specfs/specdev.h>
#include <miscfs/fifofs/fifo.h>
#include <ufs/ufs/quota.h>
#include <ufs/ufs/inode.h>
#include <ufs/ufs/dir.h>
#include <ufs/ufs/ufsmount.h>
#include <ufs/ufs/ufs_extern.h>
#include <ufs/ffs/fs.h>
#include <ufs/ffs/ffs_extern.h>
#if REV_ENDIAN_FS
#include <ufs/ufs/ufs_byte_order.h>
#endif
#define VOPFUNC int (*)(void *)
int (**ffs_vnodeop_p)(void *);
struct vnodeopv_entry_desc ffs_vnodeop_entries[] = {
{ &vnop_default_desc, (VOPFUNC)vn_default_error },
{ &vnop_lookup_desc, (VOPFUNC)ufs_lookup },
{ &vnop_create_desc, (VOPFUNC)ufs_create },
{ &vnop_whiteout_desc, (VOPFUNC)ufs_whiteout },
{ &vnop_mknod_desc, (VOPFUNC)ufs_mknod },
{ &vnop_open_desc, (VOPFUNC)ufs_open },
{ &vnop_close_desc, (VOPFUNC)ufs_close },
{ &vnop_getattr_desc, (VOPFUNC)ufs_getattr },
{ &vnop_setattr_desc, (VOPFUNC)ufs_setattr },
{ &vnop_read_desc, (VOPFUNC)ffs_read },
{ &vnop_write_desc, (VOPFUNC)ffs_write },
{ &vnop_ioctl_desc, (VOPFUNC)ufs_ioctl },
{ &vnop_select_desc, (VOPFUNC)ufs_select },
{ &vnop_revoke_desc, (VOPFUNC)ufs_revoke },
{ &vnop_mmap_desc, (VOPFUNC)ufs_mmap },
{ &vnop_fsync_desc, (VOPFUNC)ffs_fsync },
{ &vnop_remove_desc, (VOPFUNC)ufs_remove },
{ &vnop_link_desc, (VOPFUNC)ufs_link },
{ &vnop_rename_desc, (VOPFUNC)ufs_rename },
{ &vnop_mkdir_desc, (VOPFUNC)ufs_mkdir },
{ &vnop_rmdir_desc, (VOPFUNC)ufs_rmdir },
{ &vnop_symlink_desc, (VOPFUNC)ufs_symlink },
{ &vnop_readdir_desc, (VOPFUNC)ufs_readdir },
{ &vnop_readlink_desc, (VOPFUNC)ufs_readlink },
{ &vnop_inactive_desc, (VOPFUNC)ufs_inactive },
{ &vnop_reclaim_desc, (VOPFUNC)ffs_reclaim },
{ &vnop_strategy_desc, (VOPFUNC)ufs_strategy },
{ &vnop_pathconf_desc, (VOPFUNC)ufs_pathconf },
{ &vnop_advlock_desc, (VOPFUNC)err_advlock },
{ &vnop_bwrite_desc, (VOPFUNC)vn_bwrite },
{ &vnop_pagein_desc, (VOPFUNC)ffs_pagein },
{ &vnop_pageout_desc, (VOPFUNC)ffs_pageout },
{ &vnop_copyfile_desc, (VOPFUNC)err_copyfile },
{ &vnop_blktooff_desc, (VOPFUNC)ffs_blktooff },
{ &vnop_offtoblk_desc, (VOPFUNC)ffs_offtoblk },
{ &vnop_blockmap_desc, (VOPFUNC)ufs_blockmap },
{ &vnop_kqfilt_add_desc, (VOPFUNC)ufs_kqfilt_add },
{ (struct vnodeop_desc*)NULL, (int(*)())NULL }
};
struct vnodeopv_desc ffs_vnodeop_opv_desc =
{ &ffs_vnodeop_p, ffs_vnodeop_entries };
int (**ffs_specop_p)(void *);
struct vnodeopv_entry_desc ffs_specop_entries[] = {
{ &vnop_default_desc, (VOPFUNC)vn_default_error },
{ &vnop_lookup_desc, (VOPFUNC)spec_lookup },
{ &vnop_create_desc, (VOPFUNC)spec_create },
{ &vnop_mknod_desc, (VOPFUNC)spec_mknod },
{ &vnop_open_desc, (VOPFUNC)spec_open },
{ &vnop_close_desc, (VOPFUNC)ufsspec_close },
{ &vnop_getattr_desc, (VOPFUNC)ufs_getattr },
{ &vnop_setattr_desc, (VOPFUNC)ufs_setattr },
{ &vnop_read_desc, (VOPFUNC)ufsspec_read },
{ &vnop_write_desc, (VOPFUNC)ufsspec_write },
{ &vnop_ioctl_desc, (VOPFUNC)spec_ioctl },
{ &vnop_select_desc, (VOPFUNC)spec_select },
{ &vnop_revoke_desc, (VOPFUNC)spec_revoke },
{ &vnop_mmap_desc, (VOPFUNC)spec_mmap },
{ &vnop_fsync_desc, (VOPFUNC)ffs_fsync },
{ &vnop_remove_desc, (VOPFUNC)spec_remove },
{ &vnop_link_desc, (VOPFUNC)spec_link },
{ &vnop_rename_desc, (VOPFUNC)spec_rename },
{ &vnop_mkdir_desc, (VOPFUNC)spec_mkdir },
{ &vnop_rmdir_desc, (VOPFUNC)spec_rmdir },
{ &vnop_symlink_desc, (VOPFUNC)spec_symlink },
{ &vnop_readdir_desc, (VOPFUNC)spec_readdir },
{ &vnop_readlink_desc, (VOPFUNC)spec_readlink },
{ &vnop_inactive_desc, (VOPFUNC)ufs_inactive },
{ &vnop_reclaim_desc, (VOPFUNC)ffs_reclaim },
{ &vnop_strategy_desc, (VOPFUNC)spec_strategy },
{ &vnop_pathconf_desc, (VOPFUNC)spec_pathconf },
{ &vnop_advlock_desc, (VOPFUNC)err_advlock },
{ &vnop_bwrite_desc, (VOPFUNC)vn_bwrite },
{ &vnop_pagein_desc, (VOPFUNC)ffs_pagein },
{ &vnop_pageout_desc, (VOPFUNC)ffs_pageout },
{ &vnop_copyfile_desc, (VOPFUNC)err_copyfile },
{ &vnop_blktooff_desc, (VOPFUNC)ffs_blktooff },
{ &vnop_offtoblk_desc, (VOPFUNC)ffs_offtoblk },
{ &vnop_blockmap_desc, (VOPFUNC)spec_blockmap },
{ (struct vnodeop_desc*)NULL, (int(*)())NULL }
};
struct vnodeopv_desc ffs_specop_opv_desc =
{ &ffs_specop_p, ffs_specop_entries };
#if FIFO
int (**ffs_fifoop_p)(void *);
struct vnodeopv_entry_desc ffs_fifoop_entries[] = {
{ &vnop_default_desc, (VOPFUNC)vn_default_error },
{ &vnop_lookup_desc, (VOPFUNC)fifo_lookup },
{ &vnop_create_desc, (VOPFUNC)fifo_create },
{ &vnop_mknod_desc, (VOPFUNC)fifo_mknod },
{ &vnop_open_desc, (VOPFUNC)fifo_open },
{ &vnop_close_desc, (VOPFUNC)ufsfifo_close },
{ &vnop_getattr_desc, (VOPFUNC)ufs_getattr },
{ &vnop_setattr_desc, (VOPFUNC)ufs_setattr },
{ &vnop_read_desc, (VOPFUNC)ufsfifo_read },
{ &vnop_write_desc, (VOPFUNC)ufsfifo_write },
{ &vnop_ioctl_desc, (VOPFUNC)fifo_ioctl },
{ &vnop_select_desc, (VOPFUNC)fifo_select },
{ &vnop_revoke_desc, (VOPFUNC)fifo_revoke },
{ &vnop_mmap_desc, (VOPFUNC)fifo_mmap },
{ &vnop_fsync_desc, (VOPFUNC)ffs_fsync },
{ &vnop_remove_desc, (VOPFUNC)fifo_remove },
{ &vnop_link_desc, (VOPFUNC)fifo_link },
{ &vnop_rename_desc, (VOPFUNC)fifo_rename },
{ &vnop_mkdir_desc, (VOPFUNC)fifo_mkdir },
{ &vnop_rmdir_desc, (VOPFUNC)fifo_rmdir },
{ &vnop_symlink_desc, (VOPFUNC)fifo_symlink },
{ &vnop_readdir_desc, (VOPFUNC)fifo_readdir },
{ &vnop_readlink_desc, (VOPFUNC)fifo_readlink },
{ &vnop_inactive_desc, (VOPFUNC)ufs_inactive },
{ &vnop_reclaim_desc, (VOPFUNC)ffs_reclaim },
{ &vnop_strategy_desc, (VOPFUNC)fifo_strategy },
{ &vnop_pathconf_desc, (VOPFUNC)fifo_pathconf },
{ &vnop_advlock_desc, (VOPFUNC)err_advlock },
{ &vnop_bwrite_desc, (VOPFUNC)vn_bwrite },
{ &vnop_pagein_desc, (VOPFUNC)ffs_pagein },
{ &vnop_pageout_desc, (VOPFUNC)ffs_pageout },
{ &vnop_copyfile_desc, (VOPFUNC)err_copyfile },
{ &vnop_blktooff_desc, (VOPFUNC)ffs_blktooff },
{ &vnop_offtoblk_desc, (VOPFUNC)ffs_offtoblk },
{ &vnop_blockmap_desc, (VOPFUNC)ufs_blockmap },
{ &vnop_kqfilt_add_desc, (VOPFUNC)ufsfifo_kqfilt_add },
{ (struct vnodeop_desc*)NULL, (int(*)())NULL }
};
struct vnodeopv_desc ffs_fifoop_opv_desc =
{ &ffs_fifoop_p, ffs_fifoop_entries };
#endif
int doclusterread = 0;
int doclusterwrite = 0;
#include <ufs/ufs/ufs_readwrite.c>
int
ffs_fsync(ap)
struct vnop_fsync_args *ap;
{
return(ffs_fsync_internal(ap->a_vp, ap->a_waitfor));
}
int
ffs_fsync_internal(vnode_t vp, int waitfor)
{
struct timeval tv;
int wait = (waitfor == MNT_WAIT);
cluster_push(vp, 0);
buf_flushdirtyblks(vp, wait, 0, "ffs_fsync");
microtime(&tv);
return (ffs_update(vp, &tv, &tv, wait));
}
int
ffs_reclaim(ap)
struct vnop_reclaim_args *ap;
{
register struct vnode *vp = ap->a_vp;
int error;
if ( (error = ufs_reclaim(vp, vfs_context_proc(ap->a_context))) )
return (error);
FREE_ZONE(vnode_fsnode(vp), sizeof (struct inode), M_FFSNODE);
vnode_clearfsnode(vp);
return (0);
}
int
ffs_blktooff(ap)
struct vnop_blktooff_args *ap;
{
register struct inode *ip;
register FS *fs;
if (ap->a_vp == NULL)
return (EINVAL);
fs = VTOI(ap->a_vp)->I_FS;
*ap->a_offset = (off_t)lblktosize(fs, ap->a_lblkno);
return (0);
}
int
ffs_offtoblk(ap)
struct vnop_offtoblk_args *ap;
{
register FS *fs;
if (ap->a_vp == NULL)
return (EINVAL);
fs = VTOI(ap->a_vp)->I_FS;
*ap->a_lblkno = (daddr64_t)lblkno(fs, ap->a_offset);
return (0);
}