-static int sm_mount_cache(struct super_block *sb, char *devstr,
- char *typestr, char *opts, int iopen_nopriv)
-{
- struct smfs_super_info *smb;
- int err = 0, typelen;
- struct vfsmount *mnt;
- unsigned long page;
- ENTRY;
-
- typelen = strlen(typestr);
-
- page = __get_free_page(GFP_KERNEL);
- if (!page)
- GOTO(err_out, err = -ENOMEM);
-
- memset((void *)page, 0, PAGE_SIZE);
-
- if (iopen_nopriv)
- sprintf((char *)page, "iopen_nopriv");
-
- if (opts && strlen(opts)) {
- int n = strlen((char *)page);
- sprintf((char *)page + n, ",%s", opts);
- }
-
- printk("smfs: mounting %s at %s\n", typestr, devstr);
-
- mnt = do_kern_mount(typestr, 0, devstr, (void *)page);
- free_page(page);
-
- if (IS_ERR(mnt)) {
- CERROR("do_kern_mount failed: rc = %ld\n", PTR_ERR(mnt));
- GOTO(err_out, err = PTR_ERR(mnt));
- }
- smb = S2SMI(sb);
- smb->smsi_sb = mnt->mnt_sb;
- smb->smsi_mnt = mnt;
-
- smfs_init_sm_ops(smb);
-
- OBD_ALLOC(smb->smsi_cache_ftype, strlen(typestr) + 1);
- memcpy(smb->smsi_cache_ftype, typestr, strlen(typestr));
-
- OBD_ALLOC(smb->smsi_ftype, strlen(SMFS_TYPE) + 1);
- memcpy(smb->smsi_ftype, SMFS_TYPE, strlen(SMFS_TYPE));
-
- duplicate_sb(sb, mnt->mnt_sb);
- sm_set_sb_ops(mnt->mnt_sb, sb);
- err = smfs_init_fsfilt_ops(sb);
-err_out:
- return err;
-}