Whamcloud - gitweb
Merge branch 'maint' into next
[tools/e2fsprogs.git] / e2fsck / revoke.c
index 1665099..38c265e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * linux/fs/revoke.c
- * 
+ *
  * Written by Stephen C. Tweedie <sct@redhat.com>, 2000
  *
  * Copyright 2000 Red Hat corp --- All Rights Reserved
  * Revoke is the mechanism used to prevent old log records for deleted
  * metadata from being replayed on top of newer data using the same
  * blocks.  The revoke mechanism is used in two separate places:
- * 
+ *
  * + Commit: during commit we write the entire list of the current
  *   transaction's revoked blocks to the journal
- * 
+ *
  * + Recovery: during recovery we record the transaction ID of all
  *   revoked blocks.  If there are multiple revoke records in the log
  *   for a single block, only the last one counts, and if there is a log
@@ -29,7 +29,7 @@
  * single transaction:
  *
  * Block is revoked and then journaled:
- *   The desired end result is the journaling of the new block, so we 
+ *   The desired end result is the journaling of the new block, so we
  *   cancel the revoke before the transaction commits.
  *
  * Block is journaled and then revoked:
@@ -41,7 +41,7 @@
  *   transaction must have happened after the block was journaled and so
  *   the revoke must take precedence.
  *
- * Block is revoked and then written as data: 
+ * Block is revoked and then written as data:
  *   The data write is allowed to succeed, but the revoke is _not_
  *   cancelled.  We still need to prevent old log records from
  *   overwriting the new data.  We don't even need to clear the revoke
  *                     buffer has not been revoked, and cancel_revoke
  *                     need do nothing.
  * RevokeValid set, Revoked set:
- *                     buffer has been revoked.  
+ *                     buffer has been revoked.
  */
 
 #ifndef __KERNEL__
+#include "config.h"
 #include "jfs_user.h"
 #else
 #include <linux/sched.h>
@@ -78,11 +79,11 @@ static lkmem_cache_t *revoke_table_cache;
    journal replay, this involves recording the transaction ID of the
    last transaction to revoke this block. */
 
-struct jbd_revoke_record_s 
+struct jbd_revoke_record_s
 {
        struct list_head  hash;
        tid_t             sequence;     /* Used for recovery only */
-       unsigned long     blocknr;      
+       unsigned long     blocknr;
 };
 
 
@@ -91,8 +92,8 @@ struct jbd_revoke_table_s
 {
        /* It is conceivable that we might want a larger hash table
         * for recovery.  Must be a power of two. */
-       int               hash_size; 
-       int               hash_shift; 
+       int               hash_size;
+       int               hash_shift;
        struct list_head *hash_table;
 };
 
@@ -111,7 +112,7 @@ static inline int hash(journal_t *journal, unsigned long block)
 {
        struct jbd_revoke_table_s *table = journal->j_revoke;
        int hash_shift = table->hash_shift;
-       
+
        return ((block << (hash_shift - 6)) ^
                (block >> 13) ^
                (block << (hash_shift - 12))) & (table->hash_size - 1);
@@ -156,7 +157,7 @@ static struct jbd_revoke_record_s *find_revoke_record(journal_t *journal,
 {
        struct list_head *hash_list;
        struct jbd_revoke_record_s *record;
-       
+
        hash_list = &journal->j_revoke->hash_table[hash(journal, blocknr)];
 
        record = (struct jbd_revoke_record_s *) hash_list->next;
@@ -185,7 +186,7 @@ int __init journal_init_revoke_caches(void)
                return -ENOMEM;
        }
        return 0;
-}      
+}
 
 void journal_destroy_revoke_caches(void)
 {
@@ -200,13 +201,13 @@ void journal_destroy_revoke_caches(void)
 int journal_init_revoke(journal_t *journal, int hash_size)
 {
        int shift, tmp;
-       
+
        J_ASSERT (journal->j_revoke == NULL);
-       
+
        journal->j_revoke = kmem_cache_alloc(revoke_table_cache, GFP_KERNEL);
        if (!journal->j_revoke)
                return -ENOMEM;
-       
+
        /* Check that the hash_size is a power of two */
        J_ASSERT ((hash_size & (hash_size-1)) == 0);
 
@@ -225,10 +226,10 @@ int journal_init_revoke(journal_t *journal, int hash_size)
                journal->j_revoke = NULL;
                return -ENOMEM;
        }
-       
+
        for (tmp = 0; tmp < hash_size; tmp++)
                INIT_LIST_HEAD(&journal->j_revoke->hash_table[tmp]);
-       
+
        return 0;
 }
 
@@ -239,16 +240,16 @@ void journal_destroy_revoke(journal_t *journal)
        struct jbd_revoke_table_s *table;
        struct list_head *hash_list;
        int i;
-       
+
        table = journal->j_revoke;
        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;
@@ -257,22 +258,22 @@ void journal_destroy_revoke(journal_t *journal)
 
 #ifdef __KERNEL__
 
-/* 
+/*
  * journal_revoke: revoke a given buffer_head from the journal.  This
  * prevents the block from being replayed during recovery if we take a
  * crash after this current transaction commits.  Any subsequent
  * metadata writes of the buffer in this transaction cancel the
- * revoke.  
+ * revoke.
  *
  * Note that this call may block --- it is up to the caller to make
  * sure that there are no further calls to journal_write_metadata
  * before the revoke is complete.  In ext3, this implies calling the
  * revoke before clearing the block bitmap when we are deleting
- * metadata. 
+ * metadata.
  *
  * Revoke performs a journal_forget on any buffer_head passed in as a
  * parameter, but does _not_ forget the buffer_head if the bh was only
- * found implicitly. 
+ * found implicitly.
  *
  * bh_in may not be a journalled buffer - it may have come off
  * the hash tables without an attached journal_head.
@@ -281,7 +282,7 @@ void journal_destroy_revoke(journal_t *journal)
  * by one.
  */
 
-int journal_revoke(handle_t *handle, unsigned long blocknr, 
+int journal_revoke(handle_t *handle, unsigned long blocknr,
                   struct buffer_head *bh_in)
 {
        struct buffer_head *bh = NULL;
@@ -379,7 +380,7 @@ int journal_cancel_revoke(handle_t *handle, struct journal_head *jh)
        int need_cancel;
        int did_revoke = 0;     /* akpm: debug */
        struct buffer_head *bh = jh2bh(jh);
-       
+
        jbd_debug(4, "journal_head %p, cancelling revoke\n", jh);
 
        /* Is the existing Revoke bit valid?  If so, we trust it, and
@@ -422,7 +423,7 @@ int journal_cancel_revoke(handle_t *handle, struct journal_head *jh)
                        __brelse(bh2);
                }
        }
-       
+
        return did_revoke;
 }
 
@@ -434,7 +435,7 @@ int journal_cancel_revoke(handle_t *handle, struct journal_head *jh)
  * Called with the journal lock held.
  */
 
-void journal_write_revoke_records(journal_t *journal, 
+void journal_write_revoke_records(journal_t *journal,
                                  transaction_t *transaction)
 {
        struct journal_head *descriptor;
@@ -443,38 +444,38 @@ void journal_write_revoke_records(journal_t *journal,
        struct list_head *hash_list;
        int i, offset, count;
 
-       descriptor = NULL; 
+       descriptor = NULL;
        offset = 0;
        count = 0;
        revoke = journal->j_revoke;
-       
+
        for (i = 0; i < revoke->hash_size; i++) {
                hash_list = &revoke->hash_table[i];
 
                while (!list_empty(hash_list)) {
-                       record = (struct jbd_revoke_record_s *) 
+                       record = (struct jbd_revoke_record_s *)
                                hash_list->next;
                        write_one_revoke_record(journal, transaction,
-                                               &descriptor, &offset, 
+                                               &descriptor, &offset,
                                                record);
                        count++;
                        list_del(&record->hash);
                        kmem_cache_free(revoke_record_cache, record);
                }
        }
-       if (descriptor) 
+       if (descriptor)
                flush_descriptor(journal, descriptor, offset);
        jbd_debug(1, "Wrote %d revoke records\n", count);
 }
 
-/* 
+/*
  * Write out one revoke record.  We need to create a new descriptor
- * block if the old one is full or if we have not already created one.  
+ * block if the old one is full or if we have not already created one.
  */
 
-static void write_one_revoke_record(journal_t *journal, 
+static void write_one_revoke_record(journal_t *journal,
                                    transaction_t *transaction,
-                                   struct journal_head **descriptorp, 
+                                   struct journal_head **descriptorp,
                                    int *offsetp,
                                    struct jbd_revoke_record_s *record)
 {
@@ -499,7 +500,7 @@ static void write_one_revoke_record(journal_t *journal,
                        descriptor = NULL;
                }
        }
-       
+
        if (!descriptor) {
                descriptor = journal_get_descriptor_buffer(journal);
                if (!descriptor)
@@ -516,22 +517,22 @@ static void write_one_revoke_record(journal_t *journal,
                offset = sizeof(journal_revoke_header_t);
                *descriptorp = descriptor;
        }
-       
-       * ((unsigned int *)(&jh2bh(descriptor)->b_data[offset])) = 
+
+       * ((unsigned int *)(&jh2bh(descriptor)->b_data[offset])) =
                htonl(record->blocknr);
        offset += 4;
        *offsetp = offset;
 }
 
-/* 
+/*
  * Flush a revoke descriptor out to the journal.  If we are aborting,
  * this is a noop; otherwise we are generating a buffer which needs to
  * be waited for during commit, so it has to go onto the appropriate
  * journal buffer list.
  */
 
-static void flush_descriptor(journal_t *journal, 
-                            struct journal_head *descriptor, 
+static void flush_descriptor(journal_t *journal,
+                            struct journal_head *descriptor,
                             int offset)
 {
        journal_revoke_header_t *header;
@@ -541,7 +542,7 @@ static void flush_descriptor(journal_t *journal,
                __brelse(jh2bh(descriptor));
                return;
        }
-       
+
        header = (journal_revoke_header_t *) jh2bh(descriptor)->b_data;
        header->r_count = htonl(offset);
        set_bit(BH_JWrite, &jh2bh(descriptor)->b_state);
@@ -554,7 +555,7 @@ static void flush_descriptor(journal_t *journal,
 
 #endif
 
-/* 
+/*
  * Revoke support for recovery.
  *
  * Recovery needs to be able to:
@@ -565,7 +566,7 @@ static void flush_descriptor(journal_t *journal,
  *  check whether a given block in a given transaction should be replayed
  *  (ie. has not been revoked by a revoke record in that or a subsequent
  *  transaction)
- * 
+ *
  *  empty the revoke table after recovery.
  */
 
@@ -573,15 +574,15 @@ static void flush_descriptor(journal_t *journal,
  * First, setting revoke records.  We create a new revoke record for
  * every block ever revoked in the log as we scan it for recovery, and
  * we update the existing records if we find multiple revokes for a
- * single block. 
+ * single block.
  */
 
-int journal_set_revoke(journal_t *journal, 
-                      unsigned long blocknr, 
+int journal_set_revoke(journal_t *journal,
+                      unsigned long blocknr,
                       tid_t sequence)
 {
        struct jbd_revoke_record_s *record;
-       
+
        record = find_revoke_record(journal, blocknr);
        if (record) {
                /* If we have multiple occurences, only record the
@@ -589,23 +590,23 @@ int journal_set_revoke(journal_t *journal,
                if (tid_gt(sequence, record->sequence))
                        record->sequence = sequence;
                return 0;
-       } 
+       }
        return insert_revoke_hash(journal, blocknr, sequence);
 }
 
-/* 
+/*
  * Test revoke records.  For a given block referenced in the log, has
  * that block been revoked?  A revoke record with a given transaction
  * sequence number revokes all blocks in that transaction and earlier
  * ones, but later transactions still need replayed.
  */
 
-int journal_test_revoke(journal_t *journal, 
+int journal_test_revoke(journal_t *journal,
                        unsigned long blocknr,
                        tid_t sequence)
 {
        struct jbd_revoke_record_s *record;
-       
+
        record = find_revoke_record(journal, blocknr);
        if (!record)
                return 0;
@@ -625,9 +626,9 @@ void journal_clear_revoke(journal_t *journal)
        struct list_head *hash_list;
        struct jbd_revoke_record_s *record;
        struct jbd_revoke_table_s *revoke;
-       
+
        revoke = journal->j_revoke;
-       
+
        for (i = 0; i < revoke->hash_size; i++) {
                hash_list = &revoke->hash_table[i];
                while (!list_empty(hash_list)) {