#include <sys/types.h>
#include <sys/systm.h>
#include <sys/errno.h>
#include <sys/vfs.h>
#include <sys/vnode.h>
#include <sys/mount.h>
#include <sys/cmn_err.h>
#include <sys/debug.h>
#if 0
#include <sys/user.h>
#include <sys/vm.h>
#include <sys/conf.h>
#include <sys/class.h>
#include <sys/systm.h>
#include <sys/modctl.h>
#include <sys/exec.h>
#include <sys/exechdr.h>
#include <sys/devops.h>
#include <sys/ddi.h>
#include <sys/sunddi.h>
#include <sys/hwconf.h>
#include <sys/ddi_impldefs.h>
#include <sys/autoconf.h>
#include <sys/disp.h>
#include <sys/kmem.h>
#include <sys/instance.h>
#include <sys/modhash.h>
#include <sys/dacf.h>
#include <ipp/ipp.h>
#include <sys/strsubr.h>
#include <sys/kcpc.h>
#include <sys/brand.h>
#include <sys/cpc_pcbe.h>
#include <sys/kstat.h>
#include <sys/socketvar.h>
#include <sys/kiconv.h>
#endif
#include <libfksmbfs.h>
int
fake_installfs(vfsdef_t *def)
{
struct vfssw *vswp;
char *fsname = def->name;
int fstype;
int allocated;
int err;
if (def->def_version != VFSDEF_VERSION) {
cmn_err(CE_WARN, "file system '%s' version mismatch", fsname);
return (ENXIO);
}
allocated = 0;
WLOCK_VFSSW();
if ((vswp = vfs_getvfsswbyname(fsname)) == NULL) {
if ((vswp = allocate_vfssw(fsname)) == NULL) {
WUNLOCK_VFSSW();
cmn_err(CE_WARN, "no room for '%s' in vfssw!", fsname);
return (ENXIO);
}
allocated = 1;
}
ASSERT(vswp != NULL);
fstype = vswp - vfssw;
vswp->vsw_flag = def->flags & ~(VSW_STATS);
if (def->flags & VSW_HASPROTO) {
vfs_mergeopttbl(&vfs_mntopts, def->optproto,
&vswp->vsw_optproto);
} else {
vfs_copyopttbl(&vfs_mntopts, &vswp->vsw_optproto);
}
if (def->flags & VSW_CANRWRO) {
vswp->vsw_flag |= VSW_CANREMOUNT;
}
if (def->init == NULL)
err = EFAULT;
else
err = (*(def->init))(fstype, fsname);
if (err != 0) {
if (allocated) {
kmem_free(vswp->vsw_name, strlen(vswp->vsw_name)+1);
vswp->vsw_name = "";
}
vswp->vsw_flag = 0;
vswp->vsw_init = NULL;
}
vfs_unrefvfssw(vswp);
WUNLOCK_VFSSW();
return (err);
}
int fake_removefs_allowed = 1;
int
fake_removefs(vfsdef_t *def)
{
struct vfssw *vswp;
if (fake_removefs_allowed == 0)
return (EBUSY);
WLOCK_VFSSW();
if ((vswp = vfs_getvfsswbyname(def->name)) == NULL) {
WUNLOCK_VFSSW();
cmn_err(CE_WARN, "fake_removefs: %s not in vfssw",
def->name);
return (EINVAL);
}
if (vswp->vsw_count != 1) {
vfs_unrefvfssw(vswp);
WUNLOCK_VFSSW();
return (EBUSY);
}
if (vfs_opsinuse(&vswp->vsw_vfsops)) {
vfs_unrefvfssw(vswp);
WUNLOCK_VFSSW();
return (EBUSY);
}
vfs_freeopttbl(&vswp->vsw_optproto);
vswp->vsw_optproto.mo_count = 0;
vswp->vsw_flag = 0;
vswp->vsw_init = NULL;
vfs_unrefvfssw(vswp);
WUNLOCK_VFSSW();
return (0);
}