Whamcloud - gitweb
b=18030 dealock fix
[fs/lustre-release.git] / lustre / obdclass / lustre_handles.c
index 342b34e..28261fd 100644 (file)
@@ -54,6 +54,7 @@
 # define list_for_each_safe_rcu  list_for_each_safe
 # define rcu_read_lock()         spin_lock(&bucket->lock)
 # define rcu_read_unlock()       spin_unlock(&bucket->lock)
+# define list_for_each_entry_rcu list_for_each_entry
 #endif /* ifndef HAVE_RCU */
 
 static __u64 handle_base;
@@ -109,7 +110,7 @@ void class_handle_hash(struct portals_handle *h, portals_handle_addref_cb cb)
                 handle_base += HANDLE_INCR;
         }
         spin_unlock(&handle_base_lock);
+
         atomic_inc(&handle_count);
         h->h_addref = cb;
         spin_lock_init(&h->h_lock);
@@ -158,22 +159,6 @@ void class_handle_unhash(struct portals_handle *h)
         atomic_dec(&handle_count);
 }
 
-void class_handle_hash_back(struct portals_handle *h)
-{
-        struct handle_bucket *bucket;
-        ENTRY;
-
-        bucket = handle_hash + (h->h_cookie & HANDLE_HASH_MASK);
-
-        atomic_inc(&handle_count);
-        spin_lock(&bucket->lock);
-        list_add_rcu(&h->h_link, &bucket->head);
-        h->h_in = 1;
-        spin_unlock(&bucket->lock);
-
-        EXIT;
-}
-
 void *class_handle2object(__u64 cookie)
 {
         struct handle_bucket *bucket;
@@ -217,9 +202,12 @@ void class_handle_free_cb(struct rcu_head *rcu)
         }
 }
 
+
 int class_handle_init(void)
 {
         struct handle_bucket *bucket;
+        struct timeval tv;
+        int seed[2];
 
         LASSERT(handle_hash == NULL);
 
@@ -233,6 +221,12 @@ int class_handle_init(void)
                 CFS_INIT_LIST_HEAD(&bucket->head);
                 spin_lock_init(&bucket->lock);
         }
+
+        /** bug 21430: add randomness to the initial base */
+        ll_get_random_bytes(seed, sizeof(seed));
+        do_gettimeofday(&tv);
+        ll_srand(tv.tv_sec ^ seed[0], tv.tv_usec ^ seed[1]);
+
         ll_get_random_bytes(&handle_base, sizeof(handle_base));
         LASSERT(handle_base != 0ULL);
 
@@ -245,7 +239,6 @@ static void cleanup_all_handles(void)
 
         for (i = 0; i < HANDLE_HASH_SIZE; i++) {
                 struct portals_handle *h;
-
                 spin_lock(&handle_hash[i].lock);
                 list_for_each_entry_rcu(h, &(handle_hash[i].head), h_link) {
                         CERROR("force clean handle "LPX64" addr %p addref %p\n",