[OpenAFS-devel] PAGs/tokens/threads
Alberto Mancini
mancini@math.unifi.it
Fri, 7 Aug 2009 11:50:06 +0200 (CEST)
Hi,
I spent a few days trying to understand how PAGs
work on recent linux kernel (I did not find documentation,
suggestions ?) and I concluded the following:
1. pags are associated to a session_type keyring i.e.
setpag (in src/afs/LINUX/osi_groups.c) assigns a keyring
in the struct_task (in signal->session_keyring, in my current kernel)
and stores a key of type afs_pag, named "_pag" in this keyring
2. the "real" pag is stored in the payload of the "_pag" key
(and in groups)
3. when a credential is required PagInCred (in src/afs/afs_osi_pag.c)
retrieve the pag from the keyrings using ``request_key``
4. ktc_SetTok (src/auth/ktc.c) through pioctl VIOCSETTOK associates
(I do not understand well how) a token to the "current" PAG
(current here, I assume, means the pag that is found via
the _pag key of the calling task)
I have some evidence of this, but I had no chance of finding
the right piece of code.
All the previous items let me to assume that:
I cannot have a PAG associated to a thread (session keyrings
are shared between threads) and, at the same time I cannot
have different credentials associated to different threads of the same process
(tests for this exhibit a strange behavior but I think this is true).
On the other hand request_key (the one used in PagInCred) searches
for keys in any keyring (in a fixed order, starting from the thread one)
so if I store a key named "_pag" (as I did) in thread's keyring
any thread can get a pag and, thus, can have (unshared) credentials.
Can someone tell me if I (completely) misunderstood something ?
If anything before happen to be true I have a question:
what kind of interface can I provide to request a thread-pag ?
In my local tests I hijaked syscall nr. 29 (left free) and it works
but I have not idea of consequences.
Finally, I am not able to understand why pags are stored in groups too;
any help ?
Thank you,
Alberto Mancini