X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fllite%2Fdir.c;h=dbacb2a8893788d73af3b16e893e27500cfd8276;hp=a452779dba814f1a3af6a1a69360e5c8a89653f7;hb=449c648793d2fc4e8eee3a2dd918379b75cc81e2;hpb=f87359b51f61a4baa9bf62faebb6625d518d23b4 diff --git a/lustre/llite/dir.c b/lustre/llite/dir.c index a452779..dbacb2a 100644 --- a/lustre/llite/dir.c +++ b/lustre/llite/dir.c @@ -478,8 +478,9 @@ static int ll_dir_setdirstripe(struct dentry *dparent, struct lmv_user_md *lump, 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); @@ -500,6 +501,12 @@ static int ll_dir_setdirstripe(struct dentry *dparent, struct lmv_user_md *lump, 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()), @@ -531,7 +538,8 @@ static int ll_dir_setdirstripe(struct dentry *dparent, struct lmv_user_md *lump, 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); } @@ -742,10 +750,13 @@ int ll_dir_getstripe_default(struct inode *inode, void **plmm, int *plmm_size, 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; @@ -1115,14 +1126,15 @@ static int check_owner(int type, int id) 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: @@ -1205,13 +1217,21 @@ static int quotactl_ioctl(struct ll_sb_info *sbi, struct if_quotactl *qctl) 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; @@ -1224,21 +1244,22 @@ static int quotactl_ioctl(struct ll_sb_info *sbi, struct if_quotactl *qctl) 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); @@ -1676,10 +1697,10 @@ out_rmdir: RETURN(ll_obd_statfs(inode, (void __user *)arg)); case LL_IOC_LOV_GETSTRIPE: case LL_IOC_LOV_GETSTRIPE_NEW: - case LL_IOC_MDC_GETINFO: - case LL_IOC_MDC_GETINFO_OLD: - case IOC_MDC_GETFILEINFO: - case IOC_MDC_GETFILEINFO_OLD: + case LL_IOC_MDC_GETINFO_V1: + case LL_IOC_MDC_GETINFO_V2: + case IOC_MDC_GETFILEINFO_V1: + case IOC_MDC_GETFILEINFO_V2: case IOC_MDC_GETFILESTRIPE: { struct ptlrpc_request *request = NULL; struct ptlrpc_request *root_request = NULL; @@ -1694,8 +1715,8 @@ out_rmdir: struct lu_fid __user *fidp = NULL; int lmmsize; - if (cmd == IOC_MDC_GETFILEINFO_OLD || - cmd == IOC_MDC_GETFILEINFO || + if (cmd == IOC_MDC_GETFILEINFO_V1 || + cmd == IOC_MDC_GETFILEINFO_V2 || cmd == IOC_MDC_GETFILESTRIPE) { filename = ll_getname((const char __user *)arg); if (IS_ERR(filename)) @@ -1717,10 +1738,10 @@ out_rmdir: GOTO(out_req, rc); } - if (rc == -ENODATA && (cmd == IOC_MDC_GETFILEINFO || - cmd == LL_IOC_MDC_GETINFO || - cmd == IOC_MDC_GETFILEINFO_OLD || - cmd == LL_IOC_MDC_GETINFO_OLD)) { + if (rc == -ENODATA && (cmd == IOC_MDC_GETFILEINFO_V1 || + cmd == LL_IOC_MDC_GETINFO_V1 || + cmd == IOC_MDC_GETFILEINFO_V2 || + cmd == LL_IOC_MDC_GETINFO_V2)) { lmmsize = 0; rc = 0; } @@ -1732,8 +1753,8 @@ out_rmdir: cmd == LL_IOC_LOV_GETSTRIPE || cmd == LL_IOC_LOV_GETSTRIPE_NEW) { lump = (struct lov_user_md __user *)arg; - } else if (cmd == IOC_MDC_GETFILEINFO_OLD || - cmd == LL_IOC_MDC_GETINFO_OLD){ + } else if (cmd == IOC_MDC_GETFILEINFO_V1 || + cmd == LL_IOC_MDC_GETINFO_V1){ struct lov_user_mds_data_v1 __user *lmdp; lmdp = (struct lov_user_mds_data_v1 __user *)arg; @@ -1761,8 +1782,8 @@ out_rmdir: rc = -EOVERFLOW; } - if (cmd == IOC_MDC_GETFILEINFO_OLD || - cmd == LL_IOC_MDC_GETINFO_OLD) { + if (cmd == IOC_MDC_GETFILEINFO_V1 || + cmd == LL_IOC_MDC_GETINFO_V1) { lstat_t st = { 0 }; st.st_dev = inode->i_sb->s_dev; @@ -1783,8 +1804,8 @@ out_rmdir: if (copy_to_user(statp, &st, sizeof(st))) GOTO(out_req, rc = -EFAULT); - } else if (cmd == IOC_MDC_GETFILEINFO || - cmd == LL_IOC_MDC_GETINFO) { + } else if (cmd == IOC_MDC_GETFILEINFO_V2 || + cmd == LL_IOC_MDC_GETINFO_V2) { lstatx_t stx = { 0 }; __u64 valid = body->mbo_valid; @@ -1818,7 +1839,7 @@ out_rmdir: * However, this whould be better decided by the MDS * instead of the client. */ - if (cmd == LL_IOC_MDC_GETINFO && + if (cmd == LL_IOC_MDC_GETINFO_V2 && ll_i2info(inode)->lli_lsm_md != NULL) valid &= ~(OBD_MD_FLSIZE | OBD_MD_FLBLOCKS);