[PATCH] ext3 and jbd cleanup: remove whitespace
Remove whitespace from ext3 and jbd, before we clone ext4. Signed-off-by: Mingming Cao<cmm@us.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:

committed by
Linus Torvalds

parent
e7ab8d6505
commit
ae6ddcc5f2
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* linux/fs/checkpoint.c
|
||||
*
|
||||
*
|
||||
* Written by Stephen C. Tweedie <sct@redhat.com>, 1999
|
||||
*
|
||||
* Copyright 1999 Red Hat Software --- All Rights Reserved
|
||||
@@ -9,8 +9,8 @@
|
||||
* the terms of the GNU General Public License, version 2, or at your
|
||||
* option, any later version, incorporated herein by reference.
|
||||
*
|
||||
* Checkpoint routines for the generic filesystem journaling code.
|
||||
* Part of the ext2fs journaling system.
|
||||
* Checkpoint routines for the generic filesystem journaling code.
|
||||
* Part of the ext2fs journaling system.
|
||||
*
|
||||
* Checkpointing is the process of ensuring that a section of the log is
|
||||
* committed fully to disk, so that that portion of the log can be
|
||||
@@ -226,7 +226,7 @@ __flush_batch(journal_t *journal, struct buffer_head **bhs, int *batch_count)
|
||||
* Try to flush one buffer from the checkpoint list to disk.
|
||||
*
|
||||
* Return 1 if something happened which requires us to abort the current
|
||||
* scan of the checkpoint list.
|
||||
* scan of the checkpoint list.
|
||||
*
|
||||
* Called with j_list_lock held and drops it if 1 is returned
|
||||
* Called under jbd_lock_bh_state(jh2bh(jh)), and drops it
|
||||
@@ -270,7 +270,7 @@ static int __process_buffer(journal_t *journal, struct journal_head *jh,
|
||||
* possibly block, while still holding the journal lock.
|
||||
* We cannot afford to let the transaction logic start
|
||||
* messing around with this buffer before we write it to
|
||||
* disk, as that would break recoverability.
|
||||
* disk, as that would break recoverability.
|
||||
*/
|
||||
BUFFER_TRACE(bh, "queue");
|
||||
get_bh(bh);
|
||||
@@ -293,7 +293,7 @@ static int __process_buffer(journal_t *journal, struct journal_head *jh,
|
||||
* Perform an actual checkpoint. We take the first transaction on the
|
||||
* list of transactions to be checkpointed and send all its buffers
|
||||
* to disk. We submit larger chunks of data at once.
|
||||
*
|
||||
*
|
||||
* The journal should be locked before calling this function.
|
||||
*/
|
||||
int log_do_checkpoint(journal_t *journal)
|
||||
@@ -304,10 +304,10 @@ int log_do_checkpoint(journal_t *journal)
|
||||
|
||||
jbd_debug(1, "Start checkpoint\n");
|
||||
|
||||
/*
|
||||
/*
|
||||
* First thing: if there are any transactions in the log which
|
||||
* don't need checkpointing, just eliminate them from the
|
||||
* journal straight away.
|
||||
* journal straight away.
|
||||
*/
|
||||
result = cleanup_journal_tail(journal);
|
||||
jbd_debug(1, "cleanup_journal_tail returned %d\n", result);
|
||||
@@ -385,9 +385,9 @@ out:
|
||||
* we have already got rid of any since the last update of the log tail
|
||||
* in the journal superblock. If so, we can instantly roll the
|
||||
* superblock forward to remove those transactions from the log.
|
||||
*
|
||||
*
|
||||
* Return <0 on error, 0 on success, 1 if there was nothing to clean up.
|
||||
*
|
||||
*
|
||||
* Called with the journal lock held.
|
||||
*
|
||||
* This is the only part of the journaling code which really needs to be
|
||||
@@ -404,8 +404,8 @@ int cleanup_journal_tail(journal_t *journal)
|
||||
unsigned long blocknr, freed;
|
||||
|
||||
/* OK, work out the oldest transaction remaining in the log, and
|
||||
* the log block it starts at.
|
||||
*
|
||||
* the log block it starts at.
|
||||
*
|
||||
* If the log is now empty, we need to work out which is the
|
||||
* next transaction ID we will write, and where it will
|
||||
* start. */
|
||||
@@ -558,7 +558,7 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* journal_remove_checkpoint: called after a buffer has been committed
|
||||
* to disk (either by being write-back flushed to disk, or being
|
||||
* committed to the log).
|
||||
@@ -636,7 +636,7 @@ out:
|
||||
* Called with the journal locked.
|
||||
* Called with j_list_lock held.
|
||||
*/
|
||||
void __journal_insert_checkpoint(struct journal_head *jh,
|
||||
void __journal_insert_checkpoint(struct journal_head *jh,
|
||||
transaction_t *transaction)
|
||||
{
|
||||
JBUFFER_TRACE(jh, "entry");
|
||||
@@ -658,7 +658,7 @@ void __journal_insert_checkpoint(struct journal_head *jh,
|
||||
|
||||
/*
|
||||
* We've finished with this transaction structure: adios...
|
||||
*
|
||||
*
|
||||
* The transaction must have no links except for the checkpoint by this
|
||||
* point.
|
||||
*
|
||||
|
@@ -578,7 +578,7 @@ int journal_next_log_block(journal_t *journal, unsigned long *retp)
|
||||
* this is a no-op. If needed, we can use j_blk_offset - everything is
|
||||
* ready.
|
||||
*/
|
||||
int journal_bmap(journal_t *journal, unsigned long blocknr,
|
||||
int journal_bmap(journal_t *journal, unsigned long blocknr,
|
||||
unsigned long *retp)
|
||||
{
|
||||
int err = 0;
|
||||
@@ -699,10 +699,10 @@ fail:
|
||||
* @len: Lenght of the journal in blocks.
|
||||
* @blocksize: blocksize of journalling device
|
||||
* @returns: a newly created journal_t *
|
||||
*
|
||||
*
|
||||
* journal_init_dev creates a journal which maps a fixed contiguous
|
||||
* range of blocks on an arbitrary block device.
|
||||
*
|
||||
*
|
||||
*/
|
||||
journal_t * journal_init_dev(struct block_device *bdev,
|
||||
struct block_device *fs_dev,
|
||||
@@ -739,11 +739,11 @@ journal_t * journal_init_dev(struct block_device *bdev,
|
||||
|
||||
return journal;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
/**
|
||||
* journal_t * journal_init_inode () - creates a journal which maps to a inode.
|
||||
* @inode: An inode to create the journal in
|
||||
*
|
||||
*
|
||||
* journal_init_inode creates a journal which maps an on-disk inode as
|
||||
* the journal. The inode must exist already, must support bmap() and
|
||||
* must have all data blocks preallocated.
|
||||
@@ -763,7 +763,7 @@ journal_t * journal_init_inode (struct inode *inode)
|
||||
journal->j_inode = inode;
|
||||
jbd_debug(1,
|
||||
"journal %p: inode %s/%ld, size %Ld, bits %d, blksize %ld\n",
|
||||
journal, inode->i_sb->s_id, inode->i_ino,
|
||||
journal, inode->i_sb->s_id, inode->i_ino,
|
||||
(long long) inode->i_size,
|
||||
inode->i_sb->s_blocksize_bits, inode->i_sb->s_blocksize);
|
||||
|
||||
@@ -798,10 +798,10 @@ journal_t * journal_init_inode (struct inode *inode)
|
||||
return journal;
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* If the journal init or create aborts, we need to mark the journal
|
||||
* superblock as being NULL to prevent the journal destroy from writing
|
||||
* back a bogus superblock.
|
||||
* back a bogus superblock.
|
||||
*/
|
||||
static void journal_fail_superblock (journal_t *journal)
|
||||
{
|
||||
@@ -844,13 +844,13 @@ static int journal_reset(journal_t *journal)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* int journal_create() - Initialise the new journal file
|
||||
* @journal: Journal to create. This structure must have been initialised
|
||||
*
|
||||
*
|
||||
* Given a journal_t structure which tells us which disk blocks we can
|
||||
* use, create a new journal superblock and initialise all of the
|
||||
* journal fields from scratch.
|
||||
* journal fields from scratch.
|
||||
**/
|
||||
int journal_create(journal_t *journal)
|
||||
{
|
||||
@@ -915,7 +915,7 @@ int journal_create(journal_t *journal)
|
||||
return journal_reset(journal);
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* void journal_update_superblock() - Update journal sb on disk.
|
||||
* @journal: The journal to update.
|
||||
* @wait: Set to '0' if you don't want to wait for IO completion.
|
||||
@@ -939,7 +939,7 @@ void journal_update_superblock(journal_t *journal, int wait)
|
||||
journal->j_transaction_sequence) {
|
||||
jbd_debug(1,"JBD: Skipping superblock update on recovered sb "
|
||||
"(start %ld, seq %d, errno %d)\n",
|
||||
journal->j_tail, journal->j_tail_sequence,
|
||||
journal->j_tail, journal->j_tail_sequence,
|
||||
journal->j_errno);
|
||||
goto out;
|
||||
}
|
||||
@@ -1062,7 +1062,7 @@ static int load_superblock(journal_t *journal)
|
||||
/**
|
||||
* int journal_load() - Read journal from disk.
|
||||
* @journal: Journal to act on.
|
||||
*
|
||||
*
|
||||
* Given a journal_t structure which tells us which disk blocks contain
|
||||
* a journal, read the journal from disk to initialise the in-memory
|
||||
* structures.
|
||||
@@ -1172,9 +1172,9 @@ void journal_destroy(journal_t *journal)
|
||||
* @compat: bitmask of compatible features
|
||||
* @ro: bitmask of features that force read-only mount
|
||||
* @incompat: bitmask of incompatible features
|
||||
*
|
||||
*
|
||||
* Check whether the journal uses all of a given set of
|
||||
* features. Return true (non-zero) if it does.
|
||||
* features. Return true (non-zero) if it does.
|
||||
**/
|
||||
|
||||
int journal_check_used_features (journal_t *journal, unsigned long compat,
|
||||
@@ -1203,7 +1203,7 @@ int journal_check_used_features (journal_t *journal, unsigned long compat,
|
||||
* @compat: bitmask of compatible features
|
||||
* @ro: bitmask of features that force read-only mount
|
||||
* @incompat: bitmask of incompatible features
|
||||
*
|
||||
*
|
||||
* Check whether the journaling code supports the use of
|
||||
* all of a given set of features on this journal. Return true
|
||||
* (non-zero) if it can. */
|
||||
@@ -1241,7 +1241,7 @@ int journal_check_available_features (journal_t *journal, unsigned long compat,
|
||||
* @incompat: bitmask of incompatible features
|
||||
*
|
||||
* Mark a given journal feature as present on the
|
||||
* superblock. Returns true if the requested features could be set.
|
||||
* superblock. Returns true if the requested features could be set.
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -1327,7 +1327,7 @@ static int journal_convert_superblock_v1(journal_t *journal,
|
||||
/**
|
||||
* int journal_flush () - Flush journal
|
||||
* @journal: Journal to act on.
|
||||
*
|
||||
*
|
||||
* Flush all data for a given journal to disk and empty the journal.
|
||||
* Filesystems can use this when remounting readonly to ensure that
|
||||
* recovery does not need to happen on remount.
|
||||
@@ -1394,7 +1394,7 @@ int journal_flush(journal_t *journal)
|
||||
* int journal_wipe() - Wipe journal contents
|
||||
* @journal: Journal to act on.
|
||||
* @write: flag (see below)
|
||||
*
|
||||
*
|
||||
* Wipe out all of the contents of a journal, safely. This will produce
|
||||
* a warning if the journal contains any valid recovery information.
|
||||
* Must be called between journal_init_*() and journal_load().
|
||||
@@ -1449,7 +1449,7 @@ static const char *journal_dev_name(journal_t *journal, char *buffer)
|
||||
|
||||
/*
|
||||
* Journal abort has very specific semantics, which we describe
|
||||
* for journal abort.
|
||||
* for journal abort.
|
||||
*
|
||||
* Two internal function, which provide abort to te jbd layer
|
||||
* itself are here.
|
||||
@@ -1504,7 +1504,7 @@ static void __journal_abort_soft (journal_t *journal, int errno)
|
||||
* Perform a complete, immediate shutdown of the ENTIRE
|
||||
* journal (not of a single transaction). This operation cannot be
|
||||
* undone without closing and reopening the journal.
|
||||
*
|
||||
*
|
||||
* The journal_abort function is intended to support higher level error
|
||||
* recovery mechanisms such as the ext2/ext3 remount-readonly error
|
||||
* mode.
|
||||
@@ -1538,7 +1538,7 @@ static void __journal_abort_soft (journal_t *journal, int errno)
|
||||
* supply an errno; a null errno implies that absolutely no further
|
||||
* writes are done to the journal (unless there are any already in
|
||||
* progress).
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
void journal_abort(journal_t *journal, int errno)
|
||||
@@ -1546,7 +1546,7 @@ void journal_abort(journal_t *journal, int errno)
|
||||
__journal_abort_soft(journal, errno);
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* int journal_errno () - returns the journal's error state.
|
||||
* @journal: journal to examine.
|
||||
*
|
||||
@@ -1570,7 +1570,7 @@ int journal_errno(journal_t *journal)
|
||||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* int journal_clear_err () - clears the journal's error state
|
||||
* @journal: journal to act on.
|
||||
*
|
||||
@@ -1590,7 +1590,7 @@ int journal_clear_err(journal_t *journal)
|
||||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* void journal_ack_err() - Ack journal err.
|
||||
* @journal: journal to act on.
|
||||
*
|
||||
@@ -1612,7 +1612,7 @@ int journal_blocks_per_page(struct inode *inode)
|
||||
|
||||
/*
|
||||
* Simple support for retrying memory allocations. Introduced to help to
|
||||
* debug different VM deadlock avoidance strategies.
|
||||
* debug different VM deadlock avoidance strategies.
|
||||
*/
|
||||
void * __jbd_kmalloc (const char *where, size_t size, gfp_t flags, int retry)
|
||||
{
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* linux/fs/recovery.c
|
||||
*
|
||||
*
|
||||
* Written by Stephen C. Tweedie <sct@redhat.com>, 1999
|
||||
*
|
||||
* Copyright 1999-2000 Red Hat Software --- All Rights Reserved
|
||||
@@ -10,7 +10,7 @@
|
||||
* option, any later version, incorporated herein by reference.
|
||||
*
|
||||
* Journal recovery routines for the generic filesystem journaling code;
|
||||
* part of the ext2fs journaling system.
|
||||
* part of the ext2fs journaling system.
|
||||
*/
|
||||
|
||||
#ifndef __KERNEL__
|
||||
@@ -25,9 +25,9 @@
|
||||
|
||||
/*
|
||||
* Maintain information about the progress of the recovery job, so that
|
||||
* the different passes can carry information between them.
|
||||
* the different passes can carry information between them.
|
||||
*/
|
||||
struct recovery_info
|
||||
struct recovery_info
|
||||
{
|
||||
tid_t start_transaction;
|
||||
tid_t end_transaction;
|
||||
@@ -116,7 +116,7 @@ static int do_readahead(journal_t *journal, unsigned int start)
|
||||
err = 0;
|
||||
|
||||
failed:
|
||||
if (nbufs)
|
||||
if (nbufs)
|
||||
journal_brelse_array(bufs, nbufs);
|
||||
return err;
|
||||
}
|
||||
@@ -128,7 +128,7 @@ failed:
|
||||
* Read a block from the journal
|
||||
*/
|
||||
|
||||
static int jread(struct buffer_head **bhp, journal_t *journal,
|
||||
static int jread(struct buffer_head **bhp, journal_t *journal,
|
||||
unsigned int offset)
|
||||
{
|
||||
int err;
|
||||
@@ -212,14 +212,14 @@ do { \
|
||||
/**
|
||||
* journal_recover - recovers a on-disk journal
|
||||
* @journal: the journal to recover
|
||||
*
|
||||
*
|
||||
* The primary function for recovering the log contents when mounting a
|
||||
* journaled device.
|
||||
* journaled device.
|
||||
*
|
||||
* Recovery is done in three passes. In the first pass, we look for the
|
||||
* end of the log. In the second, we assemble the list of revoke
|
||||
* blocks. In the third and final pass, we replay any un-revoked blocks
|
||||
* in the log.
|
||||
* in the log.
|
||||
*/
|
||||
int journal_recover(journal_t *journal)
|
||||
{
|
||||
@@ -231,10 +231,10 @@ int journal_recover(journal_t *journal)
|
||||
memset(&info, 0, sizeof(info));
|
||||
sb = journal->j_superblock;
|
||||
|
||||
/*
|
||||
/*
|
||||
* The journal superblock's s_start field (the current log head)
|
||||
* is always zero if, and only if, the journal was cleanly
|
||||
* unmounted.
|
||||
* unmounted.
|
||||
*/
|
||||
|
||||
if (!sb->s_start) {
|
||||
@@ -253,7 +253,7 @@ int journal_recover(journal_t *journal)
|
||||
jbd_debug(0, "JBD: recovery, exit status %d, "
|
||||
"recovered transactions %u to %u\n",
|
||||
err, info.start_transaction, info.end_transaction);
|
||||
jbd_debug(0, "JBD: Replayed %d and revoked %d/%d blocks\n",
|
||||
jbd_debug(0, "JBD: Replayed %d and revoked %d/%d blocks\n",
|
||||
info.nr_replays, info.nr_revoke_hits, info.nr_revokes);
|
||||
|
||||
/* Restart the log at the next transaction ID, thus invalidating
|
||||
@@ -268,15 +268,15 @@ int journal_recover(journal_t *journal)
|
||||
/**
|
||||
* journal_skip_recovery - Start journal and wipe exiting records
|
||||
* @journal: journal to startup
|
||||
*
|
||||
*
|
||||
* Locate any valid recovery information from the journal and set up the
|
||||
* journal structures in memory to ignore it (presumably because the
|
||||
* caller has evidence that it is out of date).
|
||||
* caller has evidence that it is out of date).
|
||||
* This function does'nt appear to be exorted..
|
||||
*
|
||||
* We perform one pass over the journal to allow us to tell the user how
|
||||
* much recovery information is being erased, and to let us initialise
|
||||
* the journal transaction sequence numbers to the next unused ID.
|
||||
* the journal transaction sequence numbers to the next unused ID.
|
||||
*/
|
||||
int journal_skip_recovery(journal_t *journal)
|
||||
{
|
||||
@@ -297,7 +297,7 @@ int journal_skip_recovery(journal_t *journal)
|
||||
#ifdef CONFIG_JBD_DEBUG
|
||||
int dropped = info.end_transaction - be32_to_cpu(sb->s_sequence);
|
||||
#endif
|
||||
jbd_debug(0,
|
||||
jbd_debug(0,
|
||||
"JBD: ignoring %d transaction%s from the journal.\n",
|
||||
dropped, (dropped == 1) ? "" : "s");
|
||||
journal->j_transaction_sequence = ++info.end_transaction;
|
||||
@@ -324,10 +324,10 @@ static int do_one_pass(journal_t *journal,
|
||||
MAX_BLOCKS_PER_DESC = ((journal->j_blocksize-sizeof(journal_header_t))
|
||||
/ sizeof(journal_block_tag_t));
|
||||
|
||||
/*
|
||||
/*
|
||||
* First thing is to establish what we expect to find in the log
|
||||
* (in terms of transaction IDs), and where (in terms of log
|
||||
* block offsets): query the superblock.
|
||||
* block offsets): query the superblock.
|
||||
*/
|
||||
|
||||
sb = journal->j_superblock;
|
||||
@@ -344,7 +344,7 @@ static int do_one_pass(journal_t *journal,
|
||||
* Now we walk through the log, transaction by transaction,
|
||||
* making sure that each transaction has a commit block in the
|
||||
* expected place. Each complete transaction gets replayed back
|
||||
* into the main filesystem.
|
||||
* into the main filesystem.
|
||||
*/
|
||||
|
||||
while (1) {
|
||||
@@ -379,8 +379,8 @@ static int do_one_pass(journal_t *journal,
|
||||
next_log_block++;
|
||||
wrap(journal, next_log_block);
|
||||
|
||||
/* What kind of buffer is it?
|
||||
*
|
||||
/* What kind of buffer is it?
|
||||
*
|
||||
* If it is a descriptor block, check that it has the
|
||||
* expected sequence number. Otherwise, we're all done
|
||||
* here. */
|
||||
@@ -394,7 +394,7 @@ static int do_one_pass(journal_t *journal,
|
||||
|
||||
blocktype = be32_to_cpu(tmp->h_blocktype);
|
||||
sequence = be32_to_cpu(tmp->h_sequence);
|
||||
jbd_debug(3, "Found magic %d, sequence %d\n",
|
||||
jbd_debug(3, "Found magic %d, sequence %d\n",
|
||||
blocktype, sequence);
|
||||
|
||||
if (sequence != next_commit_ID) {
|
||||
@@ -438,7 +438,7 @@ static int do_one_pass(journal_t *journal,
|
||||
/* Recover what we can, but
|
||||
* report failure at the end. */
|
||||
success = err;
|
||||
printk (KERN_ERR
|
||||
printk (KERN_ERR
|
||||
"JBD: IO error %d recovering "
|
||||
"block %ld in log\n",
|
||||
err, io_block);
|
||||
@@ -452,7 +452,7 @@ static int do_one_pass(journal_t *journal,
|
||||
* revoked, then we're all done
|
||||
* here. */
|
||||
if (journal_test_revoke
|
||||
(journal, blocknr,
|
||||
(journal, blocknr,
|
||||
next_commit_ID)) {
|
||||
brelse(obh);
|
||||
++info->nr_revoke_hits;
|
||||
@@ -465,7 +465,7 @@ static int do_one_pass(journal_t *journal,
|
||||
blocknr,
|
||||
journal->j_blocksize);
|
||||
if (nbh == NULL) {
|
||||
printk(KERN_ERR
|
||||
printk(KERN_ERR
|
||||
"JBD: Out of memory "
|
||||
"during recovery.\n");
|
||||
err = -ENOMEM;
|
||||
@@ -537,7 +537,7 @@ static int do_one_pass(journal_t *journal,
|
||||
}
|
||||
|
||||
done:
|
||||
/*
|
||||
/*
|
||||
* We broke out of the log scan loop: either we came to the
|
||||
* known end of the log or we found an unexpected block in the
|
||||
* log. If the latter happened, then we know that the "current"
|
||||
@@ -567,7 +567,7 @@ static int do_one_pass(journal_t *journal,
|
||||
|
||||
/* Scan a revoke record, marking all blocks mentioned as revoked. */
|
||||
|
||||
static int scan_revoke_records(journal_t *journal, struct buffer_head *bh,
|
||||
static int scan_revoke_records(journal_t *journal, struct buffer_head *bh,
|
||||
tid_t sequence, struct recovery_info *info)
|
||||
{
|
||||
journal_revoke_header_t *header;
|
||||
|
@@ -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
|
||||
@@ -15,10 +15,10 @@
|
||||
* 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
|
||||
@@ -54,7 +54,7 @@
|
||||
* 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__
|
||||
@@ -77,7 +77,7 @@ static kmem_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 */
|
||||
@@ -90,8 +90,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;
|
||||
};
|
||||
|
||||
@@ -301,22 +301,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.
|
||||
@@ -325,7 +325,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;
|
||||
@@ -487,7 +487,7 @@ void journal_switch_revoke_table(journal_t *journal)
|
||||
else
|
||||
journal->j_revoke = journal->j_revoke_table[0];
|
||||
|
||||
for (i = 0; i < journal->j_revoke->hash_size; i++)
|
||||
for (i = 0; i < journal->j_revoke->hash_size; i++)
|
||||
INIT_LIST_HEAD(&journal->j_revoke->hash_table[i]);
|
||||
}
|
||||
|
||||
@@ -498,7 +498,7 @@ void journal_switch_revoke_table(journal_t *journal)
|
||||
* 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;
|
||||
@@ -507,7 +507,7 @@ 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;
|
||||
|
||||
@@ -519,10 +519,10 @@ void journal_write_revoke_records(journal_t *journal,
|
||||
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);
|
||||
@@ -534,14 +534,14 @@ void journal_write_revoke_records(journal_t *journal,
|
||||
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)
|
||||
{
|
||||
@@ -584,21 +584,21 @@ static void write_one_revoke_record(journal_t *journal,
|
||||
*descriptorp = descriptor;
|
||||
}
|
||||
|
||||
* ((__be32 *)(&jh2bh(descriptor)->b_data[offset])) =
|
||||
* ((__be32 *)(&jh2bh(descriptor)->b_data[offset])) =
|
||||
cpu_to_be32(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;
|
||||
@@ -618,7 +618,7 @@ static void flush_descriptor(journal_t *journal,
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
/*
|
||||
* Revoke support for recovery.
|
||||
*
|
||||
* Recovery needs to be able to:
|
||||
@@ -629,7 +629,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.
|
||||
*/
|
||||
|
||||
@@ -637,11 +637,11 @@ 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;
|
||||
@@ -653,18 +653,18 @@ 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)
|
||||
{
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* linux/fs/transaction.c
|
||||
*
|
||||
*
|
||||
* Written by Stephen C. Tweedie <sct@redhat.com>, 1998
|
||||
*
|
||||
* Copyright 1998 Red Hat corp --- All Rights Reserved
|
||||
@@ -10,7 +10,7 @@
|
||||
* option, any later version, incorporated herein by reference.
|
||||
*
|
||||
* Generic filesystem transaction handling code; part of the ext2fs
|
||||
* journaling system.
|
||||
* journaling system.
|
||||
*
|
||||
* This file manages transactions (compound commits managed by the
|
||||
* journaling code) and handles (individual atomic operations by the
|
||||
@@ -74,7 +74,7 @@ get_transaction(journal_t *journal, transaction_t *transaction)
|
||||
* start_this_handle: Given a handle, deal with any locking or stalling
|
||||
* needed to make sure that there is enough journal space for the handle
|
||||
* to begin. Attach the handle to a transaction and set up the
|
||||
* transaction's buffer credits.
|
||||
* transaction's buffer credits.
|
||||
*/
|
||||
|
||||
static int start_this_handle(journal_t *journal, handle_t *handle)
|
||||
@@ -117,7 +117,7 @@ repeat_locked:
|
||||
if (is_journal_aborted(journal) ||
|
||||
(journal->j_errno != 0 && !(journal->j_flags & JFS_ACK_ERR))) {
|
||||
spin_unlock(&journal->j_state_lock);
|
||||
ret = -EROFS;
|
||||
ret = -EROFS;
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -182,7 +182,7 @@ repeat_locked:
|
||||
goto repeat;
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* The commit code assumes that it can get enough log space
|
||||
* without forcing a checkpoint. This is *critical* for
|
||||
* correctness: a checkpoint of a buffer which is also
|
||||
@@ -191,7 +191,7 @@ repeat_locked:
|
||||
*
|
||||
* We must therefore ensure the necessary space in the journal
|
||||
* *before* starting to dirty potentially checkpointed buffers
|
||||
* in the new transaction.
|
||||
* in the new transaction.
|
||||
*
|
||||
* The worst part is, any transaction currently committing can
|
||||
* reduce the free space arbitrarily. Be careful to account for
|
||||
@@ -246,13 +246,13 @@ static handle_t *new_handle(int nblocks)
|
||||
}
|
||||
|
||||
/**
|
||||
* handle_t *journal_start() - Obtain a new handle.
|
||||
* handle_t *journal_start() - Obtain a new handle.
|
||||
* @journal: Journal to start transaction on.
|
||||
* @nblocks: number of block buffer we might modify
|
||||
*
|
||||
* We make sure that the transaction can guarantee at least nblocks of
|
||||
* modified buffers in the log. We block until the log can guarantee
|
||||
* that much space.
|
||||
* that much space.
|
||||
*
|
||||
* This function is visible to journal users (like ext3fs), so is not
|
||||
* called with the journal already locked.
|
||||
@@ -292,11 +292,11 @@ handle_t *journal_start(journal_t *journal, int nblocks)
|
||||
* int journal_extend() - extend buffer credits.
|
||||
* @handle: handle to 'extend'
|
||||
* @nblocks: nr blocks to try to extend by.
|
||||
*
|
||||
*
|
||||
* Some transactions, such as large extends and truncates, can be done
|
||||
* atomically all at once or in several stages. The operation requests
|
||||
* a credit for a number of buffer modications in advance, but can
|
||||
* extend its credit if it needs more.
|
||||
* extend its credit if it needs more.
|
||||
*
|
||||
* journal_extend tries to give the running handle more buffer credits.
|
||||
* It does not guarantee that allocation - this is a best-effort only.
|
||||
@@ -363,7 +363,7 @@ out:
|
||||
* int journal_restart() - restart a handle .
|
||||
* @handle: handle to restart
|
||||
* @nblocks: nr credits requested
|
||||
*
|
||||
*
|
||||
* Restart a handle for a multi-transaction filesystem
|
||||
* operation.
|
||||
*
|
||||
@@ -462,7 +462,7 @@ void journal_lock_updates(journal_t *journal)
|
||||
/**
|
||||
* void journal_unlock_updates (journal_t* journal) - release barrier
|
||||
* @journal: Journal to release the barrier on.
|
||||
*
|
||||
*
|
||||
* Release a transaction barrier obtained with journal_lock_updates().
|
||||
*
|
||||
* Should be called without the journal lock held.
|
||||
@@ -547,8 +547,8 @@ repeat:
|
||||
jbd_lock_bh_state(bh);
|
||||
|
||||
/* We now hold the buffer lock so it is safe to query the buffer
|
||||
* state. Is the buffer dirty?
|
||||
*
|
||||
* state. Is the buffer dirty?
|
||||
*
|
||||
* If so, there are two possibilities. The buffer may be
|
||||
* non-journaled, and undergoing a quite legitimate writeback.
|
||||
* Otherwise, it is journaled, and we don't expect dirty buffers
|
||||
@@ -566,7 +566,7 @@ repeat:
|
||||
*/
|
||||
if (jh->b_transaction) {
|
||||
J_ASSERT_JH(jh,
|
||||
jh->b_transaction == transaction ||
|
||||
jh->b_transaction == transaction ||
|
||||
jh->b_transaction ==
|
||||
journal->j_committing_transaction);
|
||||
if (jh->b_next_transaction)
|
||||
@@ -653,7 +653,7 @@ repeat:
|
||||
* buffer had better remain locked during the kmalloc,
|
||||
* but that should be true --- we hold the journal lock
|
||||
* still and the buffer is already on the BUF_JOURNAL
|
||||
* list so won't be flushed.
|
||||
* list so won't be flushed.
|
||||
*
|
||||
* Subtle point, though: if this is a get_undo_access,
|
||||
* then we will be relying on the frozen_data to contain
|
||||
@@ -765,8 +765,8 @@ int journal_get_write_access(handle_t *handle, struct buffer_head *bh)
|
||||
* manually rather than reading off disk), then we need to keep the
|
||||
* buffer_head locked until it has been completely filled with new
|
||||
* data. In this case, we should be able to make the assertion that
|
||||
* the bh is not already part of an existing transaction.
|
||||
*
|
||||
* the bh is not already part of an existing transaction.
|
||||
*
|
||||
* The buffer should already be locked by the caller by this point.
|
||||
* There is no lock ranking violation: it was a newly created,
|
||||
* unlocked buffer beforehand. */
|
||||
@@ -778,7 +778,7 @@ int journal_get_write_access(handle_t *handle, struct buffer_head *bh)
|
||||
*
|
||||
* Call this if you create a new bh.
|
||||
*/
|
||||
int journal_get_create_access(handle_t *handle, struct buffer_head *bh)
|
||||
int journal_get_create_access(handle_t *handle, struct buffer_head *bh)
|
||||
{
|
||||
transaction_t *transaction = handle->h_transaction;
|
||||
journal_t *journal = transaction->t_journal;
|
||||
@@ -847,13 +847,13 @@ out:
|
||||
* do not reuse freed space until the deallocation has been committed,
|
||||
* since if we overwrote that space we would make the delete
|
||||
* un-rewindable in case of a crash.
|
||||
*
|
||||
*
|
||||
* To deal with that, journal_get_undo_access requests write access to a
|
||||
* buffer for parts of non-rewindable operations such as delete
|
||||
* operations on the bitmaps. The journaling code must keep a copy of
|
||||
* the buffer's contents prior to the undo_access call until such time
|
||||
* as we know that the buffer has definitely been committed to disk.
|
||||
*
|
||||
*
|
||||
* We never need to know which transaction the committed data is part
|
||||
* of, buffers touched here are guaranteed to be dirtied later and so
|
||||
* will be committed to a new transaction in due course, at which point
|
||||
@@ -911,13 +911,13 @@ out:
|
||||
return err;
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* int journal_dirty_data() - mark a buffer as containing dirty data which
|
||||
* needs to be flushed before we can commit the
|
||||
* current transaction.
|
||||
* current transaction.
|
||||
* @handle: transaction
|
||||
* @bh: bufferhead to mark
|
||||
*
|
||||
*
|
||||
* The buffer is placed on the transaction's data list and is marked as
|
||||
* belonging to the transaction.
|
||||
*
|
||||
@@ -946,15 +946,15 @@ int journal_dirty_data(handle_t *handle, struct buffer_head *bh)
|
||||
|
||||
/*
|
||||
* What if the buffer is already part of a running transaction?
|
||||
*
|
||||
*
|
||||
* There are two cases:
|
||||
* 1) It is part of the current running transaction. Refile it,
|
||||
* just in case we have allocated it as metadata, deallocated
|
||||
* it, then reallocated it as data.
|
||||
* it, then reallocated it as data.
|
||||
* 2) It is part of the previous, still-committing transaction.
|
||||
* If all we want to do is to guarantee that the buffer will be
|
||||
* written to disk before this new transaction commits, then
|
||||
* being sure that the *previous* transaction has this same
|
||||
* being sure that the *previous* transaction has this same
|
||||
* property is sufficient for us! Just leave it on its old
|
||||
* transaction.
|
||||
*
|
||||
@@ -1076,18 +1076,18 @@ no_journal:
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* int journal_dirty_metadata() - mark a buffer as containing dirty metadata
|
||||
* @handle: transaction to add buffer to.
|
||||
* @bh: buffer to mark
|
||||
*
|
||||
* @bh: buffer to mark
|
||||
*
|
||||
* mark dirty metadata which needs to be journaled as part of the current
|
||||
* transaction.
|
||||
*
|
||||
* The buffer is placed on the transaction's metadata list and is marked
|
||||
* as belonging to the transaction.
|
||||
* as belonging to the transaction.
|
||||
*
|
||||
* Returns error number or 0 on success.
|
||||
* Returns error number or 0 on success.
|
||||
*
|
||||
* Special care needs to be taken if the buffer already belongs to the
|
||||
* current committing transaction (in which case we should have frozen
|
||||
@@ -1135,11 +1135,11 @@ int journal_dirty_metadata(handle_t *handle, struct buffer_head *bh)
|
||||
|
||||
set_buffer_jbddirty(bh);
|
||||
|
||||
/*
|
||||
/*
|
||||
* Metadata already on the current transaction list doesn't
|
||||
* need to be filed. Metadata on another transaction's list must
|
||||
* be committing, and will be refiled once the commit completes:
|
||||
* leave it alone for now.
|
||||
* leave it alone for now.
|
||||
*/
|
||||
if (jh->b_transaction != transaction) {
|
||||
JBUFFER_TRACE(jh, "already on other transaction");
|
||||
@@ -1165,7 +1165,7 @@ out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* journal_release_buffer: undo a get_write_access without any buffer
|
||||
* updates, if the update decided in the end that it didn't need access.
|
||||
*
|
||||
@@ -1176,20 +1176,20 @@ journal_release_buffer(handle_t *handle, struct buffer_head *bh)
|
||||
BUFFER_TRACE(bh, "entry");
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* void journal_forget() - bforget() for potentially-journaled buffers.
|
||||
* @handle: transaction handle
|
||||
* @bh: bh to 'forget'
|
||||
*
|
||||
* We can only do the bforget if there are no commits pending against the
|
||||
* buffer. If the buffer is dirty in the current running transaction we
|
||||
* can safely unlink it.
|
||||
* can safely unlink it.
|
||||
*
|
||||
* bh may not be a journalled buffer at all - it may be a non-JBD
|
||||
* buffer which came off the hashtable. Check for this.
|
||||
*
|
||||
* Decrements bh->b_count by one.
|
||||
*
|
||||
*
|
||||
* Allow this call even if the handle has aborted --- it may be part of
|
||||
* the caller's cleanup after an abort.
|
||||
*/
|
||||
@@ -1237,7 +1237,7 @@ int journal_forget (handle_t *handle, struct buffer_head *bh)
|
||||
|
||||
drop_reserve = 1;
|
||||
|
||||
/*
|
||||
/*
|
||||
* We are no longer going to journal this buffer.
|
||||
* However, the commit of this transaction is still
|
||||
* important to the buffer: the delete that we are now
|
||||
@@ -1246,7 +1246,7 @@ int journal_forget (handle_t *handle, struct buffer_head *bh)
|
||||
*
|
||||
* So, if we have a checkpoint on the buffer, we should
|
||||
* now refile the buffer on our BJ_Forget list so that
|
||||
* we know to remove the checkpoint after we commit.
|
||||
* we know to remove the checkpoint after we commit.
|
||||
*/
|
||||
|
||||
if (jh->b_cp_transaction) {
|
||||
@@ -1264,7 +1264,7 @@ int journal_forget (handle_t *handle, struct buffer_head *bh)
|
||||
}
|
||||
}
|
||||
} else if (jh->b_transaction) {
|
||||
J_ASSERT_JH(jh, (jh->b_transaction ==
|
||||
J_ASSERT_JH(jh, (jh->b_transaction ==
|
||||
journal->j_committing_transaction));
|
||||
/* However, if the buffer is still owned by a prior
|
||||
* (committing) transaction, we can't drop it yet... */
|
||||
@@ -1294,7 +1294,7 @@ drop:
|
||||
/**
|
||||
* int journal_stop() - complete a transaction
|
||||
* @handle: tranaction to complete.
|
||||
*
|
||||
*
|
||||
* All done for a particular handle.
|
||||
*
|
||||
* There is not much action needed here. We just return any remaining
|
||||
@@ -1303,7 +1303,7 @@ drop:
|
||||
* filesystem is marked for synchronous update.
|
||||
*
|
||||
* journal_stop itself will not usually return an error, but it may
|
||||
* do so in unusual circumstances. In particular, expect it to
|
||||
* do so in unusual circumstances. In particular, expect it to
|
||||
* return -EIO if a journal_abort has been executed since the
|
||||
* transaction began.
|
||||
*/
|
||||
@@ -1388,7 +1388,7 @@ int journal_stop(handle_t *handle)
|
||||
|
||||
/*
|
||||
* Special case: JFS_SYNC synchronous updates require us
|
||||
* to wait for the commit to complete.
|
||||
* to wait for the commit to complete.
|
||||
*/
|
||||
if (handle->h_sync && !(current->flags & PF_MEMALLOC))
|
||||
err = log_wait_commit(journal, tid);
|
||||
@@ -1439,7 +1439,7 @@ int journal_force_commit(journal_t *journal)
|
||||
* jbd_lock_bh_state(jh2bh(jh)) is held.
|
||||
*/
|
||||
|
||||
static inline void
|
||||
static inline void
|
||||
__blist_add_buffer(struct journal_head **list, struct journal_head *jh)
|
||||
{
|
||||
if (!*list) {
|
||||
@@ -1454,7 +1454,7 @@ __blist_add_buffer(struct journal_head **list, struct journal_head *jh)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* Remove a buffer from a transaction list, given the transaction's list
|
||||
* head pointer.
|
||||
*
|
||||
@@ -1475,7 +1475,7 @@ __blist_del_buffer(struct journal_head **list, struct journal_head *jh)
|
||||
jh->b_tnext->b_tprev = jh->b_tprev;
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* Remove a buffer from the appropriate transaction list.
|
||||
*
|
||||
* Note that this function can *change* the value of
|
||||
@@ -1595,17 +1595,17 @@ out:
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
/**
|
||||
* int journal_try_to_free_buffers() - try to free page buffers.
|
||||
* @journal: journal for operation
|
||||
* @page: to try and free
|
||||
* @unused_gfp_mask: unused
|
||||
*
|
||||
*
|
||||
*
|
||||
* For all the buffers on this page,
|
||||
* if they are fully written out ordered data, move them onto BUF_CLEAN
|
||||
* so try_to_free_buffers() can reap them.
|
||||
*
|
||||
*
|
||||
* This function returns non-zero if we wish try_to_free_buffers()
|
||||
* to be called. We do this if the page is releasable by try_to_free_buffers().
|
||||
* We also do it if the page has locked or dirty buffers and the caller wants
|
||||
@@ -1629,7 +1629,7 @@ out:
|
||||
* cannot happen because we never reallocate freed data as metadata
|
||||
* while the data is part of a transaction. Yes?
|
||||
*/
|
||||
int journal_try_to_free_buffers(journal_t *journal,
|
||||
int journal_try_to_free_buffers(journal_t *journal,
|
||||
struct page *page, gfp_t unused_gfp_mask)
|
||||
{
|
||||
struct buffer_head *head;
|
||||
@@ -1697,7 +1697,7 @@ static int __dispose_buffer(struct journal_head *jh, transaction_t *transaction)
|
||||
}
|
||||
|
||||
/*
|
||||
* journal_invalidatepage
|
||||
* journal_invalidatepage
|
||||
*
|
||||
* This code is tricky. It has a number of cases to deal with.
|
||||
*
|
||||
@@ -1705,15 +1705,15 @@ static int __dispose_buffer(struct journal_head *jh, transaction_t *transaction)
|
||||
*
|
||||
* i_size must be updated on disk before we start calling invalidatepage on the
|
||||
* data.
|
||||
*
|
||||
*
|
||||
* This is done in ext3 by defining an ext3_setattr method which
|
||||
* updates i_size before truncate gets going. By maintaining this
|
||||
* invariant, we can be sure that it is safe to throw away any buffers
|
||||
* attached to the current transaction: once the transaction commits,
|
||||
* we know that the data will not be needed.
|
||||
*
|
||||
*
|
||||
* Note however that we can *not* throw away data belonging to the
|
||||
* previous, committing transaction!
|
||||
* previous, committing transaction!
|
||||
*
|
||||
* Any disk blocks which *are* part of the previous, committing
|
||||
* transaction (and which therefore cannot be discarded immediately) are
|
||||
@@ -1732,7 +1732,7 @@ static int __dispose_buffer(struct journal_head *jh, transaction_t *transaction)
|
||||
* don't make guarantees about the order in which data hits disk --- in
|
||||
* particular we don't guarantee that new dirty data is flushed before
|
||||
* transaction commit --- so it is always safe just to discard data
|
||||
* immediately in that mode. --sct
|
||||
* immediately in that mode. --sct
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -1876,9 +1876,9 @@ zap_buffer_unlocked:
|
||||
return may_free;
|
||||
}
|
||||
|
||||
/**
|
||||
/**
|
||||
* void journal_invalidatepage()
|
||||
* @journal: journal to use for flush...
|
||||
* @journal: journal to use for flush...
|
||||
* @page: page to flush
|
||||
* @offset: length of page to invalidate.
|
||||
*
|
||||
@@ -1886,7 +1886,7 @@ zap_buffer_unlocked:
|
||||
*
|
||||
*/
|
||||
void journal_invalidatepage(journal_t *journal,
|
||||
struct page *page,
|
||||
struct page *page,
|
||||
unsigned long offset)
|
||||
{
|
||||
struct buffer_head *head, *bh, *next;
|
||||
@@ -1924,8 +1924,8 @@ void journal_invalidatepage(journal_t *journal,
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* File a buffer on the given transaction list.
|
||||
/*
|
||||
* File a buffer on the given transaction list.
|
||||
*/
|
||||
void __journal_file_buffer(struct journal_head *jh,
|
||||
transaction_t *transaction, int jlist)
|
||||
@@ -1948,7 +1948,7 @@ void __journal_file_buffer(struct journal_head *jh,
|
||||
* with __jbd_unexpected_dirty_buffer()'s handling of dirty
|
||||
* state. */
|
||||
|
||||
if (jlist == BJ_Metadata || jlist == BJ_Reserved ||
|
||||
if (jlist == BJ_Metadata || jlist == BJ_Reserved ||
|
||||
jlist == BJ_Shadow || jlist == BJ_Forget) {
|
||||
if (test_clear_buffer_dirty(bh) ||
|
||||
test_clear_buffer_jbddirty(bh))
|
||||
@@ -2008,7 +2008,7 @@ void journal_file_buffer(struct journal_head *jh,
|
||||
jbd_unlock_bh_state(jh2bh(jh));
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
* Remove a buffer from its current buffer list in preparation for
|
||||
* dropping it from its current transaction entirely. If the buffer has
|
||||
* already started to be used by a subsequent transaction, refile the
|
||||
@@ -2060,7 +2060,7 @@ void __journal_refile_buffer(struct journal_head *jh)
|
||||
* to the caller to remove the journal_head if necessary. For the
|
||||
* unlocked journal_refile_buffer call, the caller isn't going to be
|
||||
* doing anything else to the buffer so we need to do the cleanup
|
||||
* ourselves to avoid a jh leak.
|
||||
* ourselves to avoid a jh leak.
|
||||
*
|
||||
* *** The journal_head may be freed by this call! ***
|
||||
*/
|
||||
|
Reference in New Issue
Block a user