Damian Brunold
Git und linux-2.6
2010-04-25 21:00
Ich habe mit das Git Repository linux-2.6 von Torvalds geklont. Periodisch pulle ich nun die Änderungen. Und ich lerne mich im Projekt zurechtzufinden und mit Git umzugehen. Das alles gefällt mir sehr gut und ich lerne ständig was. Ein Beispiel mit
git log --format=oneline --abbrev-commit
bekomme ich eine kurze, knappe Liste der Commits. Ein Eintrag ist beispielsweise :
93b4a44 keys: fix an RCU warning
Nun kann ich schauen, was mit diesem Commit geändert hat:
git diff 93b4a44^ 93b4a44
und erhalte:
diff --git a/security/keys/request_key.c b/security/keys/request_key.c
index 03fe63e..ea97c31 100644
--- a/security/keys/request_key.c
+++ b/security/keys/request_key.c
@@ -68,7 +68,8 @@ static int call_sbin_request_key(struct key_construction *cons,
{
const struct cred *cred = current_cred();
key_serial_t prkey, sskey;
- struct key *key = cons->key, *authkey = cons->authkey, *keyring;
+ struct key *key = cons->key, *authkey = cons->authkey, *keyring,
+ *session;
char *argv[9], *envp[3], uid_str[12], gid_str[12];
char key_str[12], keyring_str[3][12];
char desc[20];
@@ -112,10 +113,12 @@ static int call_sbin_request_key(struct key_construction *cons,
if (cred->tgcred->process_keyring)
prkey = cred->tgcred->process_keyring->serial;
- if (cred->tgcred->session_keyring)
- sskey = rcu_dereference(cred->tgcred->session_keyring)->serial;
- else
- sskey = cred->user->session_keyring->serial;
+ rcu_read_lock();
+ session = rcu_dereference(cred->tgcred->session_keyring);
+ if (!session)
+ session = cred->user->session_keyring;
+ sskey = session->serial;
+ rcu_read_unlock();
sprintf(keyring_str[2], "%d", sskey);
Anderes Beispiel: im Zusammenhang mit dem /dev/random Problem in der Imagic habe ich den Sourcecode des Treibers angeschaut. Er liegt in
drivers/char/random.c
und ist extensiv dokumentiert und mit Kommentaren versehen. Natürlich verstehe ich nicht alles darin, aber ich habe den relevante Code rasch gefunden und konnte ihn anschauen.