syn_iargs.push_back( atoi(args[++i]) );
syn_iargs.push_back( atoi(args[++i]) );
} else if (strcmp(args[i],"writebatch") == 0) {
- syn_modes.push_back( SYNCLIENT_MODE_WRITEBATCH );
+ syn_modes.push_back( SYNCLIENT_MODE_WRITEBATCH );
syn_iargs.push_back( atoi(args[++i]) );
syn_iargs.push_back( atoi(args[++i]) );
syn_iargs.push_back( atoi(args[++i]) );
// secure capabilities
// will be dependant based on MDS collection policy!
map<uid_t, ExtCap> ext_caps;
- //ExtCap *user_cap;
- //ExtCap *group_cap;
- //ExtCap *world_cap;
+ ExtCap *user_cap;
+ ExtCap *group_cap;
+ ExtCap *world_cap;
map<int, int> mds_caps_wanted; // [auth] mds -> caps wanted
int replica_caps_wanted; // [replica] what i've requested from auth
return &(ext_caps[user]);
return 0;
}
-
+ ExtCap* get_unix_user_cap() { return user_cap; }
+ ExtCap* get_unix_group_cap() { return group_cap; }
+ ExtCap* get_unix_world_cap() { return world_cap; }
+ void set_unix_user_cap(ExtCap* extcap) { user_cap = new ExtCap(*extcap); }
+ void set_unix_group_cap(ExtCap* extcap) { group_cap = new ExtCap(*extcap); }
+ void set_unix_world_cap(ExtCap* extcap) { world_cap = new ExtCap(*extcap); }
void replicate_relax_locks() {
assert(is_auth());
my_want |= FILE_MODE_RW;
// check cache
- ExtCap *ext_cap = in->get_user_extcap(my_user);
+ ExtCap *ext_cap;
+ // unix groups
+ if (g_conf.mds_group == 1) {
+ if (my_user == in->get_uid())
+ ext_cap = in->get_unix_user_cap();
+ else if(my_group == in->get_gid())
+ ext_cap = in->get_unix_group_cap();
+ else
+ ext_cap = in->get_unix_world_cap();
+ }
+ // no grouping
+ else
+ ext_cap = in->get_user_extcap(my_user);
if (!ext_cap) {
// make new cap
// unix grouping
if (g_conf.mds_group == 1) {
- // new group
+ // checking who is in groups
+ // is this a new group?
if (mds->unix_groups_map.count(my_group) == 0) {
// make a group & add user
CapGroup group(my_user);
mds->unix_groups_byhash[group.get_root_hash()] = group;
// put pointer into map
mds->unix_groups_map[my_group] = group.get_root_hash();
+ cout << "New group " << my_group << " from user " << my_user << endl;
}
-
// add user to group if not in group
hash_t my_hash = mds->unix_groups_map[my_group];
if (!(mds->unix_groups_byhash[my_hash].contains(my_user))) {
cout << "User " << my_user << " added to group " << my_group << endl;
}
- else
- cout << "User " << my_user << " already in group " << my_group << endl;
//get hash for gid
hash_t gid_hash = mds->unix_groups_map[my_group];
else
ext_cap = new ExtCap(my_want, my_user, in->ino());
+ // set capability id
ext_cap->set_id(cap_id_count, mds->get_nodeid());
- // increment capability count
cap_id_count++;
dout(3) << "Made new " << my_want << " capability for uid: "
ext_cap->sign_extcap(mds->getPrvKey());
// caches this capability in the inode
- in->add_user_extcap(my_user,ext_cap);
+ if (g_conf.mds_group == 1) {
+ if (my_user == in->get_uid())
+ in->set_unix_user_cap(ext_cap);
+ else if(my_user == in->get_gid())
+ in->set_unix_group_cap(ext_cap);
+ else
+ in->set_unix_world_cap(ext_cap);
+ }
+ else
+ in->add_user_extcap(my_user,ext_cap);
}
// we want to index based on mode, so we can cache more caps
cout << "hande_osd_update_reply for " << my_hash << endl;
dout(10) << "hande_osd_update_reply for " << my_hash << endl;
-
- // add the new list to our cache
- user_groups[my_hash].set_list(m->get_list());
-
+
// verify
if (m->verify_list(monmap->get_key()))
cout << "List verification succeeded" << endl;
else
cout << "List verification failed" << endl;
+ // add the new list to our cache
+ user_groups[my_hash].set_list(m->get_list());
+
// wait up the waiter(s)
// this signals all update waiters
//for (list<Cond*>::iterator p = update_waiter_cond[my_hash].begin();