Damian Brunold

Git und linux-2.6

2010-04-25 21:00 Linux, Programmieren

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.