- LASSERT(ginfo->ngroups <= NGROUPS_SMALL);
- LASSERT(ginfo->nblocks == 1);
- LASSERT(ginfo->blocks[0] == ginfo->small_block);
-
- OBD_FREE(ginfo, sizeof(*ginfo) + 1 * sizeof(gid_t *));
-}
-
-/* for 2.4 the group number is small, so simply search the
- * whole array.
- */
-int groups_search(struct group_info *ginfo, gid_t grp)
-{
- int i;
-
- if (!ginfo)
- return 0;
-
- for (i = 0; i < ginfo->ngroups; i++)
- if (GROUP_AT(ginfo, i) == grp)
- return 1;
- return 0;
-}
-
-#else /* >= 2.6.4 */
-
-void groups_sort(struct group_info *ginfo)
-{
- int base, max, stride;
- int gidsetsize = ginfo->ngroups;
-
- for (stride = 1; stride < gidsetsize; stride = 3 * stride + 1)
- ; /* nothing */
- stride /= 3;
-
- while (stride) {
- max = gidsetsize - stride;
- for (base = 0; base < max; base++) {
- int left = base;
- int right = left + stride;
- gid_t tmp = GROUP_AT(ginfo, right);
-
- while (left >= 0 && GROUP_AT(ginfo, left) > tmp) {
- GROUP_AT(ginfo, right) =
- GROUP_AT(ginfo, left);
- right = left;
- left -= stride;
- }
- GROUP_AT(ginfo, right) = tmp;
- }
- stride /= 3;
- }
-}
-
-int groups_search(struct group_info *ginfo, gid_t grp)
-{
- int left, right;
-
- if (!ginfo)
- return 0;
-
- left = 0;
- right = ginfo->ngroups;
- while (left < right) {
- int mid = (left + right) / 2;
- int cmp = grp - GROUP_AT(ginfo, mid);
- if (cmp > 0)
- left = mid + 1;
- else if (cmp < 0)
- right = mid;
- else
- return 1;
- }
- return 0;
-}
-#endif
-
-void groups_from_buffer(struct group_info *ginfo, __u32 *gids)
-{
- int i, ngroups = ginfo->ngroups;
-
- for (i = 0; i < ginfo->nblocks; i++) {
- int count = min(NGROUPS_PER_BLOCK, ngroups);
-
- memcpy(ginfo->blocks[i], gids, count * sizeof(__u32));
- gids += NGROUPS_PER_BLOCK;
- ngroups -= count;
- }
-}
-
-void mds_pack_dentry2id(struct obd_device *obd,
- struct lustre_id *id,
- struct dentry *dentry,
- int fid)
-{
- id_ino(id) = dentry->d_inum;
- id_gen(id) = dentry->d_generation;
-
- if (fid) {
- id_fid(id) = dentry->d_fid;
- id_group(id) = dentry->d_mdsnum;
- }
-}
-
-void mds_pack_dentry2body(struct obd_device *obd,
- struct mds_body *b,
- struct dentry *dentry,
- int fid)
-{
- b->valid |= OBD_MD_FLID | OBD_MD_FLGENER |
- OBD_MD_MDS;
-
- if (fid)
- b->valid |= OBD_MD_FID;
-
- mds_pack_dentry2id(obd, &b->id1, dentry, fid);
-}
-
-int mds_pack_inode2id(struct obd_device *obd,
- struct lustre_id *id,
- struct inode *inode,
- int fid)
-{
- int rc = 0;
- ENTRY;
-
- if (fid) {
- /* we have to avoid deadlock. */
- if (!down_trylock(&inode->i_sem)) {
- rc = mds_read_inode_sid(obd, inode, id);
- up(&inode->i_sem);
- } else {
- rc = mds_read_inode_sid(obd, inode, id);
- }
- }
-
- if (rc == 0) {
- id_ino(id) = inode->i_ino;
- id_gen(id) = inode->i_generation;
- id_type(id) = (S_IFMT & inode->i_mode);
- }
- 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 crypto_key_md *md_key;
- struct crypto_key *ckey;
- __u32 buflen, *sizep;
- void *buf;
- int size, rc = 0;
- ENTRY;
-
- sizep = lustre_msg_buf(repmsg, (*offset)++, 4);
- if (!sizep) {
- CERROR("can't locate returned ckey size buf\n");
- RETURN(-EPROTO);
- }
- *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) {
- 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) {
- CDEBUG(D_INFO, "given match %x != magic %x\n",
- md_key->md_magic, MD_KEY_MAGIC);
- GOTO(out, rc = 0);
- }
-
- CDEBUG(D_INFO, "get key %s mac %s for ino %lu size %d \n",
- md_key->md_ck.ck_key, md_key->md_ck.ck_mac, inode->i_ino, size);
- ckey=(struct crypto_key*)buf;
-
- memcpy(ckey, &md_key->md_ck, sizeof(*ckey));
- body->valid |= OBD_MD_FLKEY;
-out:
- OBD_FREE(md_key, sizeof(*md_key));
- RETURN(rc);
-}
-
-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);
- RETURN(0);
-}
-
-int mds_set_gskey(struct obd_device *obd, void *handle,
- struct inode *inode, void *key, int key_len,
- int valid)
-{
- struct crypto_key_md *md_key = NULL;
- struct crypto_key *ckey = (struct crypto_key *)key;
- int rc = 0;
- ENTRY;
-
- if (!ckey)
- RETURN(0);
-
- LASSERT(ckey->ck_type == MKS_TYPE || ckey->ck_type == GKS_TYPE);
-
- OBD_ALLOC(md_key, sizeof(*md_key));
- 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);
- }
- 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);
- }
- 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));
- RETURN(rc);
-}
-
-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");
- }
- RETURN(0);