.B -v
Verbose. Display per-MDT and per-OST statistics in addition
to the usual system wide data.
+Inactive target will also be printed but marked as "inact".
.TP
.B -u <\fIuname|uid\fR>
Display user quota information for \fIuname\fR or \fIuid\fR.
else
RETURN(-EINVAL);
- switch (valid) {
- case QC_MDTIDX:
- rc = obd_iocontrol(OBD_IOC_QUOTACTL, sbi->ll_md_exp,
- sizeof(*qctl), qctl, NULL);
- break;
- case QC_OSTIDX:
- rc = obd_iocontrol(OBD_IOC_QUOTACTL, sbi->ll_dt_exp,
- sizeof(*qctl), qctl, NULL);
- break;
- case QC_UUID:
- rc = obd_iocontrol(OBD_IOC_QUOTACTL, sbi->ll_md_exp,
- sizeof(*qctl), qctl, NULL);
- if (rc == -EAGAIN)
- rc = obd_iocontrol(OBD_IOC_QUOTACTL,
- sbi->ll_dt_exp,
- sizeof(*qctl), qctl, NULL);
- break;
- default:
- rc = -EINVAL;
- break;
- }
-
- if (rc)
- RETURN(rc);
+ switch (valid) {
+ case QC_MDTIDX:
+ rc = obd_iocontrol(OBD_IOC_QUOTACTL, sbi->ll_md_exp,
+ sizeof(*qctl), qctl, NULL);
+ break;
+ case QC_OSTIDX:
+ rc = obd_iocontrol(OBD_IOC_QUOTACTL, sbi->ll_dt_exp,
+ sizeof(*qctl), qctl, NULL);
+ break;
+ case QC_UUID:
+ rc = obd_iocontrol(OBD_IOC_QUOTACTL, sbi->ll_md_exp,
+ sizeof(*qctl), qctl, NULL);
+ if (rc == -EAGAIN)
+ rc = obd_iocontrol(OBD_IOC_QUOTACTL,
+ sbi->ll_dt_exp,
+ sizeof(*qctl), qctl, NULL);
+ break;
+ default:
+ rc = -EINVAL;
+ break;
+ }
- qctl->qc_cmd = cmd;
- } else {
- struct obd_quotactl *oqctl;
+ qctl->qc_cmd = cmd;
+ if (rc)
+ RETURN(rc);
+ } else {
+ struct obd_quotactl *oqctl;
int oqctl_len = sizeof(*oqctl);
if (LUSTRE_Q_CMD_IS_POOL(cmd))
}
rc = quotactl_ioctl(inode->i_sb, qctl);
- if (rc == 0 &&
+ if ((rc == 0 || rc == -ENODATA) &&
copy_to_user((void __user *)arg, qctl, sizeof(*qctl)))
rc = -EFAULT;
case OBD_IOC_QUOTACTL: {
struct if_quotactl *qctl = karg;
struct obd_quotactl *oqctl;
+ struct obd_import *imp;
if (qctl->qc_valid == QC_MDTIDX) {
tgt = lmv_tgt(lmv, qctl->qc_idx);
RETURN(-EINVAL);
}
- if (!tgt || !tgt->ltd_exp)
+ if (!tgt)
+ RETURN(-ENODEV);
+
+ if (!tgt->ltd_exp)
RETURN(-EINVAL);
+ imp = class_exp2cliimp(tgt->ltd_exp);
+ if (!tgt->ltd_active && imp->imp_state != LUSTRE_IMP_IDLE) {
+ qctl->qc_valid = QC_MDTIDX;
+ qctl->obd_uuid = tgt->ltd_uuid;
+ RETURN(-ENODATA);
+ }
+
OBD_ALLOC_PTR(oqctl);
if (!oqctl)
RETURN(-ENOMEM);
exp->exp_connect_data = *(struct obd_connect_data *)val;
RETURN(rc);
} else if (KEY_IS(KEY_TGT_COUNT)) {
- *((int *)val) = lmv->lmv_mdt_descs.ltd_lmv_desc.ld_tgt_count;
+ *((int *)val) = lmv->lmv_mdt_descs.ltd_tgts_size;
RETURN(0);
}
rc = -EFAULT;
OBD_FREE_LARGE(buf, len);
break;
- }
- case OBD_IOC_QUOTACTL: {
- struct if_quotactl *qctl = karg;
- struct lov_tgt_desc *tgt = NULL;
- struct obd_quotactl *oqctl;
+ }
+ case OBD_IOC_QUOTACTL: {
+ struct if_quotactl *qctl = karg;
+ struct lov_tgt_desc *tgt = NULL;
+ struct obd_quotactl *oqctl;
+ struct obd_import *imp;
if (qctl->qc_valid == QC_OSTIDX) {
if (count <= qctl->qc_idx)
RETURN(-EINVAL);
tgt = lov->lov_tgts[qctl->qc_idx];
- if (!tgt || !tgt->ltd_exp)
+ if (!tgt)
+ RETURN(-ENODEV);
+
+ if (!tgt->ltd_exp)
RETURN(-EINVAL);
- } else if (qctl->qc_valid == QC_UUID) {
- for (i = 0; i < count; i++) {
- tgt = lov->lov_tgts[i];
- if (!tgt ||
- !obd_uuid_equals(&tgt->ltd_uuid,
- &qctl->obd_uuid))
- continue;
-
- if (tgt->ltd_exp == NULL)
- RETURN(-EINVAL);
-
- break;
- }
- } else {
- RETURN(-EINVAL);
- }
+ } else if (qctl->qc_valid == QC_UUID) {
+ for (i = 0; i < count; i++) {
+ tgt = lov->lov_tgts[i];
+ if (!tgt ||
+ !obd_uuid_equals(&tgt->ltd_uuid,
+ &qctl->obd_uuid))
+ continue;
+
+ if (tgt->ltd_exp == NULL)
+ RETURN(-EINVAL);
+
+ break;
+ }
+ } else {
+ RETURN(-EINVAL);
+ }
- if (i >= count)
- RETURN(-EAGAIN);
+ if (i >= count)
+ RETURN(-EAGAIN);
- LASSERT(tgt && tgt->ltd_exp);
- OBD_ALLOC_PTR(oqctl);
- if (!oqctl)
- RETURN(-ENOMEM);
+ LASSERT(tgt && tgt->ltd_exp);
+ imp = class_exp2cliimp(tgt->ltd_exp);
+ if (!tgt->ltd_active && imp->imp_state != LUSTRE_IMP_IDLE) {
+ qctl->qc_valid = QC_OSTIDX;
+ qctl->obd_uuid = tgt->ltd_uuid;
+ RETURN(-ENODATA);
+ }
- QCTL_COPY(oqctl, qctl);
- rc = obd_quotactl(tgt->ltd_exp, oqctl);
- if (rc == 0) {
- QCTL_COPY(qctl, oqctl);
- qctl->qc_valid = QC_OSTIDX;
- qctl->obd_uuid = tgt->ltd_uuid;
- }
- OBD_FREE_PTR(oqctl);
- break;
- }
+ OBD_ALLOC_PTR(oqctl);
+ if (!oqctl)
+ RETURN(-ENOMEM);
+
+ QCTL_COPY(oqctl, qctl);
+ rc = obd_quotactl(tgt->ltd_exp, oqctl);
+ if (rc == 0) {
+ QCTL_COPY(qctl, oqctl);
+ qctl->qc_valid = QC_OSTIDX;
+ qctl->obd_uuid = tgt->ltd_uuid;
+ }
+ OBD_FREE_PTR(oqctl);
+ break;
+ }
default: {
int set = 0;
}
run_test 15 "Set over 4T block quota"
+test_16a()
+{
+ (( $CLIENT_VERSION < $(version_code 2.14.55) )) &&
+ skip "Not supported Lustre client before 2.14.55"
+
+ setup_quota_test || error "setup quota failed with $?"
+
+ $LFS setquota -u $TSTUSR -B 500M -I 10K $MOUNT ||
+ error "failed to set quota for user $TSTUSR"
+ $LFS setquota -g $TSTUSR -B 500M -I 10K $MOUNT ||
+ error "failed to set quota for group $TSTUSR"
+
+ $RUNAS $DD of=$DIR/$tdir/$tfile bs=1M count=50 ||
+ quota_error u $TSTUSR "write failure"
+
+ $LFS quota -u $TSTUSR $MOUNT ||
+ quota_error u $TSTUSR "failed to get quota"
+
+ local OSC=$($LCTL dl | grep OST0000-osc-[^M] | awk '{print $4}')
+
+ $LCTL --device %$OSC deactivate
+ stack_trap "$LCTL --device %$OSC activate"
+
+ $LFS quota -v -u $TSTUSR $MOUNT ||
+ quota_error u $TSTUSR "failed to get quota after deactivate OSC"
+ $LFS quota -v -g $TSTUSR $MOUNT ||
+ quota_error g $TSTUSR "failed to get quota after deactivate OSC"
+
+ (( $MDSCOUNT > 1 )) || return 0
+
+ local MDC=$($LCTL dl | grep MDT0001-mdc-[^M] | awk '{print $4}')
+
+ $LCTL --device %$MDC deactivate
+ stack_trap "$LCTL --device %$MDC activate"
+
+ $LFS quota -v -u $TSTUSR $MOUNT ||
+ quota_error u $TSTUSR "failed to get quota after deactivate MDC"
+ $LFS quota -v -g $TSTUSR $MOUNT ||
+ quota_error g $TSTUSR "failed to get quota after deactivate OSC"
+}
+run_test 16a "lfs quota should skip the inactive MDT/OST"
+
+cleanup_16b()
+{
+ stopall
+ formatall
+ setupall
+}
+
+test_16b()
+{
+ (( $CLIENT_VERSION < $(version_code 2.14.55) )) &&
+ skip "Not supported Lustre client before 2.14.55"
+
+ (( $MDSCOUNT >= 3 )) || skip "needs >= 3 MDTs"
+
+ stopall
+ if ! combined_mgs_mds ; then
+ format_mgs
+ start_mgs
+ fi
+
+ add mds1 $(mkfs_opts mds1 $(mdsdevname 1)) --index=0 --reformat \
+ $(mdsdevname 1) $(mdsvdevname 1)
+ add mds2 $(mkfs_opts mds2 $(mdsdevname 2)) --index=1 --reformat \
+ $(mdsdevname 2) $(mdsvdevname 2)
+ add mds3 $(mkfs_opts mds3 $(mdsdevname 3)) --index=100 --reformat \
+ $(mdsdevname 3) $(mdsvdevname 3)
+
+ add ost1 $(mkfs_opts ost1 $(ostdevname 1)) --index=0 --reformat \
+ $(ostdevname 1) $(ostvdevname 1)
+ add ost2 $(mkfs_opts ost2 $(ostdevname 2)) --index=100 --reformat \
+ $(ostdevname 2) $(ostvdevname 2)
+
+ stack_trap cleanup_16b
+
+ start mds1 $(mdsdevname 1) $MDS_MOUNT_OPTS || error "MDT1 start failed"
+ start mds2 $(mdsdevname 2) $MDS_MOUNT_OPTS || error "MDT2 start failed"
+ start mds3 $(mdsdevname 3) $MDS_MOUNT_OPTS || error "MDT3 start failed"
+ start ost1 $(ostdevname 1) $OST_MOUNT_OPTS || error "OST1 start failed"
+ start ost2 $(ostdevname 2) $OST_MOUNT_OPTS || error "OST2 start failed"
+
+ mount_client $MOUNT || error "Unable to mount client"
+
+ setup_quota_test || error "setup quota failed with $?"
+ stack_trap cleanup_quota_test EXIT
+
+ $LFS setquota -u $TSTUSR -B 100M -I 10K $MOUNT ||
+ error "failed to set quota for user $TSTUSR"
+ $LFS setquota -g $TSTUSR -B 100M -I 10K $MOUNT ||
+ error "failed to set quota for group $TSTUSR"
+
+ $RUNAS $DD of=$DIR/$tdir/$tfile bs=1M count=10 ||
+ quota_error u $TSTUSR "write failure"
+
+ cnt=$($LFS quota -v -u $TSTUSR $MOUNT | grep -ce "^$FSNAME-[MD|OS]T*")
+ [ $cnt -le 5 ] || quota_error u $TSTUSR "failed to get user quota"
+ cnt=$($LFS quota -v -g $TSTUSR $MOUNT | grep -ce "^$FSNAME-[MD|OS]T*")
+ [ $cnt -le 5 ] || quota_error g $TSTUSR "failed to get group quota"
+}
+run_test 16b "lfs quota should skip the nonexistent MDT/OST"
+
test_17sub() {
local err_code=$1
local BLKS=1 # 1M less than limit
goto out;
}
+ /* no target for this index yet */
+ if (rc == -ENODEV) {
+ rc = 0;
+ continue;
+ }
+
+ /* inactive target */
+ if (rc == -ENODATA) {
+ char name[UUID_MAX+8];
+
+ snprintf(name, sizeof(name), "%s[inact]",
+ obd_uuid2str(&qctl->obd_uuid));
+ memset(&qctl->qc_dqinfo, 0,
+ sizeof(qctl->qc_dqinfo));
+ memset(&qctl->qc_dqblk, 0,
+ sizeof(qctl->qc_dqblk));
+ print_quota(name, qctl, qctl->qc_valid, 0, h,
+ false);
+ rc = 0;
+ continue;
+ }
+
if (!rc1)
rc1 = rc;
fprintf(stderr, "quotactl %s%d failed.\n",