if (IS_ERR(op_data))
RETURN(PTR_ERR(op_data));
- if (IS_ENCRYPTED(parent) ||
- unlikely(llcrypt_dummy_context_enabled(parent))) {
+ if (ll_sbi_has_encrypt(sbi) &&
+ (IS_ENCRYPTED(parent) ||
+ unlikely(llcrypt_dummy_context_enabled(parent)))) {
err = llcrypt_get_encryption_info(parent);
if (err)
GOTO(out_op_data, err);
GOTO(out_op_data, err);
}
+ if (encrypt) {
+ err = llcrypt_inherit_context(parent, NULL, op_data, false);
+ if (err)
+ GOTO(out_op_data, err);
+ }
+
op_data->op_cli_flags |= CLI_SET_MEA;
err = md_create(sbi->ll_md_exp, op_data, lump, len, mode,
from_kuid(&init_user_ns, current_fsuid()),
dentry.d_inode = inode;
if (sbi->ll_flags & LL_SBI_FILE_SECCTX) {
- inode_lock(inode);
+ /* no need to protect selinux_inode_setsecurity() by
+ * inode_lock. Taking it would lead to a client deadlock
+ * LU-13617
+ */
err = security_inode_notifysecctx(inode,
op_data->op_file_secctx,
op_data->op_file_secctx_size);
- inode_unlock(inode);
} else {
err = ll_inode_init_security(&dentry, inode, parent);
}
GOTO(out_inode, err);
if (encrypt) {
- err = llcrypt_inherit_context(parent, inode, NULL, false);
+ err = ll_set_encflags(inode, op_data->op_file_encctx,
+ op_data->op_file_encctx_size, false);
if (err)
GOTO(out_inode, err);
}
rc = ll_dir_get_default_layout(inode, (void **)&lmm, &lmm_size,
&req, valid, 0);
if (rc == -ENODATA && !fid_is_root(ll_inode2fid(inode)) &&
- !(valid & (OBD_MD_MEA|OBD_MD_DEFAULT_MEA)) && root_request != NULL)
- rc = ll_dir_get_default_layout(inode, (void **)&lmm, &lmm_size,
- &root_req, valid,
- GET_DEFAULT_LAYOUT_ROOT);
+ !(valid & (OBD_MD_MEA|OBD_MD_DEFAULT_MEA)) && root_request != NULL){
+ int rc2 = ll_dir_get_default_layout(inode, (void **)&lmm,
+ &lmm_size, &root_req, valid,
+ GET_DEFAULT_LAYOUT_ROOT);
+ if (rc2 == 0)
+ rc = 0;
+ }
*plmm = lmm;
*plmm_size = lmm_size;
return 0;
}
-static int quotactl_ioctl(struct ll_sb_info *sbi, struct if_quotactl *qctl)
+int quotactl_ioctl(struct ll_sb_info *sbi, struct if_quotactl *qctl)
{
- int cmd = qctl->qc_cmd;
- int type = qctl->qc_type;
- int id = qctl->qc_id;
- int valid = qctl->qc_valid;
- int rc = 0;
- ENTRY;
+ int cmd = qctl->qc_cmd;
+ int type = qctl->qc_type;
+ int id = qctl->qc_id;
+ int valid = qctl->qc_valid;
+ int rc = 0;
+
+ ENTRY;
switch (cmd) {
case Q_SETQUOTA:
if ((cmd == Q_GETQUOTA || cmd == LUSTRE_Q_GETQUOTAPOOL) &&
!(oqctl->qc_dqblk.dqb_valid & QIF_SPACE) &&
!oqctl->qc_dqblk.dqb_curspace) {
- struct obd_quotactl *oqctl_tmp;
-
- OBD_ALLOC_PTR(oqctl_tmp);
- if (oqctl_tmp == NULL)
- GOTO(out, rc = -ENOMEM);
-
- oqctl_tmp->qc_cmd = Q_GETOQUOTA;
+ struct obd_quotactl *oqctl_tmp;
+ int qctl_len = sizeof(*oqctl_tmp) + LOV_MAXPOOLNAME + 1;
+
+ OBD_ALLOC(oqctl_tmp, qctl_len);
+ if (oqctl_tmp == NULL)
+ GOTO(out, rc = -ENOMEM);
+
+ if (cmd == LUSTRE_Q_GETQUOTAPOOL) {
+ oqctl_tmp->qc_cmd = LUSTRE_Q_GETQUOTAPOOL;
+ memcpy(oqctl_tmp->qc_poolname,
+ qctl->qc_poolname,
+ LOV_MAXPOOLNAME + 1);
+ } else {
+ oqctl_tmp->qc_cmd = Q_GETOQUOTA;
+ }
oqctl_tmp->qc_id = oqctl->qc_id;
oqctl_tmp->qc_type = oqctl->qc_type;
oqctl->qc_dqblk.dqb_valid |= QIF_SPACE;
}
- /* collect space & inode usage from MDTs */
- oqctl_tmp->qc_dqblk.dqb_curspace = 0;
- oqctl_tmp->qc_dqblk.dqb_curinodes = 0;
- rc = obd_quotactl(sbi->ll_md_exp, oqctl_tmp);
- if (!rc || rc == -EREMOTEIO) {
- oqctl->qc_dqblk.dqb_curspace +=
- oqctl_tmp->qc_dqblk.dqb_curspace;
- oqctl->qc_dqblk.dqb_curinodes =
- oqctl_tmp->qc_dqblk.dqb_curinodes;
- oqctl->qc_dqblk.dqb_valid |= QIF_INODES;
- } else {
- oqctl->qc_dqblk.dqb_valid &= ~QIF_SPACE;
- }
+ /* collect space & inode usage from MDTs */
+ oqctl_tmp->qc_cmd = Q_GETOQUOTA;
+ oqctl_tmp->qc_dqblk.dqb_curspace = 0;
+ oqctl_tmp->qc_dqblk.dqb_curinodes = 0;
+ rc = obd_quotactl(sbi->ll_md_exp, oqctl_tmp);
+ if (!rc || rc == -EREMOTEIO) {
+ oqctl->qc_dqblk.dqb_curspace +=
+ oqctl_tmp->qc_dqblk.dqb_curspace;
+ oqctl->qc_dqblk.dqb_curinodes =
+ oqctl_tmp->qc_dqblk.dqb_curinodes;
+ oqctl->qc_dqblk.dqb_valid |= QIF_INODES;
+ } else {
+ oqctl->qc_dqblk.dqb_valid &= ~QIF_SPACE;
+ }
- OBD_FREE_PTR(oqctl_tmp);
+ OBD_FREE(oqctl_tmp, qctl_len);
}
out:
QCTL_COPY(qctl, oqctl);