Exemplo n.º 1
0
/*
 * File table vnode fcntl routine.
 */
static int
vn_fcntl(file_t *fp, u_int com, void *data)
{
	struct vnode *vp = fp->f_data;
	int error;

	error = VOP_FCNTL(vp, com, data, fp->f_flag, kauth_cred_get());
	return (error);
}
Exemplo n.º 2
0
int
RUMP_VOP_FCNTL(struct vnode *vp,
    u_int command,
    void *data,
    int fflag,
    struct kauth_cred *cred)
{
	int error;

	rump_schedule();
	error = VOP_FCNTL(vp, command, data, fflag, cred);
	rump_unschedule();

	return error;
}
Exemplo n.º 3
0
static void
dm_query_fsys_for_vector(
    bhv_desc_t	*bdp)
{
    dm_vector_map_t	*map;
    fsys_function_vector_t	*vecp;
    dm_fsys_vector_t  *vptr;
    dm_fcntl_t	dmfcntl;
    vnode_t		*vp = BHV_TO_VNODE(bdp);
    struct vfs      *vfsp = vp->v_vfsp;
    int		fstype;
    int		error;
    int		i;

    fstype = vfsp->vfs_fstype;
    map = &dm_fsys_map[fstype];

    /* Clear out any information left from a previous filesystem that was
       in this slot and initialize it for the new filesystem.
    */

    if (map->vptr) {
        kmem_free(map->vptr, sizeof(*map->vptr));
        map->vptr = NULL;
    }
#ifdef __sgi
    strcpy(map->name, vfssw[fstype].vsw_name);
#else
    /* XXX */
    strcpy(map->name, XFS_NAME);
#endif
    map->support_type = DM_SUPPORT_AVAIL;

    /* Next allocate a function vector and initialize all fields with a
       dummy function that returns ENOSYS.
    */

    vptr = map->vptr = kmem_alloc(sizeof(*map->vptr), KM_SLEEP);

    strncpy(vptr->fsys_name, map->name, sizeof(vptr->fsys_name));
    vptr->code_level = 0;
    vptr->clear_inherit = (dm_fsys_clear_inherit_t)dm_enosys;
    vptr->create_by_handle = (dm_fsys_create_by_handle_t)dm_enosys;
    vptr->downgrade_right = (dm_fsys_downgrade_right_t)dm_enosys;
    vptr->get_allocinfo_rvp = (dm_fsys_get_allocinfo_rvp_t)dm_enosys;
    vptr->get_bulkall_rvp = (dm_fsys_get_bulkall_rvp_t)dm_enosys;
    vptr->get_bulkattr_rvp = (dm_fsys_get_bulkattr_rvp_t)dm_enosys;
    vptr->get_config = (dm_fsys_get_config_t)dm_enosys;
    vptr->get_config_events = (dm_fsys_get_config_events_t)dm_enosys;
    vptr->get_destroy_dmattr = (dm_fsys_get_destroy_dmattr_t)dm_enosys;
    vptr->get_dioinfo = (dm_fsys_get_dioinfo_t)dm_enosys;
    vptr->get_dirattrs_rvp = (dm_fsys_get_dirattrs_rvp_t)dm_enosys;
    vptr->get_dmattr = (dm_fsys_get_dmattr_t)dm_enosys;
    vptr->get_eventlist = (dm_fsys_get_eventlist_t)dm_enosys;
    vptr->get_fileattr = (dm_fsys_get_fileattr_t)dm_enosys;
    vptr->get_region = (dm_fsys_get_region_t)dm_enosys;
    vptr->getall_dmattr = (dm_fsys_getall_dmattr_t)dm_enosys;
    vptr->getall_inherit = (dm_fsys_getall_inherit_t)dm_enosys;
    vptr->init_attrloc = (dm_fsys_init_attrloc_t)dm_enosys;
    vptr->mkdir_by_handle = (dm_fsys_mkdir_by_handle_t)dm_enosys;
    vptr->probe_hole = (dm_fsys_probe_hole_t)dm_enosys;
    vptr->punch_hole = (dm_fsys_punch_hole_t)dm_enosys;
    vptr->read_invis_rvp = (dm_fsys_read_invis_rvp_t)dm_enosys;
    vptr->release_right = (dm_fsys_release_right_t)dm_enosys;
    vptr->request_right = (dm_fsys_request_right_t)dm_enosys;
    vptr->remove_dmattr = (dm_fsys_remove_dmattr_t)dm_enosys;
    vptr->set_dmattr = (dm_fsys_set_dmattr_t)dm_enosys;
    vptr->set_eventlist = (dm_fsys_set_eventlist_t)dm_enosys;
    vptr->set_fileattr = (dm_fsys_set_fileattr_t)dm_enosys;
    vptr->set_inherit = (dm_fsys_set_inherit_t)dm_enosys;
    vptr->set_region = (dm_fsys_set_region_t)dm_enosys;
    vptr->symlink_by_handle = (dm_fsys_symlink_by_handle_t)dm_enosys;
    vptr->sync_by_handle = (dm_fsys_sync_by_handle_t)dm_enosys;
    vptr->upgrade_right = (dm_fsys_upgrade_right_t)dm_enosys;
    vptr->write_invis_rvp = (dm_fsys_write_invis_rvp_t)dm_enosys;

    /* Issue a F_DMAPI fcntl() to the filesystem in order to obtain its
       vector of filesystem-specific DMAPI routines.
    */

    dmfcntl.dmfc_subfunc = DM_FCNTL_FSYSVECTOR;
    dmfcntl.u_fcntl.vecrq.count = 0;
    dmfcntl.u_fcntl.vecrq.vecp = NULL;

#ifdef __sgi
    VOP_FCNTL(vp, F_DMAPI, &dmfcntl, 0, 0, DM_GET_CRED, NULL, error);
#else
    error = xfs_dm_fcntl(bdp, &dmfcntl, 0, 0, DM_GET_CRED, NULL);
#endif

    /* If we still have an error at this point, then the filesystem simply
       does not support DMAPI, so we give up with all functions set to
       ENOSYS.
    */

    if (error || dmfcntl.u_fcntl.vecrq.count == 0)
        return;

    /* The request succeeded and we were given a vector which we need to
       map to our current level.  Overlay the dummy function with every
       filesystem function we understand.
    */

    vptr->code_level = dmfcntl.u_fcntl.vecrq.code_level;
    vecp = dmfcntl.u_fcntl.vecrq.vecp;
    for (i = 0; i < dmfcntl.u_fcntl.vecrq.count; i++) {
        switch (vecp[i].func_no) {
        case DM_FSYS_CLEAR_INHERIT:
            vptr->clear_inherit = vecp[i].u_fc.clear_inherit;
            break;
        case DM_FSYS_CREATE_BY_HANDLE:
            vptr->create_by_handle = vecp[i].u_fc.create_by_handle;
            break;
        case DM_FSYS_DOWNGRADE_RIGHT:
            vptr->downgrade_right = vecp[i].u_fc.downgrade_right;
            break;
        case DM_FSYS_GET_ALLOCINFO_RVP:
            vptr->get_allocinfo_rvp = vecp[i].u_fc.get_allocinfo_rvp;
            break;
        case DM_FSYS_GET_BULKALL_RVP:
            vptr->get_bulkall_rvp = vecp[i].u_fc.get_bulkall_rvp;
            break;
        case DM_FSYS_GET_BULKATTR_RVP:
            vptr->get_bulkattr_rvp = vecp[i].u_fc.get_bulkattr_rvp;
            break;
        case DM_FSYS_GET_CONFIG:
            vptr->get_config = vecp[i].u_fc.get_config;
            break;
        case DM_FSYS_GET_CONFIG_EVENTS:
            vptr->get_config_events = vecp[i].u_fc.get_config_events;
            break;
        case DM_FSYS_GET_DESTROY_DMATTR:
            vptr->get_destroy_dmattr = vecp[i].u_fc.get_destroy_dmattr;
            break;
        case DM_FSYS_GET_DIOINFO:
            vptr->get_dioinfo = vecp[i].u_fc.get_dioinfo;
            break;
        case DM_FSYS_GET_DIRATTRS_RVP:
            vptr->get_dirattrs_rvp = vecp[i].u_fc.get_dirattrs_rvp;
            break;
        case DM_FSYS_GET_DMATTR:
            vptr->get_dmattr = vecp[i].u_fc.get_dmattr;
            break;
        case DM_FSYS_GET_EVENTLIST:
            vptr->get_eventlist = vecp[i].u_fc.get_eventlist;
            break;
        case DM_FSYS_GET_FILEATTR:
            vptr->get_fileattr = vecp[i].u_fc.get_fileattr;
            break;
        case DM_FSYS_GET_REGION:
            vptr->get_region = vecp[i].u_fc.get_region;
            break;
        case DM_FSYS_GETALL_DMATTR:
            vptr->getall_dmattr = vecp[i].u_fc.getall_dmattr;
            break;
        case DM_FSYS_GETALL_INHERIT:
            vptr->getall_inherit = vecp[i].u_fc.getall_inherit;
            break;
        case DM_FSYS_INIT_ATTRLOC:
            vptr->init_attrloc = vecp[i].u_fc.init_attrloc;
            break;
        case DM_FSYS_MKDIR_BY_HANDLE:
            vptr->mkdir_by_handle = vecp[i].u_fc.mkdir_by_handle;
            break;
        case DM_FSYS_PROBE_HOLE:
            vptr->probe_hole = vecp[i].u_fc.probe_hole;
            break;
        case DM_FSYS_PUNCH_HOLE:
            vptr->punch_hole = vecp[i].u_fc.punch_hole;
            break;
        case DM_FSYS_READ_INVIS_RVP:
            vptr->read_invis_rvp = vecp[i].u_fc.read_invis_rvp;
            break;
        case DM_FSYS_RELEASE_RIGHT:
            vptr->release_right = vecp[i].u_fc.release_right;
            break;
        case DM_FSYS_REMOVE_DMATTR:
            vptr->remove_dmattr = vecp[i].u_fc.remove_dmattr;
            break;
        case DM_FSYS_REQUEST_RIGHT:
            vptr->request_right = vecp[i].u_fc.request_right;
            break;
        case DM_FSYS_SET_DMATTR:
            vptr->set_dmattr = vecp[i].u_fc.set_dmattr;
            break;
        case DM_FSYS_SET_EVENTLIST:
            vptr->set_eventlist = vecp[i].u_fc.set_eventlist;
            break;
        case DM_FSYS_SET_FILEATTR:
            vptr->set_fileattr = vecp[i].u_fc.set_fileattr;
            break;
        case DM_FSYS_SET_INHERIT:
            vptr->set_inherit = vecp[i].u_fc.set_inherit;
            break;
        case DM_FSYS_SET_REGION:
            vptr->set_region = vecp[i].u_fc.set_region;
            break;
        case DM_FSYS_SYMLINK_BY_HANDLE:
            vptr->symlink_by_handle = vecp[i].u_fc.symlink_by_handle;
            break;
        case DM_FSYS_SYNC_BY_HANDLE:
            vptr->sync_by_handle = vecp[i].u_fc.sync_by_handle;
            break;
        case DM_FSYS_UPGRADE_RIGHT:
            vptr->upgrade_right = vecp[i].u_fc.upgrade_right;
            break;
        case DM_FSYS_WRITE_INVIS_RVP:
            vptr->write_invis_rvp = vecp[i].u_fc.write_invis_rvp;
            break;
        default:		/* ignore ones we don't understand */
            break;
        }
    }
}