/** mdd_iocontrol * May be called remotely from mdt_iocontrol_handle or locally from * mdt_iocontrol. Data may be freeform - remote handling doesn't enforce * an obd_ioctl_data format (but local ioctl handler does). * \param cmd - ioc * \param len - data len * \param karg - ioctl data, in kernel space */ static int mdd_iocontrol(const struct lu_env *env, struct md_device *m, unsigned int cmd, int len, void *karg) { struct mdd_device *mdd; struct obd_ioctl_data *data = karg; int rc; ENTRY; mdd = lu2mdd_dev(&m->md_lu_dev); /* Doesn't use obd_ioctl_data */ switch (cmd) { case OBD_IOC_CHANGELOG_CLEAR: { struct changelog_setinfo *cs = karg; rc = mdd_changelog_user_purge(env, mdd, cs->cs_id, cs->cs_recno); RETURN(rc); } case OBD_IOC_GET_MNTOPT: { mntopt_t *mntopts = (mntopt_t *)karg; *mntopts = mdd->mdd_dt_conf.ddp_mntopts; RETURN(0); } case OBD_IOC_START_LFSCK: { rc = lfsck_start(env, mdd->mdd_bottom, (struct lfsck_start_param *)karg); RETURN(rc); } case OBD_IOC_STOP_LFSCK: { rc = lfsck_stop(env, mdd->mdd_bottom, (struct lfsck_stop *)karg); RETURN(rc); } } /* Below ioctls use obd_ioctl_data */ if (len != sizeof(*data)) { CERROR("Bad ioctl size %d\n", len); RETURN(-EINVAL); } if (data->ioc_version != OBD_IOCTL_VERSION) { CERROR("Bad magic %x != %x\n", data->ioc_version, OBD_IOCTL_VERSION); RETURN(-EINVAL); } switch (cmd) { case OBD_IOC_CHANGELOG_REG: rc = mdd_changelog_user_register(env, mdd, &data->ioc_u32_1); break; case OBD_IOC_CHANGELOG_DEREG: rc = mdd_changelog_user_purge(env, mdd, data->ioc_u32_1, MCUD_UNREGISTER); break; default: rc = -ENOTTY; } RETURN (rc); }
/** * Notify all devices in server stack about recovery completion. * * This function calls ldo_recovery_complete() for all lower devices in the * server stack so they will be prepared for normal operations. * * \param[in] env execution environment * \param[in] ofd OFD device * * \retval 0 if successful * \retval negative value on error */ int ofd_postrecov(const struct lu_env *env, struct ofd_device *ofd) { struct lu_device *ldev = &ofd->ofd_dt_dev.dd_lu_dev; struct lfsck_start_param lsp; int rc; CDEBUG(D_HA, "%s: recovery is over\n", ofd_name(ofd)); lsp.lsp_start = NULL; lsp.lsp_index_valid = 0; rc = lfsck_start(env, ofd->ofd_osd, &lsp); if (rc != 0 && rc != -EALREADY) CWARN("%s: auto trigger paused LFSCK failed: rc = %d\n", ofd_name(ofd), rc); return ldev->ld_ops->ldo_recovery_complete(env, ldev); }