|
@@ -195,109 +195,84 @@ void journal_destroy_revoke_caches(void)
|
|
revoke_table_cache = NULL;
|
|
revoke_table_cache = NULL;
|
|
}
|
|
}
|
|
|
|
|
|
-/* Initialise the revoke table for a given journal to a given size. */
|
|
|
|
-
|
|
|
|
-int journal_init_revoke(journal_t *journal, int hash_size)
|
|
|
|
|
|
+static struct jbd_revoke_table_s *journal_init_revoke_table(int hash_size)
|
|
{
|
|
{
|
|
- int shift, tmp;
|
|
|
|
|
|
+ int shift = 0;
|
|
|
|
+ int tmp = hash_size;
|
|
|
|
+ struct jbd_revoke_table_s *table;
|
|
|
|
|
|
- J_ASSERT (journal->j_revoke_table[0] == NULL);
|
|
|
|
|
|
+ table = kmem_cache_alloc(revoke_table_cache, GFP_KERNEL);
|
|
|
|
+ if (!table)
|
|
|
|
+ goto out;
|
|
|
|
|
|
- shift = 0;
|
|
|
|
- tmp = hash_size;
|
|
|
|
while((tmp >>= 1UL) != 0UL)
|
|
while((tmp >>= 1UL) != 0UL)
|
|
shift++;
|
|
shift++;
|
|
|
|
|
|
- journal->j_revoke_table[0] = kmem_cache_alloc(revoke_table_cache, GFP_KERNEL);
|
|
|
|
- if (!journal->j_revoke_table[0])
|
|
|
|
- return -ENOMEM;
|
|
|
|
- journal->j_revoke = journal->j_revoke_table[0];
|
|
|
|
-
|
|
|
|
- /* Check that the hash_size is a power of two */
|
|
|
|
- J_ASSERT(is_power_of_2(hash_size));
|
|
|
|
-
|
|
|
|
- journal->j_revoke->hash_size = hash_size;
|
|
|
|
-
|
|
|
|
- journal->j_revoke->hash_shift = shift;
|
|
|
|
-
|
|
|
|
- journal->j_revoke->hash_table =
|
|
|
|
|
|
+ table->hash_size = hash_size;
|
|
|
|
+ table->hash_shift = shift;
|
|
|
|
+ table->hash_table =
|
|
kmalloc(hash_size * sizeof(struct list_head), GFP_KERNEL);
|
|
kmalloc(hash_size * sizeof(struct list_head), GFP_KERNEL);
|
|
- if (!journal->j_revoke->hash_table) {
|
|
|
|
- kmem_cache_free(revoke_table_cache, journal->j_revoke_table[0]);
|
|
|
|
- journal->j_revoke = NULL;
|
|
|
|
- return -ENOMEM;
|
|
|
|
|
|
+ if (!table->hash_table) {
|
|
|
|
+ kmem_cache_free(revoke_table_cache, table);
|
|
|
|
+ table = NULL;
|
|
|
|
+ goto out;
|
|
}
|
|
}
|
|
|
|
|
|
for (tmp = 0; tmp < hash_size; tmp++)
|
|
for (tmp = 0; tmp < hash_size; tmp++)
|
|
- INIT_LIST_HEAD(&journal->j_revoke->hash_table[tmp]);
|
|
|
|
|
|
+ INIT_LIST_HEAD(&table->hash_table[tmp]);
|
|
|
|
|
|
- journal->j_revoke_table[1] = kmem_cache_alloc(revoke_table_cache, GFP_KERNEL);
|
|
|
|
- if (!journal->j_revoke_table[1]) {
|
|
|
|
- kfree(journal->j_revoke_table[0]->hash_table);
|
|
|
|
- kmem_cache_free(revoke_table_cache, journal->j_revoke_table[0]);
|
|
|
|
- return -ENOMEM;
|
|
|
|
|
|
+out:
|
|
|
|
+ return table;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void journal_destroy_revoke_table(struct jbd_revoke_table_s *table)
|
|
|
|
+{
|
|
|
|
+ int i;
|
|
|
|
+ struct list_head *hash_list;
|
|
|
|
+
|
|
|
|
+ for (i = 0; i < table->hash_size; i++) {
|
|
|
|
+ hash_list = &table->hash_table[i];
|
|
|
|
+ J_ASSERT(list_empty(hash_list));
|
|
}
|
|
}
|
|
|
|
|
|
- journal->j_revoke = journal->j_revoke_table[1];
|
|
|
|
|
|
+ kfree(table->hash_table);
|
|
|
|
+ kmem_cache_free(revoke_table_cache, table);
|
|
|
|
+}
|
|
|
|
|
|
- /* Check that the hash_size is a power of two */
|
|
|
|
|
|
+/* Initialise the revoke table for a given journal to a given size. */
|
|
|
|
+int journal_init_revoke(journal_t *journal, int hash_size)
|
|
|
|
+{
|
|
|
|
+ J_ASSERT(journal->j_revoke_table[0] == NULL);
|
|
J_ASSERT(is_power_of_2(hash_size));
|
|
J_ASSERT(is_power_of_2(hash_size));
|
|
|
|
|
|
- journal->j_revoke->hash_size = hash_size;
|
|
|
|
|
|
+ journal->j_revoke_table[0] = journal_init_revoke_table(hash_size);
|
|
|
|
+ if (!journal->j_revoke_table[0])
|
|
|
|
+ goto fail0;
|
|
|
|
|
|
- journal->j_revoke->hash_shift = shift;
|
|
|
|
|
|
+ journal->j_revoke_table[1] = journal_init_revoke_table(hash_size);
|
|
|
|
+ if (!journal->j_revoke_table[1])
|
|
|
|
+ goto fail1;
|
|
|
|
|
|
- journal->j_revoke->hash_table =
|
|
|
|
- kmalloc(hash_size * sizeof(struct list_head), GFP_KERNEL);
|
|
|
|
- if (!journal->j_revoke->hash_table) {
|
|
|
|
- kfree(journal->j_revoke_table[0]->hash_table);
|
|
|
|
- kmem_cache_free(revoke_table_cache, journal->j_revoke_table[0]);
|
|
|
|
- kmem_cache_free(revoke_table_cache, journal->j_revoke_table[1]);
|
|
|
|
- journal->j_revoke = NULL;
|
|
|
|
- return -ENOMEM;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- for (tmp = 0; tmp < hash_size; tmp++)
|
|
|
|
- INIT_LIST_HEAD(&journal->j_revoke->hash_table[tmp]);
|
|
|
|
|
|
+ journal->j_revoke = journal->j_revoke_table[1];
|
|
|
|
|
|
spin_lock_init(&journal->j_revoke_lock);
|
|
spin_lock_init(&journal->j_revoke_lock);
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
-}
|
|
|
|
|
|
|
|
-/* Destoy a journal's revoke table. The table must already be empty! */
|
|
|
|
|
|
+fail1:
|
|
|
|
+ journal_destroy_revoke_table(journal->j_revoke_table[0]);
|
|
|
|
+fail0:
|
|
|
|
+ return -ENOMEM;
|
|
|
|
+}
|
|
|
|
|
|
|
|
+/* Destroy a journal's revoke table. The table must already be empty! */
|
|
void journal_destroy_revoke(journal_t *journal)
|
|
void journal_destroy_revoke(journal_t *journal)
|
|
{
|
|
{
|
|
- struct jbd_revoke_table_s *table;
|
|
|
|
- struct list_head *hash_list;
|
|
|
|
- int i;
|
|
|
|
-
|
|
|
|
- table = journal->j_revoke_table[0];
|
|
|
|
- if (!table)
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
- for (i=0; i<table->hash_size; i++) {
|
|
|
|
- hash_list = &table->hash_table[i];
|
|
|
|
- J_ASSERT (list_empty(hash_list));
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- kfree(table->hash_table);
|
|
|
|
- kmem_cache_free(revoke_table_cache, table);
|
|
|
|
- journal->j_revoke = NULL;
|
|
|
|
-
|
|
|
|
- table = journal->j_revoke_table[1];
|
|
|
|
- if (!table)
|
|
|
|
- return;
|
|
|
|
-
|
|
|
|
- for (i=0; i<table->hash_size; i++) {
|
|
|
|
- hash_list = &table->hash_table[i];
|
|
|
|
- J_ASSERT (list_empty(hash_list));
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- kfree(table->hash_table);
|
|
|
|
- kmem_cache_free(revoke_table_cache, table);
|
|
|
|
journal->j_revoke = NULL;
|
|
journal->j_revoke = NULL;
|
|
|
|
+ if (journal->j_revoke_table[0])
|
|
|
|
+ journal_destroy_revoke_table(journal->j_revoke_table[0]);
|
|
|
|
+ if (journal->j_revoke_table[1])
|
|
|
|
+ journal_destroy_revoke_table(journal->j_revoke_table[1]);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|