X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmds%2Fmds_lib.c;h=bc0fb6f73fbd905e7bbb0943f3cb0896cc950c23;hb=02be224ce61aa34c95d5c6323027de99d4485e6b;hp=0c1b85477f5ebc309bf5c4260450650b15c5716a;hpb=30c3f6ec6434cde030ca54e8ba4646c316f93f56;p=fs%2Flustre-release.git diff --git a/lustre/mds/mds_lib.c b/lustre/mds/mds_lib.c index 0c1b854..bc0fb6f 100644 --- a/lustre/mds/mds_lib.c +++ b/lustre/mds/mds_lib.c @@ -52,6 +52,7 @@ #include #include #include + #include "mds_internal.h" #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4) @@ -217,10 +218,28 @@ int mds_pack_inode2id(struct obd_device *obd, RETURN(rc); } +void mds_inode2id(struct obd_device *obd, struct lustre_id *id, + struct inode *inode, __u64 fid) +{ + struct mds_obd *mds = &obd->u.mds; + ENTRY; + + LASSERT(inode != NULL); + LASSERT(id != NULL); + LASSERT(fid != 0); + + id_fid(id) = fid; + id_ino(id) = inode->i_ino; + id_group(id) = mds->mds_num; + id_gen(id) = inode->i_generation; + id_type(id) = (S_IFMT & inode->i_mode); + + EXIT; +} + int mds_pack_gskey(struct obd_device *obd, struct lustre_msg *repmsg, int *offset, struct mds_body *body, struct inode *inode) { - struct mds_obd *mds = &obd->u.mds; struct crypto_key_md *md_key; struct crypto_key *ckey; __u32 buflen, *sizep; @@ -228,10 +247,6 @@ int mds_pack_gskey(struct obd_device *obd, struct lustre_msg *repmsg, int size, rc = 0; ENTRY; - if ((mds->mds_crypto_type != MKS_TYPE && - mds->mds_crypto_type != GKS_TYPE)) - RETURN(rc); - sizep = lustre_msg_buf(repmsg, (*offset)++, 4); if (!sizep) { CERROR("can't locate returned ckey size buf\n"); @@ -240,15 +255,18 @@ int mds_pack_gskey(struct obd_device *obd, struct lustre_msg *repmsg, *sizep = cpu_to_le32(sizeof(*ckey)); OBD_ALLOC(md_key, sizeof(*md_key)); + if (!md_key) + RETURN(-ENOMEM); buflen = repmsg->buflens[*offset]; buf = lustre_msg_buf(repmsg, (*offset)++, buflen); size = fsfilt_get_md(obd, inode, md_key, sizeof(*md_key), - EA_KEY); - if (size < 0) { - CERROR("Can not get gskey from MDS ino %lu rc %d\n", - inode->i_ino, size); + EA_KEY); + if (size <= 0) { + if (size < 0) + CERROR("Can not get gskey from MDS ino %lu rc %d\n", + inode->i_ino, size); GOTO(out, rc = size); } if (le32_to_cpu(md_key->md_magic) != MD_KEY_MAGIC) { @@ -272,8 +290,8 @@ static int mds_get_gskey(struct inode *inode, struct crypto_key *ckey) { LASSERT(ckey); /*tmp create gs key here*/ + LASSERT(ckey->ck_type == MKS_TYPE); get_random_bytes(ckey->ck_key, KEY_SIZE); - ckey->ck_type = MKS_TYPE; RETURN(0); } @@ -283,43 +301,43 @@ int mds_set_gskey(struct obd_device *obd, void *handle, { struct crypto_key_md *md_key = NULL; struct crypto_key *ckey = (struct crypto_key *)key; - struct mds_obd *mds = &obd->u.mds; int rc = 0; ENTRY; - if ((mds->mds_crypto_type != MKS_TYPE && - mds->mds_crypto_type != GKS_TYPE) || key_len == 0) - RETURN(rc); + if (!ckey) + RETURN(0); + + LASSERT(ckey->ck_type == MKS_TYPE || ckey->ck_type == GKS_TYPE); OBD_ALLOC(md_key, sizeof(*md_key)); - LASSERT(ckey != NULL); - if (mds->mds_crypto_type == MKS_TYPE) { + if (ckey->ck_type == MKS_TYPE) mds_get_gskey(inode, ckey); - } + rc = fsfilt_get_md(obd, inode, md_key, sizeof(*md_key), EA_KEY); if (rc < 0) GOTO(free, rc); LASSERT(le32_to_cpu(md_key->md_magic) == MD_KEY_MAGIC || md_key->md_magic == 0); + if (le32_to_cpu(md_key->md_magic) == MD_KEY_MAGIC) { CDEBUG(D_INFO, "reset key %s mac %s", md_key->md_ck.ck_mac, md_key->md_ck.ck_key); } md_key->md_magic = cpu_to_le32(MD_KEY_MAGIC); + /*get key and mac from request buffer*/ if (valid & ATTR_MAC) { memcpy(md_key->md_ck.ck_mac, ckey->ck_mac, MAC_SIZE); - CDEBUG(D_INFO, "set mac %s for ino %lu \n", - md_key->md_ck.ck_mac, inode->i_ino); + CDEBUG(D_INFO, "set mac %s for ino %lu \n", + md_key->md_ck.ck_mac, inode->i_ino); } if (valid & ATTR_KEY) { memcpy(md_key->md_ck.ck_key, ckey->ck_key, KEY_SIZE); - CDEBUG(D_INFO, "set key %s for ino %lu \n", - md_key->md_ck.ck_key, inode->i_ino); + CDEBUG(D_INFO, "set key %s for ino %lu \n", + md_key->md_ck.ck_key, inode->i_ino); } - rc = fsfilt_set_md(obd, inode, handle, md_key, - sizeof(*md_key), EA_KEY); + rc = fsfilt_set_md(obd, inode, handle, md_key, sizeof(*md_key), EA_KEY); free: if (md_key) OBD_FREE(md_key, sizeof(*md_key)); @@ -330,19 +348,19 @@ int mds_set_crypto_type(struct obd_device *obd, void *val, __u32 vallen) { struct mds_obd *mds = &obd->u.mds; ENTRY; - if (vallen >= strlen("mks") && memcmp(val, "mks", vallen) == 0) { mds->mds_crypto_type = MKS_TYPE; + CDEBUG(D_IOCTL, "mks type\n"); } if (vallen >= strlen("gks") && memcmp(val, "gks", vallen) == 0) { mds->mds_crypto_type = GKS_TYPE; + CDEBUG(D_IOCTL, "gks type \n"); } - - CDEBUG(D_IOCTL, "invalid key\n"); RETURN(0); -} +} + /* Note that we can copy all of the fields, just some will not be "valid" */ void mds_pack_inode2body(struct obd_device *obd, struct mds_body *b, struct inode *inode, int fid) @@ -397,6 +415,7 @@ static int mds_setattr_unpack(struct ptlrpc_request *req, int offset, RETURN (-EFAULT); r->ur_id1 = &rec->sa_id; + r->ur_flags = rec->sa_flags; attr->ia_valid = rec->sa_valid; attr->ia_mode = rec->sa_mode; attr->ia_uid = rec->sa_uid; @@ -407,10 +426,10 @@ static int mds_setattr_unpack(struct ptlrpc_request *req, int offset, LTIME_S(attr->ia_ctime) = rec->sa_ctime; attr->ia_attr_flags = rec->sa_attr_flags; - LASSERT_REQSWAB (req, offset + 1); + LASSERT_REQSWAB(req, offset + 1); if (req->rq_reqmsg->bufcount > offset + 1) { - r->ur_eadata = lustre_msg_buf (req->rq_reqmsg, - offset + 1, 0); + r->ur_eadata = lustre_msg_buf(req->rq_reqmsg, + offset + 1, 0); if (r->ur_eadata == NULL) RETURN (-EFAULT); r->ur_eadatalen = req->rq_reqmsg->buflens[offset + 1]; @@ -441,8 +460,8 @@ static int mds_create_unpack(struct ptlrpc_request *req, int offset, struct mds_rec_create *rec; ENTRY; - rec = lustre_swab_reqbuf (req, offset, sizeof (*rec), - lustre_swab_mds_rec_create); + rec = lustre_swab_reqbuf(req, offset, sizeof(*rec), + lustre_swab_mds_rec_create); if (rec == NULL) RETURN (-EFAULT); @@ -453,19 +472,19 @@ static int mds_create_unpack(struct ptlrpc_request *req, int offset, r->ur_time = rec->cr_time; r->ur_flags = rec->cr_flags; - LASSERT_REQSWAB (req, offset + 1); - r->ur_name = lustre_msg_string (req->rq_reqmsg, offset + 1, 0); + LASSERT_REQSWAB(req, offset + 1); + r->ur_name = lustre_msg_string(req->rq_reqmsg, offset + 1, 0); if (r->ur_name == NULL) - RETURN (-EFAULT); + RETURN(-EFAULT); r->ur_namelen = req->rq_reqmsg->buflens[offset + 1]; - LASSERT_REQSWAB (req, offset + 2); + LASSERT_REQSWAB(req, offset + 2); if (req->rq_reqmsg->bufcount > offset + 2) { if (S_ISLNK(r->ur_mode)) { r->ur_tgt = lustre_msg_string(req->rq_reqmsg, offset + 2, 0); if (r->ur_tgt == NULL) - RETURN (-EFAULT); + RETURN(-EFAULT); r->ur_tgtlen = req->rq_reqmsg->buflens[offset + 2]; } else if (S_ISDIR(r->ur_mode) ) { /* Stripe info for mkdir - just a 16bit integer */ @@ -473,14 +492,15 @@ static int mds_create_unpack(struct ptlrpc_request *req, int offset, CERROR("mkdir stripe info does not match " "expected size %d vs 2\n", req->rq_reqmsg->buflens[offset + 2]); - RETURN (-EINVAL); + RETURN(-EINVAL); } - r->ur_eadata = lustre_swab_buf (req->rq_reqmsg, - offset + 2, 2, __swab16s); + r->ur_eadata = lustre_swab_buf(req->rq_reqmsg, + offset + 2, 2, + __swab16s); r->ur_eadatalen = req->rq_reqmsg->buflens[offset + 2]; } else if (S_ISREG(r->ur_mode)){ - r->ur_eadata = lustre_msg_buf (req->rq_reqmsg, - offset + 2, 0); + r->ur_eadata = lustre_msg_buf(req->rq_reqmsg, + offset + 2, 0); r->ur_eadatalen = req->rq_reqmsg->buflens[offset + 2]; } else { /* Hm, no other users so far? */ @@ -496,19 +516,20 @@ static int mds_link_unpack(struct ptlrpc_request *req, int offset, struct mds_rec_link *rec; ENTRY; - rec = lustre_swab_reqbuf (req, offset, sizeof (*rec), - lustre_swab_mds_rec_link); + rec = lustre_swab_reqbuf(req, offset, sizeof(*rec), + lustre_swab_mds_rec_link); if (rec == NULL) - RETURN (-EFAULT); + RETURN(-EFAULT); r->ur_id1 = &rec->lk_id1; r->ur_id2 = &rec->lk_id2; r->ur_time = rec->lk_time; + r->ur_flags = rec->lk_flags; - LASSERT_REQSWAB (req, offset + 1); - r->ur_name = lustre_msg_string (req->rq_reqmsg, offset + 1, 0); + LASSERT_REQSWAB(req, offset + 1); + r->ur_name = lustre_msg_string(req->rq_reqmsg, offset + 1, 0); if (r->ur_name == NULL) - RETURN (-EFAULT); + RETURN(-EFAULT); r->ur_namelen = req->rq_reqmsg->buflens[offset + 1]; RETURN(0); } @@ -519,8 +540,8 @@ static int mds_unlink_unpack(struct ptlrpc_request *req, int offset, struct mds_rec_unlink *rec; ENTRY; - rec = lustre_swab_reqbuf (req, offset, sizeof (*rec), - lustre_swab_mds_rec_unlink); + rec = lustre_swab_reqbuf(req, offset, sizeof (*rec), + lustre_swab_mds_rec_unlink); if (rec == NULL) RETURN(-EFAULT); @@ -528,8 +549,9 @@ static int mds_unlink_unpack(struct ptlrpc_request *req, int offset, r->ur_id1 = &rec->ul_id1; r->ur_id2 = &rec->ul_id2; r->ur_time = rec->ul_time; + r->ur_flags = rec->ul_flags; - LASSERT_REQSWAB (req, offset + 1); + LASSERT_REQSWAB(req, offset + 1); r->ur_name = lustre_msg_string(req->rq_reqmsg, offset + 1, 0); if (r->ur_name == NULL) RETURN(-EFAULT); @@ -543,22 +565,23 @@ static int mds_rename_unpack(struct ptlrpc_request *req, int offset, struct mds_rec_rename *rec; ENTRY; - rec = lustre_swab_reqbuf (req, offset, sizeof (*rec), - lustre_swab_mds_rec_rename); + rec = lustre_swab_reqbuf(req, offset, sizeof (*rec), + lustre_swab_mds_rec_rename); if (rec == NULL) RETURN(-EFAULT); r->ur_id1 = &rec->rn_id1; r->ur_id2 = &rec->rn_id2; r->ur_time = rec->rn_time; + r->ur_flags = rec->rn_flags; - LASSERT_REQSWAB (req, offset + 1); + LASSERT_REQSWAB(req, offset + 1); r->ur_name = lustre_msg_string(req->rq_reqmsg, offset + 1, 0); if (r->ur_name == NULL) RETURN(-EFAULT); r->ur_namelen = req->rq_reqmsg->buflens[offset + 1]; - LASSERT_REQSWAB (req, offset + 2); + LASSERT_REQSWAB(req, offset + 2); r->ur_tgt = lustre_msg_string(req->rq_reqmsg, offset + 2, 0); if (r->ur_tgt == NULL) RETURN(-EFAULT); @@ -572,8 +595,8 @@ static int mds_open_unpack(struct ptlrpc_request *req, int offset, struct mds_rec_create *rec; ENTRY; - rec = lustre_swab_reqbuf (req, offset, sizeof (*rec), - lustre_swab_mds_rec_create); + rec = lustre_swab_reqbuf(req, offset, sizeof (*rec), + lustre_swab_mds_rec_create); if (rec == NULL) RETURN(-EFAULT); @@ -583,16 +606,17 @@ static int mds_open_unpack(struct ptlrpc_request *req, int offset, r->ur_rdev = rec->cr_rdev; r->ur_time = rec->cr_time; r->ur_flags = rec->cr_flags; + r->ur_ioepoch = rec->cr_ioepoch; + + LASSERT_REQSWAB(req, offset + 1); + r->ur_name = lustre_msg_string(req->rq_reqmsg, offset + 1, 0); - LASSERT_REQSWAB (req, offset + 1); - r->ur_name = lustre_msg_string (req->rq_reqmsg, offset + 1, 0); if (r->ur_name == NULL) - RETURN (-EFAULT); + RETURN(-EFAULT); r->ur_namelen = req->rq_reqmsg->buflens[offset + 1]; - LASSERT_REQSWAB (req, offset + 2); - - if (req->rq_reqmsg->bufcount > offset + 2) { + LASSERT_REQSWAB(req, offset + 2); + if (req->rq_reqmsg->bufcount > offset + 2) { r->ur_eadata = lustre_msg_buf(req->rq_reqmsg, offset + 2, 0); if (r->ur_eadata == NULL) RETURN(-EFAULT); @@ -627,22 +651,20 @@ int mds_update_unpack(struct ptlrpc_request *req, int offset, int rc; ENTRY; - /* - * NB don't lustre_swab_reqbuf() here. We're just taking a peek and we + /* NB don't lustre_swab_reqbuf() here. We're just taking a peek and we * want to leave it to the specific unpacker once we've identified the - * message type. - */ - opcodep = lustre_msg_buf (req->rq_reqmsg, offset, sizeof(*opcodep)); + * message type. */ + opcodep = lustre_msg_buf(req->rq_reqmsg, offset, sizeof(*opcodep)); if (opcodep == NULL) RETURN(-EFAULT); opcode = *opcodep; - if (lustre_msg_swabbed (req->rq_reqmsg)) - __swab32s (&opcode); + if (lustre_msg_swabbed(req->rq_reqmsg)) + __swab32s(&opcode); if (opcode > REINT_MAX || mds_unpackers[opcode] == NULL) { - CERROR ("Unexpected opcode %d\n", opcode); + CERROR("Unexpected opcode %d\n", opcode); RETURN(-EFAULT); } @@ -1032,6 +1054,34 @@ void mds_body_do_reverse_map(struct mds_export_data *med, EXIT; } +/* + * return error if can't find mapping, it's a error so should not + * fall into nllu/nllg. + */ +int mds_remote_perm_do_reverse_map(struct mds_export_data *med, + struct mds_remote_perm *perm) +{ + uid_t uid; + gid_t gid; + + LASSERT(med->med_remote); + + uid = mds_idmap_lookup_uid(med->med_idmap, 1, perm->mrp_auth_uid); + if (uid == MDS_IDMAP_NOTFOUND) { + CERROR("no map for uid %u\n", perm->mrp_auth_uid); + return -EPERM; + } + gid = mds_idmap_lookup_gid(med->med_idmap, 1, perm->mrp_auth_gid); + if (gid == MDS_IDMAP_NOTFOUND) { + CERROR("no map for uid %u\n", perm->mrp_auth_uid); + return -EPERM; + } + + perm->mrp_auth_uid = uid; + perm->mrp_auth_gid = gid; + return 0; +} + /********************** * MDS ucred handling * **********************/ @@ -1172,6 +1222,7 @@ int mds_init_ucred(struct lvfs_ucred *ucred, rsd->rsd_cap &= ~CAP_FS_MASK; /* by now every fields other than groups in rsd have been granted */ + ucred->luc_nid = peernid; ucred->luc_uid = rsd->rsd_uid; ucred->luc_gid = rsd->rsd_gid; ucred->luc_fsuid = rsd->rsd_fsuid; @@ -1260,3 +1311,4 @@ void mds_exit_ucred(struct lvfs_ucred *ucred) drop_ucred_lsd(ucred); EXIT; } +