int osd_compat_seq_init(struct osd_device *osd, int seq) { struct osd_compat_objid_seq *grp; struct osd_compat_objid *map; struct dentry *d; int rc = 0; char name[32]; int i; ENTRY; map = osd->od_ost_map; LASSERT(map); LASSERT(map->root); grp = &map->groups[seq]; if (grp->groot != NULL) RETURN(0); cfs_down(&grp->dir_init_sem); sprintf(name, "%d", seq); d = simple_mkdir(map->root, osd->od_mnt, name, 0755, 1); if (IS_ERR(d)) { rc = PTR_ERR(d); GOTO(out, rc); } else if (d->d_inode == NULL) { rc = -EFAULT; dput(d); GOTO(out, rc); } LASSERT(grp->dirs == NULL); OBD_ALLOC(grp->dirs, sizeof(d) * map->subdir_count); if (grp->dirs == NULL) { dput(d); GOTO(out, rc = -ENOMEM); } grp->groot = d; for (i = 0; i < map->subdir_count; i++) { sprintf(name, "d%d", i); d = simple_mkdir(grp->groot, osd->od_mnt, name, 0755, 1); if (IS_ERR(d)) { rc = PTR_ERR(d); break; } else if (d->d_inode == NULL) { rc = -EFAULT; dput(d); break; } grp->dirs[i] = d; } if (rc) osd_compat_seq_fini(osd, seq); out: cfs_up(&grp->dir_init_sem); RETURN(rc); }
int mgs_fs_setup(struct obd_device *obd, struct vfsmount *mnt) { struct mgs_obd *mgs = &obd->u.mgs; struct lvfs_run_ctxt saved; struct dentry *dentry; int rc; ENTRY; /* FIXME what's this? Do I need it? */ rc = cfs_cleanup_group_info(); if (rc) RETURN(rc); mgs->mgs_vfsmnt = mnt; mgs->mgs_sb = mnt->mnt_root->d_inode->i_sb; rc = fsfilt_setup(obd, mgs->mgs_sb); if (rc) RETURN(rc); OBD_SET_CTXT_MAGIC(&obd->obd_lvfs_ctxt); obd->obd_lvfs_ctxt.pwdmnt = mnt; obd->obd_lvfs_ctxt.pwd = mnt->mnt_root; obd->obd_lvfs_ctxt.fs = get_ds(); obd->obd_lvfs_ctxt.cb_ops = mgs_lvfs_ops; push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); /* Setup the configs dir */ dentry = simple_mkdir(cfs_fs_pwd(current->fs), mnt, MOUNT_CONFIGS_DIR, 0777, 1); if (IS_ERR(dentry)) { rc = PTR_ERR(dentry); CERROR("cannot create %s directory: rc = %d\n", MOUNT_CONFIGS_DIR, rc); GOTO(err_pop, rc); } mgs->mgs_configs_dir = dentry; /* create directory to store nid table versions */ dentry = simple_mkdir(cfs_fs_pwd(current->fs), mnt, MGS_NIDTBL_DIR, 0777, 1); if (IS_ERR(dentry)) { rc = PTR_ERR(dentry); CERROR("cannot create %s directory: rc = %d\n", MOUNT_CONFIGS_DIR, rc); GOTO(err_pop, rc); } else { dput(dentry); } err_pop: pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); return rc; }
/* * directory structure on legacy OST: * * O/<seq>/d0-31/<objid> * O/<seq>/LAST_ID * last_rcvd * LAST_GROUP * CONFIGS * */ int osd_compat_init(struct osd_device *dev) { struct lvfs_run_ctxt new; struct lvfs_run_ctxt save; struct dentry *rootd = osd_sb(dev)->s_root; struct dentry *d; int rc; int i; ENTRY; /* to get subdir count from last_rcvd */ rc = osd_last_rcvd_subdir_count(dev); if (rc <= 0) RETURN(rc); dev->od_ost_map->subdir_count = rc; rc = 0; OBD_ALLOC_PTR(dev->od_ost_map); if (dev->od_ost_map == NULL) RETURN(-ENOMEM); LASSERT(dev->od_fsops); osd_push_ctxt(dev, &new, &save); d = simple_mkdir(rootd, dev->od_mnt, "O", 0755, 1); pop_ctxt(&save, &new, NULL); if (IS_ERR(d)) { OBD_FREE_PTR(dev->od_ost_map); RETURN(PTR_ERR(d)); } dev->od_ost_map->root = d; /* Initialize all groups */ for (i = 0; i < MAX_OBJID_GROUP; i++) { cfs_sema_init(&dev->od_ost_map->groups[i].dir_init_sem, 1); rc = osd_compat_seq_init(dev, i); if (rc) { osd_compat_fini(dev); break; } } RETURN(rc); }
/*mds still need lov setup here*/ static int mds_cmd_setup(struct obd_device *obd, struct lustre_cfg *lcfg) { struct mds_obd *mds = &obd->u.mds; struct lvfs_run_ctxt saved; const char *dev; struct vfsmount *mnt; struct lustre_sb_info *lsi; struct lustre_mount_info *lmi; struct dentry *dentry; int rc = 0; ENTRY; CDEBUG(D_INFO, "obd %s setup \n", obd->obd_name); if (strncmp(obd->obd_name, MDD_OBD_NAME, strlen(MDD_OBD_NAME))) RETURN(0); if (lcfg->lcfg_bufcount < 5) { CERROR("invalid arg for setup %s\n", MDD_OBD_NAME); RETURN(-EINVAL); } dev = lustre_cfg_string(lcfg, 4); lmi = server_get_mount(dev); LASSERT(lmi != NULL); lsi = s2lsi(lmi->lmi_sb); mnt = lmi->lmi_mnt; /* FIXME: MDD LOV initialize objects. * we need only lmi here but not get mount * OSD did mount already, so put mount back */ cfs_atomic_dec(&lsi->lsi_mounts); mntput(mnt); cfs_init_rwsem(&mds->mds_notify_lock); obd->obd_fsops = fsfilt_get_ops(MT_STR(lsi->lsi_ldd)); mds_init_ctxt(obd, mnt); push_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); dentry = simple_mkdir(current->fs->pwd, mnt, "OBJECTS", 0777, 1); if (IS_ERR(dentry)) { rc = PTR_ERR(dentry); CERROR("cannot create OBJECTS directory: rc = %d\n", rc); GOTO(err_putfs, rc); } mds->mds_objects_dir = dentry; dentry = ll_lookup_one_len("__iopen__", current->fs->pwd, strlen("__iopen__")); if (IS_ERR(dentry)) { rc = PTR_ERR(dentry); CERROR("cannot lookup __iopen__ directory: rc = %d\n", rc); GOTO(err_objects, rc); } mds->mds_fid_de = dentry; if (!dentry->d_inode || is_bad_inode(dentry->d_inode)) { rc = -ENOENT; CERROR("__iopen__ directory has no inode? rc = %d\n", rc); GOTO(err_fid, rc); } rc = mds_lov_init_objids(obd); if (rc != 0) { CERROR("cannot init lov objid rc = %d\n", rc); GOTO(err_fid, rc ); } rc = mds_lov_presetup(mds, lcfg); if (rc < 0) GOTO(err_objects, rc); /* Don't wait for mds_postrecov trying to clear orphans */ obd->obd_async_recov = 1; rc = mds_postsetup(obd); /* Bug 11557 - allow async abort_recov start FIXME can remove most of this obd_async_recov plumbing obd->obd_async_recov = 0; */ if (rc) GOTO(err_objects, rc); err_pop: pop_ctxt(&saved, &obd->obd_lvfs_ctxt, NULL); RETURN(rc); err_fid: dput(mds->mds_fid_de); err_objects: dput(mds->mds_objects_dir); err_putfs: fsfilt_put_ops(obd->obd_fsops); goto err_pop; }