Quoting Oren Laadan (orenl@xxxxxxxxxxxxxxx): > > > Serge E. Hallyn wrote: > > Quoting Oren Laadan (orenl@xxxxxxxxxxxxxxx): > >> -int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size) > >> +int > >> +ipc_addid(struct ipc_ids *ids, struct kern_ipc_perm *new, int size, int req_id) > >> { > >> uid_t euid; > >> gid_t egid; > >> + int lid = 0; > >> int id, err; > >> > >> if (size > IPCMNI) > >> @@ -268,28 +270,41 @@ int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size) > >> if (ids->in_use >= size) > >> return -ENOSPC; > >> > >> + if (req_id >= 0) > >> + lid = ipcid_to_idx(req_id); > >> + > >> spin_lock_init(&new->lock); > >> new->deleted = 0; > >> rcu_read_lock(); > >> spin_lock(&new->lock); > >> > >> - err = idr_get_new(&ids->ipcs_idr, new, &id); > >> + err = idr_get_new_above(&ids->ipcs_idr, new, lid, &id); > >> if (err) { > >> spin_unlock(&new->lock); > >> rcu_read_unlock(); > >> return err; > >> } > >> > >> + if (req_id >= 0) { > >> + if (id != lid) { > >> + idr_remove(&ids->ipcs_idr, id); > >> + spin_unlock(&new->lock); > >> + rcu_read_unlock(); > >> + return -EBUSY; > >> + } > >> + new->seq = req_id / SEQ_MULTIPLIER; > > > > Should this be > > > > new->seq = req_id % ids->seq_max; > > > > ? > > This is how the user-visible IPC id is constructed: > > static inline int ipc_buildid(int id, int seq) > { > return SEQ_MULTIPLIER * seq + id; > } > > and I want to get the original 'seq' .... (the 'id' in this function is > an in-kernel identifier) Hmm, yeah, I guess... I misunderstood what seq was doing. In fact, now I just don't understand what it's doing at all... Weird. > >> + } else { > >> + new->seq = ids->seq++; > >> + if (ids->seq > ids->seq_max) > >> + ids->seq = 0; > >> + } > >> + > >> ids->in_use++; > >> > >> current_euid_egid(&euid, &egid); > >> new->cuid = new->uid = euid; > >> new->gid = new->cgid = egid; > >> > >> - new->seq = ids->seq++; > >> - if(ids->seq > ids->seq_max) > >> - ids->seq = 0; > >> - > > _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/containers