* GPL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*/
/*
#define DEBUG_SUBSYSTEM S_MDS
#include "mdt_internal.h"
+#include <lnet/lib-lnet.h>
typedef enum ucred_init_type {
if (uc->mu_valid != UCRED_INIT) {
uc->mu_suppgids[0] = uc->mu_suppgids[1] = -1;
if (uc->mu_ginfo) {
- groups_free(uc->mu_ginfo);
+ cfs_put_group_info(uc->mu_ginfo);
uc->mu_ginfo = NULL;
}
if (uc->mu_identity) {
}
}
-/* XXX: root_squash will be redesigned in Lustre 1.7.
- * Do not root_squash for inter-MDS operations */
-static int mdt_root_squash(struct mdt_thread_info *info)
+static int match_nosquash_list(cfs_rw_semaphore_t *sem,
+ cfs_list_t *nidlist,
+ lnet_nid_t peernid)
{
- return 0;
+ int rc;
+ ENTRY;
+ cfs_down_read(sem);
+ rc = cfs_match_nid(peernid, nidlist);
+ cfs_up_read(sem);
+ RETURN(rc);
+}
+
+/* root_squash for inter-MDS operations */
+static int mdt_root_squash(struct mdt_thread_info *info, lnet_nid_t peernid)
+{
+ struct md_ucred *ucred = mdt_ucred(info);
+ ENTRY;
+
+ if (!info->mti_mdt->mdt_squash_uid || ucred->mu_fsuid)
+ RETURN(0);
+
+ if (match_nosquash_list(&info->mti_mdt->mdt_squash_sem,
+ &info->mti_mdt->mdt_nosquash_nids,
+ peernid)) {
+ CDEBUG(D_OTHER, "%s is in nosquash_nids list\n",
+ libcfs_nid2str(peernid));
+ RETURN(0);
+ }
+
+ CDEBUG(D_OTHER, "squash req from %s, (%d:%d/%x)=>(%d:%d/%x)\n",
+ libcfs_nid2str(peernid),
+ ucred->mu_fsuid, ucred->mu_fsgid, ucred->mu_cap,
+ info->mti_mdt->mdt_squash_uid, info->mti_mdt->mdt_squash_gid,
+ 0);
+
+ ucred->mu_fsuid = info->mti_mdt->mdt_squash_uid;
+ ucred->mu_fsgid = info->mti_mdt->mdt_squash_gid;
+ ucred->mu_cap = 0;
+ ucred->mu_suppgids[0] = -1;
+ ucred->mu_suppgids[1] = -1;
+
+ RETURN(0);
}
static int new_init_ucred(struct mdt_thread_info *info, ucred_init_type_t type,
if (!remote && perm & CFS_SETGRP_PERM) {
if (pud->pud_ngroups) {
/* setgroups for local client */
- ucred->mu_ginfo = groups_alloc(pud->pud_ngroups);
+ ucred->mu_ginfo = cfs_groups_alloc(pud->pud_ngroups);
if (!ucred->mu_ginfo) {
CERROR("failed to alloc %d groups\n",
pud->pud_ngroups);
ucred->mu_fsuid = pud->pud_fsuid;
ucred->mu_fsgid = pud->pud_fsgid;
- /* XXX: need to process root_squash here. */
- mdt_root_squash(info);
+ /* process root_squash here. */
+ mdt_root_squash(info, peernid);
/* remove fs privilege for non-root user. */
if (ucred->mu_fsuid)
out:
if (rc) {
if (ucred->mu_ginfo) {
- groups_free(ucred->mu_ginfo);
+ cfs_put_group_info(ucred->mu_ginfo);
ucred->mu_ginfo = NULL;
}
if (ucred->mu_identity) {
}
uc->mu_identity = identity;
- /* XXX: need to process root_squash here. */
- mdt_root_squash(info);
+ /* process root_squash here. */
+ mdt_root_squash(info, mdt_info_req(info)->rq_peer.nid);
/* remove fs privilege for non-root user. */
if (uc->mu_fsuid)
}
uc->mu_identity = identity;
- /* XXX: need to process root_squash here. */
- mdt_root_squash(info);
+ /* process root_squash here. */
+ mdt_root_squash(info, mdt_info_req(info)->rq_peer.nid);
/* remove fs privilege for non-root user. */
if (uc->mu_fsuid)
for (i = 0, lod = lmm->lmm_objects; i < stripe_count; i++, lod++) {
CDEBUG(level, "stripe %u idx %u subobj "LPX64"/"LPX64"\n",
i, le32_to_cpu(lod->l_ost_idx),
- le64_to_cpu(lod->l_object_gr),
+ le64_to_cpu(lod->l_object_seq),
le64_to_cpu(lod->l_object_id));
}
}
acl_size = body->aclsize;
+ /* this replay - not send info to client */
+ if (info->mti_spec.no_create == 1) {
+ md_size = 0;
+ acl_size = 0;
+ }
+
CDEBUG(D_INFO, "Shrink to md_size = %d cookie/acl_size = %d"
- " MDSCAPA = "LPX64", OSSCAPA = "LPX64"\n",
+ " MDSCAPA = %llx, OSSCAPA = %llx\n",
md_size, acl_size,
- body->valid & OBD_MD_FLMDSCAPA,
- body->valid & OBD_MD_FLOSSCAPA);
+ (unsigned long long)(body->valid & OBD_MD_FLMDSCAPA),
+ (unsigned long long)(body->valid & OBD_MD_FLOSSCAPA));
/*
&RMF_MDT_BODY,
&RMF_MDT_MD,
ATTR_ATIME|ATTR_MTIME|ATTR_CTIME|ATTR_FROM_OPEN|
ATTR_ATIME_SET|ATTR_CTIME_SET|ATTR_MTIME_SET|
ATTR_ATTR_FLAG|ATTR_RAW|MDS_OPEN_OWNEROVERRIDE|
- ATTR_FORCE|ATTR_KILL_SUID);
+ ATTR_FORCE|ATTR_KILL_SUID|ATTR_KILL_SGID);
if (in != 0)
- CERROR("Unknown attr bits: %#llx\n", in);
+ CERROR("Unknown attr bits: "LPX64"\n", in);
return out;
}
/* unpacking */
RETURN(0);
}
-static int mdt_epoch_unpack(struct mdt_thread_info *info)
+static int mdt_ioepoch_unpack(struct mdt_thread_info *info)
{
struct req_capsule *pill = info->mti_pill;
ENTRY;
if (req_capsule_get_size(pill, &RMF_MDT_EPOCH, RCL_CLIENT))
- info->mti_epoch = req_capsule_client_get(pill, &RMF_MDT_EPOCH);
+ info->mti_ioepoch =
+ req_capsule_client_get(pill, &RMF_MDT_EPOCH);
else
- info->mti_epoch = NULL;
- RETURN(info->mti_epoch == NULL ? -EFAULT : 0);
+ info->mti_ioepoch = NULL;
+ RETURN(info->mti_ioepoch == NULL ? -EFAULT : 0);
}
static inline int mdt_dlmreq_unpack(struct mdt_thread_info *info) {
RETURN(rc);
/* Epoch may be absent */
- mdt_epoch_unpack(info);
+ mdt_ioepoch_unpack(info);
ma->ma_lmm_size = req_capsule_get_size(pill, &RMF_EADATA, RCL_CLIENT);
if (ma->ma_lmm_size) {
int rc;
ENTRY;
- rc = mdt_epoch_unpack(info);
+ rc = mdt_ioepoch_unpack(info);
if (rc)
RETURN(rc);
} else {
rr->rr_name = NULL;
rr->rr_namelen = 0;
-
}
info->mti_spec.sp_ck_split = !!(rec->ul_bias & MDS_CHECK_SPLIT);
if (rec->ul_bias & MDS_VTX_BYPASS)
else
ma->ma_attr_flags &= ~MDS_VTX_BYPASS;
+ info->mti_spec.no_create = !!req_is_replay(mdt_info_req(info));
+
rc = mdt_dlmreq_unpack(info);
RETURN(rc);
}
else
ma->ma_attr_flags &= ~MDS_VTX_BYPASS;
+ info->mti_spec.no_create = !!req_is_replay(mdt_info_req(info));
+
rc = mdt_dlmreq_unpack(info);
RETURN(rc);
}
LA_CTIME | LA_MTIME | LA_ATIME;
memset(&info->mti_spec.u, 0, sizeof(info->mti_spec.u));
info->mti_spec.sp_cr_flags = rec->cr_flags;
+ /* Do not trigger ASSERTION if client miss to set such flags. */
+ if (unlikely(info->mti_spec.sp_cr_flags == 0))
+ RETURN(-EPROTO);
info->mti_replayepoch = rec->cr_ioepoch;
info->mti_spec.sp_ck_split = !!(rec->cr_bias & MDS_CHECK_SPLIT);
if (req_capsule_get_size(pill, &RMF_CAPA1, RCL_CLIENT))
mdt_set_capainfo(info, 0, rr->rr_fid1,
req_capsule_client_get(pill, &RMF_CAPA1));
- if ((lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) &&
- (req_capsule_get_size(pill, &RMF_CAPA2, RCL_CLIENT))) {
+ if (req_is_replay(req) &&
+ req_capsule_get_size(pill, &RMF_CAPA2, RCL_CLIENT)) {
#if 0
mdt_set_capainfo(info, 1, rr->rr_fid2,
req_capsule_client_get(pill, &RMF_CAPA2));
RCL_CLIENT);
if (sp->u.sp_ea.eadatalen) {
sp->u.sp_ea.eadata = req_capsule_client_get(pill, &RMF_EADATA);
- if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY)
- sp->u.sp_ea.no_lov_create = 1;
+ sp->no_create = !!req_is_replay(req);
}
RETURN(0);