Add consistent CDEBUG() messages for iocontrol handlers.
Add helpers OBD_IOC_ERROR() and OBD_IOC_DEBUG() to print the
iocontrol parameters consistently in case of an error.
Signed-off-by: Andreas Dilger <adilger@whamcloud.com>
Change-Id: I1a0d2f839949debf346aa15c65b0f407e2ce7057
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/50334
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Arshad Hussain <arshad.hussain@aeoncomputing.com>
Reviewed-by: Vitaliy Kuznetsov <vkuznetsov@ddn.com>
Reviewed-by: jsimmons <jsimmons@infradead.org>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
return _get_attr_matches(typ, name, len, _attr_name_starts_with);
}
+int obd_ioctl_msg(const char *file, const char *func, int line, int level,
+ const char *name, unsigned int cmd, const char *msg, int rc);
+#define OBD_IOC_DEBUG(level, dev, cmd, msg, rc) \
+ obd_ioctl_msg(__FILE__, __func__, __LINE__, level, dev, cmd, msg, rc)
+#define OBD_IOC_ERROR(dev, cmd, msg, rc) \
+ obd_ioctl_msg(__FILE__, __func__, __LINE__, D_ERROR, dev, cmd, msg, rc)
+
#endif /* __LINUX_OBD_CLASS_H */
int rc = 0;
ENTRY;
- CDEBUG(D_VFSTRACE, "VFS Op:inode="DFID"(%p), cmd=%#x\n",
- PFID(ll_inode2fid(inode)), inode, cmd);
+ CDEBUG(D_VFSTRACE|D_IOCTL, "VFS Op:inode="DFID"(%pK) cmd=%x arg=%lx\n",
+ PFID(ll_inode2fid(inode)), inode, cmd, arg);
/* asm-ppc{,64} declares TCGETS, et. al. as type 't' not 'T' */
if (_IOC_TYPE(cmd) == 'T' || _IOC_TYPE(cmd) == 't') /* tty ioctls */
rc = obd_get_info(NULL, exp, sizeof(KEY_TGT_COUNT),
KEY_TGT_COUNT, &vallen, &count);
if (rc) {
- CERROR("get target count failed: %d\n", rc);
+ CERROR("%s: get target count failed: rc = %d\n",
+ sbi->ll_fsname, rc);
RETURN(rc);
}
int flags, rc;
ENTRY;
- CDEBUG(D_VFSTRACE, "VFS Op:inode="DFID"(%p), cmd=%x\n",
- PFID(ll_inode2fid(inode)), inode, cmd);
+ CDEBUG(D_VFSTRACE|D_IOCTL, "VFS Op:inode="DFID"(%pK) cmd=%x arg=%lx\n",
+ PFID(ll_inode2fid(inode)), inode, cmd, arg);
ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_IOCTL, 1);
/* asm-ppc{,64} declares TCGETS, et. al. as type 't' not 'T' */
if (cmd == LL_IOC_SETFLAGS) {
if ((flags & LL_FILE_IGNORE_LOCK) &&
!(file->f_flags & O_DIRECT)) {
- CERROR("%s: unable to disable locking on "
- "non-O_DIRECT file\n", current->comm);
- RETURN(-EINVAL);
+ rc = -EINVAL;
+ CERROR("%s: unable to disable locking on non-O_DIRECT file "DFID": rc = %d\n",
+ current->comm, PFID(ll_inode2fid(inode)),
+ rc);
+ RETURN(rc);
}
fd->fd_flags |= flags;
#endif
switch (fl_type) {
- case F_RDLCK:
- einfo.ei_mode = LCK_PR;
- break;
- case F_UNLCK:
- /* An unlock request may or may not have any relation to
- * existing locks so we may not be able to pass a lock handle
- * via a normal ldlm_lock_cancel() request. The request may even
- * unlock a byte range in the middle of an existing lock. In
- * order to process an unlock request we need all of the same
- * information that is given with a normal read or write record
- * lock request. To avoid creating another ldlm unlock (cancel)
- * message we'll treat a LCK_NL flock request as an unlock. */
- einfo.ei_mode = LCK_NL;
- break;
- case F_WRLCK:
- einfo.ei_mode = LCK_PW;
- break;
- default:
- CDEBUG(D_INFO, "Unknown fcntl lock type: %d\n", fl_type);
- RETURN (-ENOTSUPP);
- }
-
- switch (cmd) {
- case F_SETLKW:
+ case F_RDLCK:
+ einfo.ei_mode = LCK_PR;
+ break;
+ case F_UNLCK:
+ /* An unlock request may or may not have any relation to
+ * existing locks so we may not be able to pass a lock handle
+ * via a normal ldlm_lock_cancel() request. The request may even
+ * unlock a byte range in the middle of an existing lock. In
+ * order to process an unlock request we need all of the same
+ * information that is given with a normal read or write record
+ * lock request. To avoid creating another ldlm unlock (cancel)
+ * message we'll treat a LCK_NL flock request as an unlock. */
+ einfo.ei_mode = LCK_NL;
+ break;
+ case F_WRLCK:
+ einfo.ei_mode = LCK_PW;
+ break;
+ default:
+ rc = -EINVAL;
+ CERROR("%s: fcntl from '%s' unknown lock type=%d: rc = %d\n",
+ sbi->ll_fsname, current->comm, fl_type, rc);
+ RETURN(rc);
+ }
+
+ switch (cmd) {
+ case F_SETLKW:
#ifdef F_SETLKW64
- case F_SETLKW64:
+ case F_SETLKW64:
#endif
- flags = 0;
- break;
- case F_SETLK:
+ flags = 0;
+ break;
+ case F_SETLK:
#ifdef F_SETLK64
- case F_SETLK64:
+ case F_SETLK64:
#endif
- flags = LDLM_FL_BLOCK_NOWAIT;
- break;
- case F_GETLK:
+ flags = LDLM_FL_BLOCK_NOWAIT;
+ break;
+ case F_GETLK:
#ifdef F_GETLK64
- case F_GETLK64:
+ case F_GETLK64:
#endif
- flags = LDLM_FL_TEST_LOCK;
- break;
- default:
- CERROR("unknown fcntl lock command: %d\n", cmd);
- RETURN (-EINVAL);
- }
+ flags = LDLM_FL_TEST_LOCK;
+ break;
+ default:
+ rc = -EINVAL;
+ CERROR("%s: fcntl from '%s' unknown lock command=%d: rc = %d\n",
+ sbi->ll_fsname, current->comm, cmd, rc);
+ RETURN(rc);
+ }
/* Save the old mode so that if the mode in the lock changes we
* can decrement the appropriate reader or writer refcount. */
file_lock->fl_type = einfo.ei_mode;
- op_data = ll_prep_md_op_data(NULL, inode, NULL, NULL, 0, 0,
- LUSTRE_OPC_ANY, NULL);
- if (IS_ERR(op_data))
- RETURN(PTR_ERR(op_data));
+ op_data = ll_prep_md_op_data(NULL, inode, NULL, NULL, 0, 0,
+ LUSTRE_OPC_ANY, NULL);
+ if (IS_ERR(op_data))
+ RETURN(PTR_ERR(op_data));
CDEBUG(D_DLMTRACE, "inode="DFID", pid=%u, flags=%#llx, mode=%u, "
"start=%llu, end=%llu\n", PFID(ll_inode2fid(inode)),
!(flags & LDLM_FL_TEST_LOCK))
rc2 = locks_lock_file_wait(file, file_lock);
#else
- if ((file_lock->fl_flags & FL_FLOCK) &&
- (rc == 0 || file_lock->fl_type == F_UNLCK))
+ if ((file_lock->fl_flags & FL_FLOCK) &&
+ (rc == 0 || file_lock->fl_type == F_UNLCK))
rc2 = flock_lock_file_wait(file, file_lock);
- if ((file_lock->fl_flags & FL_POSIX) &&
- (rc == 0 || file_lock->fl_type == F_UNLCK) &&
- !(flags & LDLM_FL_TEST_LOCK))
+ if ((file_lock->fl_flags & FL_POSIX) &&
+ (rc == 0 || file_lock->fl_type == F_UNLCK) &&
+ !(flags & LDLM_FL_TEST_LOCK))
rc2 = posix_lock_file_wait(file, file_lock);
#endif /* HAVE_LOCKS_LOCK_FILE_WAIT */
int rc = 0;
ENTRY;
+ CDEBUG(D_IOCTL, "%s: cmd=%x len=%u karg=%pK uarg=%pK\n",
+ exp->exp_obd->obd_name, cmd, len, karg, uarg);
if (count == 0)
RETURN(-ENOTTY);
}
case LL_IOC_HSM_CT_START: {
struct lustre_kernelcomm *lk = karg;
+
if (lk->lk_flags & LK_FLG_STOP)
rc = lmv_hsm_ct_unregister(obd, cmd, len, lk, uarg);
else
err = obd_iocontrol(cmd, tgt->ltd_exp, len, karg, uarg);
if (err) {
if (tgt->ltd_active) {
- CERROR("error: iocontrol MDC %s on MDT"
- " idx %d cmd %x: err = %d\n",
- tgt->ltd_uuid.uuid,
- tgt->ltd_index, cmd, err);
+ OBD_IOC_ERROR(obd->obd_name, cmd,
+ tgt->ltd_uuid.uuid, err);
if (!rc)
rc = err;
}
int rc;
ENTRY;
+ CDEBUG(D_IOCTL, "%s: cmd=%x len=%u karg=%pK uarg=%pK\n",
+ obd->obd_name, cmd, len, karg, uarg);
+
rc = lu_env_init(&env, LCT_LOCAL | LCT_MD_THREAD);
if (rc) {
CERROR("%s: can't initialize env: rc = %d\n",
rc = lod_llog_cancel(&env, lod);
break;
default:
- CERROR("%s: unrecognized ioctl %#x by %s\n",
- obd->obd_name, cmd, current->comm);
- rc = -ENOTTY;
+ rc = OBD_IOC_ERROR(obd->obd_name, cmd, "unrecognized", -ENOTTY);
+ break;
}
lu_env_fini(&env);
int i = 0, rc = 0, count = lov->desc.ld_tgt_count;
ENTRY;
+ CDEBUG(D_IOCTL, "%s: cmd=%x len=%u karg=%pK uarg=%pK\n",
+ exp->exp_obd->obd_name, cmd, len, karg, uarg);
+
switch (cmd) {
case IOC_OBD_STATFS: {
struct obd_ioctl_data *data = karg;
len, karg, uarg);
if (err) {
if (lov->lov_tgts[i]->ltd_active) {
- CDEBUG_LIMIT(err == -ENOTTY ?
- D_IOCTL : D_WARNING,
- "iocontrol OSC %s on OST idx %d cmd %x: err = %d\n",
- lov_uuid2str(lov, i),
- i, cmd, err);
+ OBD_IOC_DEBUG(err == -ENOTTY ?
+ D_IOCTL : D_WARNING,
+ obd->obd_name, cmd,
+ lov_uuid2str(lov, i),
+ err);
if (!rc)
rc = err;
}
struct obd_ioctl_data *data = karg;
struct obd_import *imp = obd->u.cli.cl_import;
int rc;
+
ENTRY;
+ CDEBUG(D_IOCTL, "%s: cmd=%x len=%u karg=%pK uarg=%pK\n",
+ obd->obd_name, cmd, len, karg, uarg);
if (!try_module_get(THIS_MODULE)) {
CERROR("%s: cannot get module '%s'\n", obd->obd_name,
rc = mdc_ioc_swap_layouts(exp, karg);
GOTO(out, rc);
default:
- CERROR("unrecognised ioctl: cmd = %#x\n", cmd);
- GOTO(out, rc = -ENOTTY);
+ rc = OBD_IOC_ERROR(obd->obd_name, cmd, "unrecognized", -ENOTTY);
+ break;
}
out:
module_put(THIS_MODULE);
* \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)
+ unsigned int cmd, int len, void *karg)
{
struct mdd_device *mdd = lu2mdd_dev(&m->md_lu_dev);
+ struct obd_device *obd = mdd2obd_dev(mdd);
struct obd_ioctl_data *data = karg;
- int rc;
+ int rc = -EINVAL;
+
ENTRY;
+ CDEBUG(D_IOCTL, "%s: cmd=%x len=%u karg=%pK\n",
+ obd->obd_name, cmd, len, karg);
/* Doesn't use obd_ioctl_data */
switch (cmd) {
if (unlikely(!barrier_entry(mdd->mdd_bottom)))
RETURN(-EINPROGRESS);
- rc = mdd_changelog_clear(env, mdd, cs->cs_id,
- cs->cs_recno);
+ rc = mdd_changelog_clear(env, mdd, cs->cs_id, cs->cs_recno);
barrier_exit(mdd->mdd_bottom);
RETURN(rc);
}
case OBD_IOC_START_LFSCK: {
- rc = lfsck_start(env, mdd->mdd_bottom,
- (struct lfsck_start_param *)karg);
+ rc = lfsck_start(env, mdd->mdd_bottom, karg);
RETURN(rc);
}
case OBD_IOC_STOP_LFSCK: {
- rc = lfsck_stop(env, mdd->mdd_bottom,
- (struct lfsck_stop *)karg);
+ rc = lfsck_stop(env, mdd->mdd_bottom, karg);
RETURN(rc);
}
case OBD_IOC_QUERY_LFSCK: {
- rc = lfsck_query(env, mdd->mdd_bottom, NULL, NULL,
- (struct lfsck_query *)karg);
+ rc = lfsck_query(env, mdd->mdd_bottom, NULL, NULL, karg);
RETURN(rc);
}
case OBD_IOC_LLOG_PRINT:
/* Below ioctls use obd_ioctl_data */
if (data->ioc_version != OBD_IOCTL_VERSION) {
- CERROR("Bad magic %x != %x\n", data->ioc_version,
- OBD_IOCTL_VERSION);
- RETURN(-EINVAL);
+ CERROR("%s: iocontrol from '%s' bad magic %x != %x: rc = %d\n",
+ obd->obd_name, current->comm,
+ data->ioc_version, OBD_IOCTL_VERSION, rc);
+ RETURN(rc);
}
switch (cmd) {
barrier_exit(mdd->mdd_bottom);
break;
default:
- rc = -ENOTTY;
+ rc = OBD_IOC_ERROR(obd->obd_name, cmd, "unrecognized", -ENOTTY);
+ break;
}
RETURN(rc);
static int mdt_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
void *karg, void __user *uarg)
{
- struct lu_env env;
struct obd_device *obd = exp->exp_obd;
struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev);
- struct dt_device *dt = mdt->mdt_bottom;
+ struct dt_device *dt = mdt->mdt_bottom;
+ struct lu_env env;
int rc;
ENTRY;
- CDEBUG(D_IOCTL, "handling ioctl cmd %#x\n", cmd);
+ CDEBUG(D_IOCTL, "%s: cmd=%x len=%u karg=%pK uarg=%pK\n",
+ obd->obd_name, cmd, len, karg, uarg);
+
rc = lu_env_init(&env, LCT_MD_THREAD);
if (rc)
RETURN(rc);
struct obd_ioctl_data *data = karg;
if (data->ioc_type & OBD_FLG_ABORT_RECOV_MDT) {
- CERROR("%s: Aborting MDT recovery\n",
- mdt_obd_name(mdt));
+ CWARN("%s: Aborting MDT recovery\n", obd->obd_name);
obd->obd_abort_mdt_recovery = 1;
wake_up(&obd->obd_next_transno_waitq);
} else { /* if (data->ioc_type & OBD_FLG_ABORT_RECOV_OST) */
/* lctl didn't set OBD_FLG_ABORT_RECOV_OST < 2.13.57 */
- CERROR("%s: Aborting client recovery\n",
- mdt_obd_name(mdt));
+ CWARN("%s: Aborting client recovery\n", obd->obd_name);
obd->obd_abort_recovery = 1;
target_stop_recovery_thread(obd);
}
rc = llog_catalog_list(&env, mdt->mdt_bottom, 0, karg,
&mti->mti_tmp_fid1);
break;
- }
+ }
default:
- rc = -EOPNOTSUPP;
- CERROR("%s: Not supported cmd = %d, rc = %d\n",
- mdt_obd_name(mdt), cmd, rc);
+ rc = OBD_IOC_ERROR(obd->obd_name, cmd, "unrecognized", -ENOTTY);
+ break;
}
lu_env_fini(&env);
static int mgs_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
void *karg, void __user *uarg)
{
+ struct obd_device *obd = exp->exp_obd;
struct mgs_device *mgs = exp2mgs_dev(exp);
- struct obd_ioctl_data *data = karg;
+ struct obd_ioctl_data *data = karg;
struct lu_env env;
- int rc = 0;
+ int rc = -EINVAL;
- ENTRY;
- CDEBUG(D_IOCTL, "handling ioctl cmd %#x\n", cmd);
+ ENTRY;
+ CDEBUG(D_IOCTL, "%s: cmd=%x len=%u karg=%pK uarg=%pK\n",
+ obd->obd_name, cmd, len, karg, uarg);
rc = lu_env_init(&env, LCT_MG_THREAD);
if (rc)
RETURN(rc);
- switch (cmd) {
-
+ rc = -EINVAL;
+ switch (cmd) {
case OBD_IOC_PARAM: {
struct lustre_cfg *lcfg;
if (data->ioc_type != LUSTRE_CFG_TYPE) {
- CERROR("%s: unknown cfg record type: %d\n",
- mgs->mgs_obd->obd_name, data->ioc_type);
- GOTO(out, rc = -EINVAL);
- }
+ CERROR("%s: unknown cfg record type '%x': rc = %d\n",
+ obd->obd_name, data->ioc_type, rc);
+ GOTO(out, rc);
+ }
- OBD_ALLOC(lcfg, data->ioc_plen1);
- if (lcfg == NULL)
+ OBD_ALLOC(lcfg, data->ioc_plen1);
+ if (lcfg == NULL)
GOTO(out, rc = -ENOMEM);
if (copy_from_user(lcfg, data->ioc_pbuf1, data->ioc_plen1))
- GOTO(out_free, rc = -EFAULT);
+ GOTO(out_free, rc = -EFAULT);
- if (lcfg->lcfg_bufcount < 1)
- GOTO(out_free, rc = -EINVAL);
+ if (lcfg->lcfg_bufcount < 1)
+ GOTO(out_free, rc);
rc = mgs_set_param(&env, mgs, lcfg);
if (rc)
CERROR("%s: setparam err: rc = %d\n",
- exp->exp_obd->obd_name, rc);
+ obd->obd_name, rc);
out_free:
- OBD_FREE(lcfg, data->ioc_plen1);
+ OBD_FREE(lcfg, data->ioc_plen1);
break;
- }
-
- case OBD_IOC_REPLACE_NIDS: {
+ }
+ case OBD_IOC_REPLACE_NIDS:
if (!data->ioc_inllen1 || !data->ioc_inlbuf1) {
- rc = -EINVAL;
CERROR("%s: no device or fsname specified: rc = %d\n",
- exp->exp_obd->obd_name, rc);
+ obd->obd_name, rc);
break;
}
if (data->ioc_inllen1 > MTI_NAME_MAXLEN) {
rc = -EOVERFLOW;
CERROR("%s: device or fsname is too long: rc = %d\n",
- exp->exp_obd->obd_name, rc);
+ obd->obd_name, rc);
break;
}
if (data->ioc_inlbuf1[data->ioc_inllen1 - 1] != 0) {
- rc = -EINVAL;
- CERROR("%s: device or fsname is not NUL terminated: "
- "rc = %d\n", exp->exp_obd->obd_name, rc);
+ CERROR("%s: unterminated device or fsname: rc = %d\n",
+ obd->obd_name, rc);
break;
}
if (!data->ioc_inllen2 || !data->ioc_inlbuf2) {
- rc = -EINVAL;
CERROR("%s: no NIDs specified: rc = %d\n",
- exp->exp_obd->obd_name, rc);
+ obd->obd_name, rc);
break;
}
if (data->ioc_inlbuf2[data->ioc_inllen2 - 1] != 0) {
- rc = -EINVAL;
- CERROR("%s: NID list is not NUL terminated: "
- "rc = %d\n", exp->exp_obd->obd_name, rc);
+ CERROR("%s: NID list is not NUL terminated: rc = %d\n",
+ obd->obd_name, rc);
break;
}
data->ioc_inlbuf2);
if (rc)
CERROR("%s: error replacing nids: rc = %d\n",
- exp->exp_obd->obd_name, rc);
+ obd->obd_name, rc);
break;
- }
-
- case OBD_IOC_CLEAR_CONFIGS: {
+ case OBD_IOC_CLEAR_CONFIGS:
if (!data->ioc_inllen1 || !data->ioc_inlbuf1) {
- rc = -EINVAL;
CERROR("%s: no device or fsname specified: rc = %d\n",
- exp->exp_obd->obd_name, rc);
+ obd->obd_name, rc);
break;
}
if (data->ioc_inllen1 > MTI_NAME_MAXLEN) {
rc = -EOVERFLOW;
CERROR("%s: device or fsname is too long: rc = %d\n",
- exp->exp_obd->obd_name, rc);
+ obd->obd_name, rc);
break;
}
if (data->ioc_inlbuf1[data->ioc_inllen1 - 1] != 0) {
- rc = -EINVAL;
- CERROR("%s: device or fsname is not NUL terminated: "
- "rc = %d\n", exp->exp_obd->obd_name, rc);
+ CERROR("%s: unterminated device or fsname: rc = %d\n",
+ obd->obd_name, rc);
break;
}
rc = mgs_clear_configs(&env, mgs, data->ioc_inlbuf1);
if (rc)
CERROR("%s: error clearing config log: rc = %d\n",
- exp->exp_obd->obd_name, rc);
+ obd->obd_name, rc);
break;
- }
-
case OBD_IOC_POOL:
rc = mgs_iocontrol_pool(&env, mgs, data);
break;
-
case OBD_IOC_BARRIER:
rc = mgs_iocontrol_barrier(&env, mgs, data);
break;
-
case OBD_IOC_NODEMAP:
rc = mgs_iocontrol_nodemap(&env, mgs, data);
break;
-
case OBD_IOC_LCFG_FORK:
rc = mgs_lcfg_fork(&env, mgs, data->ioc_inlbuf1,
data->ioc_inlbuf2);
break;
-
case OBD_IOC_LCFG_ERASE:
rc = mgs_lcfg_erase(&env, mgs, data->ioc_inlbuf1);
break;
-
case OBD_IOC_CATLOGLIST:
rc = mgs_list_logs(&env, mgs, data);
break;
llog_ctxt_put(ctxt);
break;
}
-
default:
- CERROR("%s: unknown command %#x\n",
- mgs->mgs_obd->obd_name, cmd);
- rc = -ENOTTY;
+ rc = OBD_IOC_ERROR(obd->obd_name, cmd, "unrecognized", -ENOTTY);
break;
}
out:
.notifier_call = obdclass_oom_handler
};
+int obd_ioctl_msg(const char *file, const char *func, int line, int level,
+ const char *name, unsigned int cmd, const char *msg, int rc)
+{
+ static struct cfs_debug_limit_state cdls;
+ char *dirs[] = {
+ [_IOC_NONE] = "_IO",
+ [_IOC_READ] = "_IOR",
+ [_IOC_WRITE] = "_IOW",
+ [_IOC_READ|_IOC_WRITE] = "_IOWR",
+ };
+ char type;
+
+ type = _IOC_TYPE(cmd);
+ __CDEBUG_WITH_LOC(file, func, line, level, &cdls,
+ "%s: iocontrol from '%s' cmd=%x %s('%c', %u, %u) %s: rc = %d\n",
+ name, current->comm, cmd,
+ dirs[_IOC_DIR(cmd)] ?: "_IO?",
+ isprint(type) ? type : '?', _IOC_NR(cmd),
+ _IOC_SIZE(cmd), msg, rc);
+ return rc;
+}
+EXPORT_SYMBOL(obd_ioctl_msg);
+
static int class_resolve_dev_name(__u32 len, const char *name)
{
int rc;
struct obd_ioctl_hdr hdr;
struct obd_ioctl_data *data;
int offset = 0;
+ int rc = -EINVAL;
ENTRY;
if (copy_from_user(&hdr, arg, sizeof(hdr)))
RETURN(-EFAULT);
if (hdr.ioc_version != OBD_IOCTL_VERSION) {
- CERROR("Version mismatch kernel (%x) vs application (%x)\n",
- OBD_IOCTL_VERSION, hdr.ioc_version);
- RETURN(-EINVAL);
+ CERROR("%s: kernel/user version mismatch (%x != %x): rc = %d\n",
+ current->comm, OBD_IOCTL_VERSION, hdr.ioc_version, rc);
+ RETURN(rc);
}
if (hdr.ioc_len > OBD_MAX_IOCTL_BUFFER) {
- CERROR("User buffer len %d exceeds %d max buffer\n",
- hdr.ioc_len, OBD_MAX_IOCTL_BUFFER);
- RETURN(-EINVAL);
+ CERROR("%s: user buffer len %d exceeds %d max: rc = %d\n",
+ current->comm, hdr.ioc_len, OBD_MAX_IOCTL_BUFFER, rc);
+ RETURN(rc);
}
- if (hdr.ioc_len < sizeof(struct obd_ioctl_data)) {
- CERROR("User buffer too small for ioctl (%d)\n", hdr.ioc_len);
- RETURN(-EINVAL);
+ if (hdr.ioc_len < sizeof(*data)) {
+ CERROR("%s: user buffer %d too small for ioctl %zu: rc = %d\n",
+ current->comm, hdr.ioc_len, sizeof(*data), rc);
+ RETURN(rc);
}
/* When there are lots of processes calling vmalloc on multi-core
*/
OBD_ALLOC_LARGE(data, hdr.ioc_len);
if (!data) {
- CERROR("Cannot allocate control buffer of len %d\n",
- hdr.ioc_len);
- RETURN(-EINVAL);
+ rc = -ENOMEM;
+ CERROR("%s: cannot allocate control buffer len %d: rc = %d\n",
+ current->comm, hdr.ioc_len, rc);
+ RETURN(rc);
}
*len = hdr.ioc_len;
{
struct obd_ioctl_data *data;
struct obd_device *obd = NULL;
- int err = 0, len = 0;
+ int rc, len = 0;
ENTRY;
- CDEBUG(D_IOCTL, "cmd = %x\n", cmd);
- if (obd_ioctl_getdata(&data, &len, uarg)) {
- CERROR("OBD ioctl: data error\n");
- RETURN(-EINVAL);
+ CDEBUG(D_IOCTL, "obdclass: cmd=%x len=%u uarg=%pK\n", cmd, len, uarg);
+ rc = obd_ioctl_getdata(&data, &len, uarg);
+ if (rc) {
+ CERROR("%s: ioctl data error: rc = %d\n", current->comm, rc);
+ RETURN(rc);
}
- switch (cmd) {
- case OBD_IOC_PROCESS_CFG: {
- struct lustre_cfg *lcfg;
-
- if (!data->ioc_plen1 || !data->ioc_pbuf1) {
- CERROR("No config buffer passed!\n");
- GOTO(out, err = -EINVAL);
- }
- OBD_ALLOC(lcfg, data->ioc_plen1);
- if (lcfg == NULL)
- GOTO(out, err = -ENOMEM);
- err = copy_from_user(lcfg, data->ioc_pbuf1,
- data->ioc_plen1);
- if (!err)
- err = lustre_cfg_sanity_check(lcfg, data->ioc_plen1);
- if (!err)
- err = class_process_config(lcfg);
-
- OBD_FREE(lcfg, data->ioc_plen1);
- GOTO(out, err);
- }
+ switch (cmd) {
+ case OBD_IOC_PROCESS_CFG: {
+ struct lustre_cfg *lcfg;
+
+ if (!data->ioc_plen1 || !data->ioc_pbuf1) {
+ rc = OBD_IOC_ERROR("obdclass", cmd, "no config buffer",
+ -EINVAL);
+ GOTO(out, rc);
+ }
+ OBD_ALLOC(lcfg, data->ioc_plen1);
+ if (lcfg == NULL)
+ GOTO(out, rc = -ENOMEM);
+ rc = copy_from_user(lcfg, data->ioc_pbuf1, data->ioc_plen1);
+ if (!rc)
+ rc = lustre_cfg_sanity_check(lcfg, data->ioc_plen1);
+ if (!rc)
+ rc = class_process_config(lcfg);
+
+ OBD_FREE(lcfg, data->ioc_plen1);
+ GOTO(out, rc);
+ }
#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0)
case OBD_GET_VERSION: {
static bool warned;
if (!data->ioc_inlbuf1) {
- CERROR("No buffer passed in ioctl\n");
- GOTO(out, err = -EINVAL);
+ rc = OBD_IOC_ERROR("obdclass", cmd, "no buffer passed",
+ -EINVAL);
+ GOTO(out, rc);
}
if (strlen(LUSTRE_VERSION_STRING) + 1 > data->ioc_inllen1) {
- CERROR("ioctl buffer too small to hold version\n");
- GOTO(out, err = -EINVAL);
+ rc = OBD_IOC_ERROR("obdclass", cmd, "buffer too small",
+ -EINVAL);
+ GOTO(out, rc);
}
if (!warned) {
strlen(LUSTRE_VERSION_STRING) + 1);
if (copy_to_user(uarg, data, len))
- err = -EFAULT;
- GOTO(out, err);
+ rc = -EFAULT;
+ GOTO(out, rc);
}
#endif
case OBD_IOC_NAME2DEV: {
data->ioc_inlbuf1);
data->ioc_dev = dev;
if (dev < 0)
- GOTO(out, err = -EINVAL);
+ GOTO(out, rc = -EINVAL);
if (copy_to_user(uarg, data, sizeof(*data)))
- err = -EFAULT;
- GOTO(out, err);
- }
-
- case OBD_IOC_UUID2DEV: {
- /* Resolve a device uuid. This does not change the
- * currently selected device.
- */
- int dev;
- struct obd_uuid uuid;
-
- if (!data->ioc_inllen1 || !data->ioc_inlbuf1) {
- CERROR("No UUID passed!\n");
- GOTO(out, err = -EINVAL);
- }
- if (data->ioc_inlbuf1[data->ioc_inllen1 - 1] != 0) {
- CERROR("UUID not NUL terminated!\n");
- GOTO(out, err = -EINVAL);
- }
-
- CDEBUG(D_IOCTL, "device name %s\n", data->ioc_inlbuf1);
- obd_str2uuid(&uuid, data->ioc_inlbuf1);
- dev = class_uuid2dev(&uuid);
- data->ioc_dev = dev;
- if (dev == -1) {
- CDEBUG(D_IOCTL, "No device for UUID %s!\n",
- data->ioc_inlbuf1);
- GOTO(out, err = -EINVAL);
- }
+ rc = -EFAULT;
+ GOTO(out, rc);
+ }
+
+ case OBD_IOC_UUID2DEV: {
+ /* Resolve device uuid, does not change current selected dev */
+ struct obd_uuid uuid;
+ int dev;
+
+ if (!data->ioc_inllen1 || !data->ioc_inlbuf1) {
+ rc = OBD_IOC_ERROR("obdclass", cmd, "no UUID passed",
+ -EINVAL);
+ GOTO(out, rc);
+ }
+ if (data->ioc_inlbuf1[data->ioc_inllen1 - 1] != 0) {
+ rc = OBD_IOC_ERROR("obdclass", cmd, "unterminated UUID",
+ -EINVAL);
+ GOTO(out, rc);
+ }
+
+ CDEBUG(D_IOCTL, "device name %s\n", data->ioc_inlbuf1);
+ obd_str2uuid(&uuid, data->ioc_inlbuf1);
+ dev = class_uuid2dev(&uuid);
+ data->ioc_dev = dev;
+ if (dev == -1) {
+ CDEBUG(D_IOCTL, "No device for UUID %s!\n",
+ data->ioc_inlbuf1);
+ GOTO(out, rc = -EINVAL);
+ }
CDEBUG(D_IOCTL, "device name %s, dev %d\n", data->ioc_inlbuf1,
dev);
if (copy_to_user(uarg, data, sizeof(*data)))
- err = -EFAULT;
- GOTO(out, err);
+ rc = -EFAULT;
+ GOTO(out, rc);
}
- case OBD_IOC_GETDEVICE: {
- int index = data->ioc_count;
- char *status, *str;
+ case OBD_IOC_GETDEVICE: {
+ int index = data->ioc_count;
+ char *status, *str;
- if (!data->ioc_inlbuf1) {
- CERROR("No buffer passed in ioctl\n");
- GOTO(out, err = -EINVAL);
- }
- if (data->ioc_inllen1 < 128) {
- CERROR("ioctl buffer too small to hold version\n");
- GOTO(out, err = -EINVAL);
- }
+ if (!data->ioc_inlbuf1) {
+ rc = OBD_IOC_ERROR("obdclass", cmd, "no buffer passed",
+ -EINVAL);
+ GOTO(out, rc);
+ }
+ if (data->ioc_inllen1 < 128) {
+ rc = OBD_IOC_ERROR("obdclass", cmd, "too small version",
+ -EINVAL);
+ GOTO(out, rc);
+ }
- obd = class_num2obd(index);
- if (!obd)
- GOTO(out, err = -ENOENT);
+ obd = class_num2obd(index);
+ if (!obd)
+ GOTO(out, rc = -ENOENT);
if (obd->obd_stopping)
status = "ST";
atomic_read(&obd->obd_refcount));
if (copy_to_user(uarg, data, len))
- err = -EFAULT;
+ rc = -EFAULT;
- GOTO(out, err);
+ GOTO(out, rc);
}
}
- if (data->ioc_dev == OBD_DEV_BY_DEVNAME) {
- if (data->ioc_inllen4 <= 0 || data->ioc_inlbuf4 == NULL)
- GOTO(out, err = -EINVAL);
- if (strnlen(data->ioc_inlbuf4, MAX_OBD_NAME) >= MAX_OBD_NAME)
- GOTO(out, err = -EINVAL);
- obd = class_name2obd(data->ioc_inlbuf4);
- } else if (data->ioc_dev < class_devno_max()) {
- obd = class_num2obd(data->ioc_dev);
- } else {
- CERROR("OBD ioctl: No device\n");
- GOTO(out, err = -EINVAL);
- }
+ if (data->ioc_dev == OBD_DEV_BY_DEVNAME) {
+ if (data->ioc_inllen4 <= 0 || data->ioc_inlbuf4 == NULL)
+ GOTO(out, rc = -EINVAL);
+ if (strnlen(data->ioc_inlbuf4, MAX_OBD_NAME) >= MAX_OBD_NAME)
+ GOTO(out, rc = -EINVAL);
+ obd = class_name2obd(data->ioc_inlbuf4);
+ } else if (data->ioc_dev < class_devno_max()) {
+ obd = class_num2obd(data->ioc_dev);
+ } else {
+ rc = OBD_IOC_ERROR("obdclass", cmd, "no device", -EINVAL);
+ GOTO(out, rc);
+ }
- if (obd == NULL) {
- CERROR("OBD ioctl : No Device %d\n", data->ioc_dev);
- GOTO(out, err = -EINVAL);
- }
- LASSERT(obd->obd_magic == OBD_DEVICE_MAGIC);
+ if (obd == NULL) {
+ rc = OBD_IOC_ERROR(data->ioc_inlbuf4, cmd, "no device found",
+ -EINVAL);
+ GOTO(out, rc);
+ }
+ LASSERT(obd->obd_magic == OBD_DEVICE_MAGIC);
- if (!obd->obd_set_up || obd->obd_stopping) {
- CERROR("OBD ioctl: device not setup %d \n", data->ioc_dev);
- GOTO(out, err = -EINVAL);
- }
+ if (!obd->obd_set_up || obd->obd_stopping) {
+ rc = -EINVAL;
+ CERROR("obdclass: device %d not set up: rc = %d\n",
+ data->ioc_dev, rc);
+ GOTO(out, rc);
+ }
- err = obd_iocontrol(cmd, obd->obd_self_export, len, data, NULL);
- if (err)
- GOTO(out, err);
+ rc = obd_iocontrol(cmd, obd->obd_self_export, len, data, NULL);
+ if (rc)
+ GOTO(out, rc);
if (copy_to_user(uarg, data, len))
- err = -EFAULT;
+ rc = -EFAULT;
out:
OBD_FREE_LARGE(data, len);
- RETURN(err);
+ RETURN(rc);
} /* class_handle_ioctl */
/* to control /dev/obd */
ENTRY;
/* Allow non-root access for some limited ioctls */
if (!capable(CAP_SYS_ADMIN))
- RETURN(err = -EACCES);
+ RETURN(-EACCES);
if ((cmd & 0xffffff00) == ((int)'T') << 8) /* ignore all tty ioctls */
- RETURN(err = -ENOTTY);
+ RETURN(-ENOTTY);
err = class_handle_ioctl(cmd, (void __user *)arg);
#ifdef HAVE_SERVER_SUPPORT
struct tgt_session_info *tsi;
#endif
- struct obd_device *obd = exp->exp_obd;
- struct echo_device *ed = obd2echo_dev(obd);
+ struct obd_device *obd = exp->exp_obd;
+ struct echo_device *ed = obd2echo_dev(obd);
struct echo_client_obd *ec = ed->ed_ec;
- struct echo_object *eco;
- struct obd_ioctl_data *data = karg;
- struct lu_env *env;
- unsigned long env_tags = 0;
- __u16 refcheck;
- struct obdo *oa;
- struct lu_fid fid;
- int rw = OBD_BRW_READ;
- int rc = 0;
+ struct echo_object *eco;
+ struct obd_ioctl_data *data = karg;
+ struct lu_env *env;
+ unsigned long env_tags = 0;
+ __u16 refcheck;
+ struct obdo *oa;
+ struct lu_fid fid;
+ int rw = OBD_BRW_READ;
+ int rc = -EINVAL;
ENTRY;
+ CDEBUG(D_IOCTL, "%s: cmd=%x len=%u karg=%pK uarg=%pK\n",
+ exp->exp_obd->obd_name, cmd, len, karg, uarg);
+
oa = &data->ioc_obdo1;
if (!(oa->o_valid & OBD_MD_FLGROUP)) {
oa->o_valid |= OBD_MD_FLGROUP;
case OBD_IOC_BRW_READ:
rc = echo_client_brw_ioctl(env, rw, exp, data);
GOTO(out, rc);
-
default:
- CERROR("echo_ioctl(): unrecognised ioctl %#x\n", cmd);
- GOTO(out, rc = -ENOTTY);
+ rc = OBD_IOC_ERROR(obd->obd_name, cmd, "unrecognized", -ENOTTY);
+ break;
}
EXIT;
int rc;
ENTRY;
-
- CDEBUG(D_IOCTL, "handling ioctl cmd %#x\n", cmd);
+ CDEBUG(D_IOCTL, "%s: cmd=%x len=%u karg=%pK uarg=%pK\n",
+ obd->obd_name, cmd, len, karg, uarg);
rc = lu_env_init(&env, LCT_DT_THREAD);
if (rc)
RETURN(rc);
switch (cmd) {
case OBD_IOC_ABORT_RECOVERY:
- CERROR("%s: aborting recovery\n", obd->obd_name);
+ CWARN("%s: Aborting recovery\n", obd->obd_name);
obd->obd_abort_recovery = 1;
target_stop_recovery_thread(obd);
break;
stop.ls_flags = 0;
else
stop.ls_flags =
- ((struct lfsck_stop *)(data->ioc_inlbuf1))->ls_flags;
+ ((struct lfsck_stop *)(data->ioc_inlbuf1))->ls_flags;
rc = lfsck_stop(&env, ofd->ofd_osd, &stop);
break;
rc = ofd_ioc_get_obj_version(&env, ofd, karg);
break;
default:
- CERROR("%s: not supported cmd = %#x\n", obd->obd_name, cmd);
- rc = -ENOTTY;
+ rc = OBD_IOC_ERROR(obd->obd_name, cmd, "unrecognized", -ENOTTY);
+ break;
}
lu_env_fini(&env);
int rc = 0;
ENTRY;
+ CDEBUG(D_IOCTL, "%s: cmd=%x len=%u karg=%pK uarg=%pK\n",
+ obd->obd_name, cmd, len, karg, uarg);
+
if (!try_module_get(THIS_MODULE)) {
CERROR("%s: cannot get module '%s'\n", obd->obd_name,
module_name(THIS_MODULE));
data->ioc_offset);
break;
default:
- rc = -ENOTTY;
- CDEBUG(D_INODE, "%s: unrecognised ioctl %#x by %s: rc = %d\n",
- obd->obd_name, cmd, current->comm, rc);
+ rc = OBD_IOC_DEBUG(D_IOCTL, obd->obd_name, cmd, "unrecognized",
+ -ENOTTY);
break;
}
static int osp_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
void *karg, void __user *uarg)
{
- struct obd_device *obd = exp->exp_obd;
- struct osp_device *d;
- struct obd_ioctl_data *data = karg;
- int rc = 0;
+ struct obd_device *obd = exp->exp_obd;
+ struct osp_device *d;
+ struct obd_ioctl_data *data = karg;
+ int rc = -EINVAL;
ENTRY;
+ CDEBUG(D_IOCTL, "%s: cmd=%x len=%u karg=%pK uarg=%pK\n",
+ exp->exp_obd->obd_name, cmd, len, karg, uarg);
LASSERT(obd->obd_lu_dev);
d = lu2osp_dev(obd->obd_lu_dev);
data->ioc_offset);
break;
default:
- CERROR("%s: unrecognized ioctl %#x by %s\n", obd->obd_name,
- cmd, current->comm);
- rc = -ENOTTY;
+ rc = OBD_IOC_ERROR(obd->obd_name, cmd, "unrecognized", -ENOTTY);
+ break;
}
module_put(THIS_MODULE);
return rc;
}
-
/**
* Implementation of obd_ops::o_get_info
*