Fix races around the access to ->s_options
[linux-2.6.git] / fs / afs / server.c
index 96bb23b..f490995 100644 (file)
@@ -13,7 +13,7 @@
 #include <linux/slab.h>
 #include "internal.h"
 
-unsigned afs_server_timeout = 10;      /* server timeout in seconds */
+static unsigned afs_server_timeout = 10;       /* server timeout in seconds */
 
 static void afs_reap_server(struct work_struct *);
 
@@ -105,7 +105,7 @@ struct afs_server *afs_lookup_server(struct afs_cell *cell,
 {
        struct afs_server *server, *candidate;
 
-       _enter("%p,"NIPQUAD_FMT, cell, NIPQUAD(addr->s_addr));
+       _enter("%p,%pI4", cell, &addr->s_addr);
 
        /* quick scan of the list to see if we already have the server */
        read_lock(&cell->servers_lock);
@@ -168,9 +168,8 @@ found_server:
 server_in_two_cells:
        write_unlock(&cell->servers_lock);
        kfree(candidate);
-       printk(KERN_NOTICE "kAFS:"
-              " Server "NIPQUAD_FMT" appears to be in two cells\n",
-              NIPQUAD(*addr));
+       printk(KERN_NOTICE "kAFS: Server %pI4 appears to be in two cells\n",
+              addr);
        _leave(" = -EEXIST");
        return ERR_PTR(-EEXIST);
 }
@@ -184,7 +183,7 @@ struct afs_server *afs_find_server(const struct in_addr *_addr)
        struct rb_node *p;
        struct in_addr addr = *_addr;
 
-       _enter(NIPQUAD_FMT, NIPQUAD(addr.s_addr));
+       _enter("%pI4", &addr.s_addr);
 
        read_lock(&afs_servers_lock);
 
@@ -252,6 +251,9 @@ static void afs_destroy_server(struct afs_server *server)
 {
        _enter("%p", server);
 
+       ASSERTIF(server->cb_break_head != server->cb_break_tail,
+                delayed_work_pending(&server->cb_break_work));
+
        ASSERTCMP(server->fs_vnodes.rb_node, ==, NULL);
        ASSERTCMP(server->cb_promises.rb_node, ==, NULL);
        ASSERTCMP(server->cb_break_head, ==, server->cb_break_tail);