Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 105843
b: refs/heads/master
c: f4d79ca
h: refs/heads/master
i:
  105841: 7ca2dc4
  105839: 6f4f626
v: v3
  • Loading branch information
Duane Griffin authored and Linus Torvalds committed Jul 25, 2008
1 parent 0f01a62 commit 15658fe
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 77 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3850f7a521dc17659ef6758a219f083418788490
refs/heads/master: f4d79ca2fa211cffc07306eeed7013448e77d7ec
127 changes: 51 additions & 76 deletions trunk/fs/jbd/revoke.c
Original file line number Diff line number Diff line change
Expand Up @@ -195,109 +195,84 @@ void journal_destroy_revoke_caches(void)
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)
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);
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++)
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));

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);

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)
{
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;
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]);
}


Expand Down

0 comments on commit 15658fe

Please sign in to comment.