Ejemplo n.º 1
0
/** 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);
}
Ejemplo n.º 2
0
/**
 * 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);
}