Exemplo n.º 1
0
/*ARGSUSED*/
static int
zfs_vfsinit(int fstype, char *name)
{
	int error;

	zfsfstype = fstype;

	/*
	 * Setup vfsops and vnodeops tables.
	 */
	error = vfs_setfsops(fstype, zfs_vfsops_template, &zfs_vfsops);
	if (error != 0) {
		cmn_err(CE_WARN, "zfs: bad vfs ops template");
	}

	error = zfs_create_op_tables();
	if (error) {
		zfs_remove_op_tables();
		cmn_err(CE_WARN, "zfs: bad vnode ops template");
		(void) vfs_freevfsops_by_type(zfsfstype);
		return (error);
	}

	mutex_init(&zfs_dev_mtx, NULL, MUTEX_DEFAULT, NULL);

	/*
	 * Unique major number for all zfs mounts.
	 * If we run out of 32-bit minors, we'll getudev() another major.
	 */
	zfs_major = ddi_name_to_major(ZFS_DRIVER);
	zfs_minor = ZFS_MIN_MINOR;

	return (0);
}
Exemplo n.º 2
0
/* ARGSUSED */
static int
objfs_init(int fstype, char *name)
{
	vfsops_t *vfsops;
	int error;

	objfs_fstype = fstype;
	if (error = vfs_setfsops(fstype, objfs_vfstops, &vfsops)) {
		cmn_err(CE_WARN, "objfs_init: bad vfs ops template");
		return (error);
	}

	if (error = gfs_make_opsvec(objfs_opsvec)) {
		(void) vfs_freevfsops(vfsops);
		return (error);
	}

	if ((objfs_major = getudev()) == (major_t)-1) {
		cmn_err(CE_WARN, "objfs_init: can't get unique device number");
		objfs_major = 0;
	}

	objfs_data_init();

	return (0);
}
Exemplo n.º 3
0
int
VMBlockInit(int fstype,    // IN: file system type
            char *name)    // IN: Name of the file system
{
   int ret;
   static const fs_operation_def_t vfsOpsArr[] = {
      VMBLOCK_VOP(VFSNAME_MOUNT, vfs_mount, VMBlockMount),
      VMBLOCK_VOP(VFSNAME_UNMOUNT, vfs_unmount, VMBlockUnmount),
      VMBLOCK_VOP(VFSNAME_ROOT, vfs_root, VMBlockRoot),
      VMBLOCK_VOP(VFSNAME_STATVFS, vfs_statvfs, VMBlockStatvfs),
      { NULL }
   };

   if (!name) {
      Warning("VMBlockInit: received NULL input from kernel.\n");
      return EINVAL;
   }

   Debug(VMBLOCK_ENTRY_LOGLEVEL, "VMBlockInit: fstype=%d, name=\"%s\"\n", fstype, name);

   /*
    * Set our file system type and the vfs operations in the kernel's VFS
    * switch table.
    */
   vmblockType = fstype;

   ret = vfs_setfsops(vmblockType, vfsOpsArr, &vmblockVfsOps);
   if (ret) {
      Warning("VMBlockInit: could not set vfs operations.\n");
      return ret;
   }

   ret = vn_make_ops(name, vnodeOpsArr, &vmblockVnodeOps);
   if (ret) {
      Warning("VMBlockInit: could not create vnode operations.\n");
      /*
       * It's important not to call vfs_freevfsops() here; that's only for
       * freeing ops created with vfs_makefsops().
       */
      vfs_freevfsops_by_type(vmblockType);
      return ret;
   }

   /*
    * We need to find a unique device number for this instance of the module;
    * it will be used at each mount to secure a unique device number and file
    * system identifier.  If one cannot be located, we'll just use zero like
    * other Solaris file systems.
    */
   if ((vmblockMajor = getudev()) == (major_t)-1) {
        Warning("VMBlockInit: could not obtain unique device.\n");
        vmblockMajor = 0;
   }
   vmblockMinor = 0;
   mutex_init(&vmblockMutex, NULL, MUTEX_DEFAULT, NULL);

   return 0;
}
Exemplo n.º 4
0
iumfs_init(struct vfssw *iumfs_vfssw, int fstype)
#endif
{
    int err;

    DEBUG_PRINT((CE_CONT, "iumfs_init called\n"));
    DEBUG_PRINT((CE_CONT, "iumfs_init: fstype = %d(0x%x)\n", fstype, fstype));

    iumfs_fstype = fstype;

#ifdef SOL10
    do {
        err = vfs_setfsops(fstype, iumfs_vfs_ops_def_array, &iumfs_vfsops);
        if (err)
            break;
        err = vn_make_ops(fsname, iumfs_vnode_ops_def_array, &iumfs_vnodeops);
        if (err)
            break;
    } while (FALSE);

    if (err) {
        if (iumfs_vfsops != NULL) {
            vfs_freevfsops_by_type(fstype);
        }
        if (iumfs_vnodeops != NULL) {
            vn_freevnodeops(iumfs_vnodeops);
        }
    }
#endif
    /* 
     * filesystem id に使うデバイス番号を決める。
     */
    iumfs_major = getudev();
    DEBUG_PRINT((CE_CONT, "iumfs_init: major = %d(0x%x)\n", iumfs_major, iumfs_major));
    DEBUG_PRINT((CE_CONT, "iumfs_init: return(%d)\n", err));
    return (err);
}
Exemplo n.º 5
0
int
smbfsinit(int fstyp, char *name)
{
	int		error;

	error = vfs_setfsops(fstyp, smbfs_vfsops_template, &smbfs_vfsops);
	if (error != 0) {
		zcmn_err(GLOBAL_ZONEID, CE_WARN,
		    "smbfsinit: bad vfs ops template");
		return (error);
	}

	error = vn_make_ops(name, smbfs_vnodeops_template, &smbfs_vnodeops);
	if (error != 0) {
		(void) vfs_freevfsops_by_type(fstyp);
		zcmn_err(GLOBAL_ZONEID, CE_WARN,
		    "smbfsinit: bad vnode ops template");
		return (error);
	}

	smbfsfstyp = fstyp;

	return (0);
}
Exemplo n.º 6
0
static int
hsfsinit(int fstype, char *name)
{
	static const fs_operation_def_t hsfs_vfsops_template[] = {
		VFSNAME_MOUNT,		{ .vfs_mount = hsfs_mount },
		VFSNAME_UNMOUNT,	{ .vfs_unmount = hsfs_unmount },
		VFSNAME_ROOT,		{ .vfs_root = hsfs_root },
		VFSNAME_STATVFS,	{ .vfs_statvfs = hsfs_statvfs },
		VFSNAME_VGET,		{ .vfs_vget = hsfs_vget },
		VFSNAME_MOUNTROOT,	{ .vfs_mountroot = hsfs_mountroot },
		NULL,			NULL
	};
	int error;

	error = vfs_setfsops(fstype, hsfs_vfsops_template, NULL);
	if (error != 0) {
		cmn_err(CE_WARN, "hsfsinit: bad vfs ops template");
		return (error);
	}

	error = vn_make_ops(name, hsfs_vnodeops_template, &hsfs_vnodeops);
	if (error != 0) {
		(void) vfs_freevfsops_by_type(fstype);
		cmn_err(CE_WARN, "hsfsinit: bad vnode ops template");
		return (error);
	}

	hsfsfstype = fstype;
	mutex_init(&hs_mounttab_lock, NULL, MUTEX_DEFAULT, NULL);
	hs_init_hsnode_cache();
Exemplo n.º 7
0
static int
lofsinit(int fstyp, char *name)
{
    static const fs_operation_def_t lo_vfsops_template[] = {
        VFSNAME_MOUNT,		{ .vfs_mount = lo_mount },
        VFSNAME_UNMOUNT,	{ .vfs_unmount = lo_unmount },
        VFSNAME_ROOT,		{ .vfs_root = lo_root },
        VFSNAME_STATVFS,	{ .vfs_statvfs = lo_statvfs },
        VFSNAME_SYNC,		{ .vfs_sync = lo_sync },
        VFSNAME_VGET,		{ .vfs_vget = lo_vget },
        VFSNAME_FREEVFS,	{ .vfs_freevfs = lo_freevfs },
        NULL,			NULL
    };
    int error;

    error = vfs_setfsops(fstyp, lo_vfsops_template, &lo_vfsops);
    if (error != 0) {
        cmn_err(CE_WARN, "lofsinit: bad vfs ops template");
        return (error);
    }

    error = vn_make_ops(name, lo_vnodeops_template, &lo_vnodeops);
    if (error != 0) {
        (void) vfs_freevfsops_by_type(fstyp);
        cmn_err(CE_WARN, "lofsinit: bad vnode ops template");
        return (error);
    }

    lofsfstype = fstyp;

    return (0);
Exemplo n.º 8
0
nfsinit(int fstyp, char *name)
{
	static const fs_operation_def_t nfs_vfsops_template[] = {
		VFSNAME_MOUNT,		{ .vfs_mount = nfs_mount },
		VFSNAME_UNMOUNT,	{ .vfs_unmount = nfs_unmount },
		VFSNAME_ROOT,		{ .vfs_root = nfs_root },
		VFSNAME_STATVFS,	{ .vfs_statvfs = nfs_statvfs },
		VFSNAME_SYNC,		{ .vfs_sync = nfs_sync },
		VFSNAME_VGET,		{ .vfs_vget = nfs_vget },
		VFSNAME_MOUNTROOT,	{ .vfs_mountroot = nfs_mountroot },
		VFSNAME_FREEVFS,	{ .vfs_freevfs = nfs_freevfs },
		NULL,			NULL
	};
	int error;

	error = vfs_setfsops(fstyp, nfs_vfsops_template, &nfs_vfsops);
	if (error != 0) {
		zcmn_err(GLOBAL_ZONEID, CE_WARN,
		    "nfsinit: bad vfs ops template");
		return (error);
	}

	error = vn_make_ops(name, nfs_vnodeops_template, &nfs_vnodeops);
	if (error != 0) {
		(void) vfs_freevfsops_by_type(fstyp);
		zcmn_err(GLOBAL_ZONEID, CE_WARN,
		    "nfsinit: bad vnode ops template");
		return (error);
	}

Exemplo n.º 9
0
{
	static const fs_operation_def_t auto_vfsops_template[] = {
		VFSNAME_MOUNT,		{ .vfs_mount = auto_mount },
		VFSNAME_UNMOUNT,	{ .vfs_unmount = auto_unmount },
		VFSNAME_ROOT,		{ .vfs_root = auto_root },
		VFSNAME_STATVFS,	{ .vfs_statvfs = auto_statvfs },
		NULL,			NULL
	};
	int error;

	autofs_fstype = fstype;
	ASSERT(autofs_fstype != 0);
	/*
	 * Associate VFS ops vector with this fstype
	 */
	error = vfs_setfsops(fstype, auto_vfsops_template, NULL);
	if (error != 0) {
		cmn_err(CE_WARN, "autofs_init: bad vfs ops template");
		return (error);
	}

	error = vn_make_ops(name, auto_vnodeops_template, &auto_vnodeops);
	if (error != 0) {
		(void) vfs_freevfsops_by_type(fstype);
		cmn_err(CE_WARN, "autofs_init: bad vnode ops template");
		return (error);
	}

	mutex_init(&autofs_minor_lock, NULL, MUTEX_DEFAULT, NULL);
	/*
	 * Assign unique major number for all autofs mounts
Exemplo n.º 10
0
devinit(int fstype, char *name)
{
	static const fs_operation_def_t dev_vfsops_tbl[] = {
		VFSNAME_MOUNT,		{ .vfs_mount = sdev_mount },
		VFSNAME_UNMOUNT,	{ .vfs_unmount = sdev_unmount },
		VFSNAME_ROOT, 		{ .vfs_root = sdev_root },
		VFSNAME_STATVFS,	{ .vfs_statvfs = sdev_statvfs },
		NULL,			NULL
	};

	int	error;
	extern major_t getudev(void);

	devtype = fstype;

	error = vfs_setfsops(fstype, dev_vfsops_tbl, NULL);
	if (error != 0) {
		cmn_err(CE_WARN, "devinit: bad vfs ops tbl");
		return (error);
	}

	error = vn_make_ops("dev", sdev_vnodeops_tbl, &sdev_vnodeops);
	if (error != 0) {
		(void) vfs_freevfsops_by_type(fstype);
		cmn_err(CE_WARN, "devinit: bad vnode ops tbl");
		return (error);
	}

	if ((devmajor = getudev()) == (major_t)-1) {
		cmn_err(CE_WARN, "%s: can't get unique dev", sdev_vfssw.name);
		return (1);
Exemplo n.º 11
0
/*
 * Save file system type/index, initialize vfs operations vector, get
 * unique device number for FIFOFS and initialize the FIFOFS hash.
 * Create and initialize a "generic" vfs pointer that will be placed
 * in the v_vfsp field of each pipe's vnode.
 */
int
fifoinit(int fstype, char *name)
{
	static const fs_operation_def_t fifo_vfsops_template[] = {
		NULL, NULL
	};
	int error;
	major_t dev;

	fifofstype = fstype;
	error = vfs_setfsops(fstype, fifo_vfsops_template, &fifo_vfsops);
	if (error != 0) {
		cmn_err(CE_WARN, "fifoinit: bad vfs ops template");
		return (error);
	}

	error = vn_make_ops(name, fifo_vnodeops_template, &fifo_vnodeops);
	if (error != 0) {
		(void) vfs_freevfsops_by_type(fstype);
		cmn_err(CE_WARN, "fifoinit: bad vnode ops template");
		return (error);
	}

	if ((dev = getudev()) == (major_t)-1) {
		cmn_err(CE_WARN, "fifoinit: can't get unique device number");
		dev = 0;
	}
	fifodev = makedevice(dev, 0);

	fifovfsp = kmem_zalloc(sizeof (struct vfs), KM_SLEEP);
	fifovfsp->vfs_next = NULL;
	vfs_setops(fifovfsp, fifo_vfsops);
	fifovfsp->vfs_vnodecovered = NULL;
	fifovfsp->vfs_flag = 0;
	fifovfsp->vfs_bsize = 1024;
	fifovfsp->vfs_fstype = fifofstype;
	vfs_make_fsid(&fifovfsp->vfs_fsid, fifodev, fifofstype);
	fifovfsp->vfs_data = NULL;
	fifovfsp->vfs_dev = fifodev;
	fifovfsp->vfs_bcount = 0;

	/*
	 * It is necessary to initialize vfs_count here to 1.
	 * This prevents the fifovfsp from getting freed when
	 * a thread does a VFS_HOLD followed by a VFS_RELE
	 * on the fifovfsp
	 *
	 * The fifovfsp should never be freed.
	 */
	fifovfsp->vfs_count = 1;

	mutex_init(&ftable_lock, NULL, MUTEX_DEFAULT, NULL);
	mutex_init(&fino_lock, NULL, MUTEX_DEFAULT, NULL);

	/*
	 * vnodes are cached aligned
	 */
	fnode_cache = kmem_cache_create("fnode_cache",
	    sizeof (fifodata_t) - sizeof (fifonode_t), 32,
	    fnode_constructor, fnode_destructor, NULL,
	    (void *)(sizeof (fifodata_t) - sizeof (fifonode_t)), NULL, 0);

	pipe_cache = kmem_cache_create("pipe_cache", sizeof (fifodata_t), 32,
	    pipe_constructor, pipe_destructor, NULL,
	    (void *)(sizeof (fifodata_t)), NULL, 0);

#if FIFODEBUG
	if (Fifohiwat < FIFOHIWAT)
		Fifohiwat = FIFOHIWAT;
#endif /* FIFODEBUG */
	fifo_strdata.qi_minfo->mi_hiwat = Fifohiwat;

	return (0);
}
Exemplo n.º 12
0
		VFSNAME_UNMOUNT,	{ .vfs_unmount = nm_unmount },
		VFSNAME_ROOT,		{ .vfs_root = nm_root },
		VFSNAME_STATVFS,	{ .vfs_statvfs = nm_statvfs },
		VFSNAME_SYNC,		{ .vfs_sync = nm_sync },
		NULL,			NULL
	};
	static const fs_operation_def_t nm_dummy_vfsops_template[] = {
		VFSNAME_STATVFS,	{ .vfs_statvfs = nm_statvfs },
		VFSNAME_SYNC,		{ .vfs_sync = nm_sync },
		NULL,			NULL
	};
	int error;
	int dev;
	vfsops_t *dummy_vfsops;

	error = vfs_setfsops(fstype, nm_vfsops_template, &namefs_vfsops);
	if (error != 0) {
		cmn_err(CE_WARN, "nameinit: bad vfs ops template");
		return (error);
	}

	error = vfs_makefsops(nm_dummy_vfsops_template, &dummy_vfsops);
	if (error != 0) {
		(void) vfs_freevfsops_by_type(fstype);
		cmn_err(CE_WARN, "nameinit: bad dummy vfs ops template");
		return (error);
	}

	error = vn_make_ops(name, nm_vnodeops_template, &nm_vnodeops);
	if (error != 0) {
		(void) vfs_freevfsops_by_type(fstype);