mirror of
https://github.com/bobranten/Ext4Fsd.git
synced 2025-10-30 05:18:31 -05:00
more work on jbd2
This commit is contained in:
@@ -1259,7 +1259,7 @@ journal_t *jbd2_journal_init_inode(struct inode *inode)
|
||||
char *p;
|
||||
unsigned long long blocknr;
|
||||
|
||||
DbgPrint("jbd2_journal_init_inode begin\n");
|
||||
DbgPrint("jbd2_journal_init_inode: begin\n");
|
||||
blocknr = bmap(inode, 0);
|
||||
if (!blocknr) {
|
||||
/*pr_err("%s: Cannot locate journal superblock\n",
|
||||
@@ -1282,16 +1282,11 @@ journal_t *jbd2_journal_init_inode(struct inode *inode)
|
||||
p = strreplace(journal->j_devname, '/', '!');
|
||||
sprintf(p, "-%lu", journal->j_inode->i_ino);*/
|
||||
jbd2_stats_proc_init(journal);
|
||||
DbgPrint("jbd2_journal_init_inode end\n");
|
||||
DbgPrint("jbd2_journal_init_inode: end\n");
|
||||
|
||||
return journal;
|
||||
}
|
||||
|
||||
journal_t *journal_init_inode(struct inode *inode)
|
||||
{
|
||||
return jbd2_journal_init_inode(inode);
|
||||
}
|
||||
|
||||
/*
|
||||
* If the journal init or create aborts, we need to mark the journal
|
||||
* superblock as being NULL to prevent the journal destroy from writing
|
||||
@@ -1453,7 +1448,7 @@ int jbd2_journal_update_sb_log_tail(journal_t *journal, tid_t tail_tid,
|
||||
out:
|
||||
return ret;
|
||||
}
|
||||
#if 0
|
||||
|
||||
/**
|
||||
* jbd2_mark_journal_empty() - Mark on disk journal as empty.
|
||||
* @journal: The journal to update.
|
||||
@@ -1466,11 +1461,13 @@ static void jbd2_mark_journal_empty(journal_t *journal, int write_op)
|
||||
{
|
||||
journal_superblock_t *sb = journal->j_superblock;
|
||||
|
||||
BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex));
|
||||
read_lock(&journal->j_state_lock);
|
||||
DbgPrint("jbd2_mark_journal_empty: begin\n");
|
||||
|
||||
//BUG_ON(!mutex_is_locked(&journal->j_checkpoint_mutex));
|
||||
//read_lock(&journal->j_state_lock);
|
||||
/* Is it already empty? */
|
||||
if (sb->s_start == 0) {
|
||||
read_unlock(&journal->j_state_lock);
|
||||
//read_unlock(&journal->j_state_lock);
|
||||
return;
|
||||
}
|
||||
jbd_debug(1, "JBD2: Marking journal as empty (seq %d)\n",
|
||||
@@ -1478,16 +1475,16 @@ static void jbd2_mark_journal_empty(journal_t *journal, int write_op)
|
||||
|
||||
sb->s_sequence = cpu_to_be32(journal->j_tail_sequence);
|
||||
sb->s_start = cpu_to_be32(0);
|
||||
read_unlock(&journal->j_state_lock);
|
||||
//read_unlock(&journal->j_state_lock);
|
||||
|
||||
jbd2_write_superblock(journal, write_op);
|
||||
|
||||
/* Log is no longer empty */
|
||||
write_lock(&journal->j_state_lock);
|
||||
//write_lock(&journal->j_state_lock);
|
||||
journal->j_flags |= JBD2_FLUSHED;
|
||||
write_unlock(&journal->j_state_lock);
|
||||
//write_unlock(&journal->j_state_lock);
|
||||
DbgPrint("jbd2_mark_journal_empty: end\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* jbd2_journal_update_sb_errno() - Update error in the journal.
|
||||
@@ -1668,7 +1665,7 @@ int jbd2_journal_load(journal_t *journal)
|
||||
int err;
|
||||
journal_superblock_t *sb;
|
||||
|
||||
DbgPrint("jbd2_journal_load begin\n");
|
||||
DbgPrint("jbd2_journal_load: begin\n");
|
||||
err = load_superblock(journal);
|
||||
if (err)
|
||||
return err;
|
||||
@@ -1715,7 +1712,7 @@ int jbd2_journal_load(journal_t *journal)
|
||||
|
||||
journal->j_flags &= ~JBD2_ABORT;
|
||||
journal->j_flags |= JBD2_LOADED;
|
||||
DbgPrint("jbd2_journal_load end\n");
|
||||
DbgPrint("jbd2_journal_load: end\n");
|
||||
return 0;
|
||||
|
||||
recovery_error:
|
||||
@@ -1723,11 +1720,6 @@ recovery_error:
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
int journal_load(journal_t *journal)
|
||||
{
|
||||
return jbd2_journal_load(journal);
|
||||
}
|
||||
|
||||
/**
|
||||
* void jbd2_journal_destroy() - Release a journal_t structure.
|
||||
* @journal: Journal to act on.
|
||||
@@ -1739,7 +1731,7 @@ int journal_load(journal_t *journal)
|
||||
int jbd2_journal_destroy(journal_t *journal)
|
||||
{
|
||||
int err = 0;
|
||||
DbgPrint("jbd2_journal_destroy begin\n");
|
||||
DbgPrint("jbd2_journal_destroy: begin\n");
|
||||
#if 0
|
||||
/* Wait for the commit thread to wake up and die. */
|
||||
journal_kill_thread(journal);
|
||||
@@ -1803,16 +1795,11 @@ int jbd2_journal_destroy(journal_t *journal)
|
||||
crypto_free_shash(journal->j_chksum_driver);*/
|
||||
kfree(journal->j_wbuf);
|
||||
kfree(journal);
|
||||
DbgPrint("jbd2_journal_destroy end\n");
|
||||
DbgPrint("jbd2_journal_destroy: end\n");
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
int journal_destroy(journal_t *journal)
|
||||
{
|
||||
return jbd2_journal_destroy(journal);
|
||||
}
|
||||
|
||||
#if 0
|
||||
/**
|
||||
*int jbd2_journal_check_used_features () - Check if features specified are used.
|
||||
@@ -2064,7 +2051,7 @@ int jbd2_journal_flush(journal_t *journal)
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
#endif
|
||||
/**
|
||||
* int jbd2_journal_wipe() - Wipe journal contents
|
||||
* @journal: Journal to act on.
|
||||
@@ -2082,14 +2069,18 @@ int jbd2_journal_wipe(journal_t *journal, int write)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
DbgPrint("jbd2_journal_wipe: begin\n");
|
||||
|
||||
J_ASSERT (!(journal->j_flags & JBD2_LOADED));
|
||||
|
||||
err = load_superblock(journal);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (!journal->j_tail)
|
||||
if (!journal->j_tail) {
|
||||
DbgPrint("jbd2_journal_wipe: journal is clean\n");
|
||||
goto no_recovery;
|
||||
}
|
||||
|
||||
printk(KERN_WARNING "JBD2: %s recovery information on journal\n",
|
||||
write ? "Clearing" : "Ignoring");
|
||||
@@ -2098,14 +2089,15 @@ int jbd2_journal_wipe(journal_t *journal, int write)
|
||||
if (write) {
|
||||
/* Lock to make assertions happy... */
|
||||
mutex_lock(&journal->j_checkpoint_mutex);
|
||||
jbd2_mark_journal_empty(journal, REQ_SYNC | REQ_FUA);
|
||||
jbd2_mark_journal_empty(journal, 0/*REQ_SYNC | REQ_FUA*/);
|
||||
mutex_unlock(&journal->j_checkpoint_mutex);
|
||||
}
|
||||
|
||||
no_recovery:
|
||||
DbgPrint("jbd2_journal_wipe end:\n");
|
||||
return err;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Journal abort has very specific semantics, which we describe
|
||||
* for journal abort.
|
||||
@@ -2651,11 +2643,6 @@ restart:
|
||||
}
|
||||
#endif
|
||||
|
||||
int journal_wipe_recovery(journal_t *journal)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
|
||||
#define JBD2_STATS_PROC_NAME "fs/jbd2"
|
||||
@@ -2735,7 +2722,7 @@ static int __init journal_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
DbgPrint("journal_init begin\n");
|
||||
DbgPrint("journal_init: begin\n");
|
||||
|
||||
/*BUILD_BUG_ON(sizeof(struct journal_superblock_s) != 1024);*/
|
||||
|
||||
@@ -2745,7 +2732,7 @@ static int __init journal_init(void)
|
||||
} else {
|
||||
jbd2_journal_destroy_caches();
|
||||
}
|
||||
DbgPrint("journal_init end\n");
|
||||
DbgPrint("journal_init: end\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -2756,10 +2743,10 @@ static void __exit journal_exit(void)
|
||||
if (n)
|
||||
printk(KERN_ERR "JBD2: leaked %d journal_heads!\n", n);
|
||||
#endif
|
||||
DbgPrint("journal_exit begin\n");
|
||||
DbgPrint("journal_exit: begin\n");
|
||||
jbd2_remove_jbd_stats_proc_entry();
|
||||
jbd2_journal_destroy_caches();
|
||||
DbgPrint("journal_exit end\n");
|
||||
DbgPrint("journal_exit: end\n");
|
||||
}
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -291,7 +291,7 @@ int jbd2_journal_recover(journal_t *journal)
|
||||
}*/
|
||||
return err;
|
||||
}
|
||||
#if 0
|
||||
|
||||
/**
|
||||
* jbd2_journal_skip_recovery - Start journal and wipe exiting records
|
||||
* @journal: journal to startup
|
||||
@@ -311,6 +311,8 @@ int jbd2_journal_skip_recovery(journal_t *journal)
|
||||
|
||||
struct recovery_info info;
|
||||
|
||||
DbgPrint("jbd2_journal_skip_recovery: begin\n");
|
||||
|
||||
memset (&info, 0, sizeof(info));
|
||||
|
||||
err = do_one_pass(journal, &info, PASS_SCAN);
|
||||
@@ -330,9 +332,10 @@ int jbd2_journal_skip_recovery(journal_t *journal)
|
||||
}
|
||||
|
||||
journal->j_tail = 0;
|
||||
DbgPrint("jbd2_journal_skip_recovery: end\n");
|
||||
return err;
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline unsigned long long read_tag_block(journal_t *journal,
|
||||
journal_block_tag_t *tag)
|
||||
{
|
||||
@@ -341,7 +344,36 @@ static inline unsigned long long read_tag_block(journal_t *journal,
|
||||
block |= (u64)be32_to_cpu(tag->t_blocknr_high) << 32;
|
||||
return block;
|
||||
}
|
||||
#define crc32_be crc32c
|
||||
|
||||
/*
|
||||
* The standard CRC-32 polynomial, first popularized by Ethernet.
|
||||
* x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x^1+x^0
|
||||
*/
|
||||
#define CRC32_POLY_LE 0xedb88320
|
||||
#define CRC32_POLY_BE 0x04c11db7
|
||||
|
||||
u32 crc32_le(u32 crc, unsigned char const *p, size_t len)
|
||||
{
|
||||
int i;
|
||||
while (len--) {
|
||||
crc ^= *p++;
|
||||
for (i = 0; i < 8; i++)
|
||||
crc = (crc >> 1) ^ ((crc & 1) ? CRC32_POLY_LE : 0);
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
u32 crc32_be(u32 crc, unsigned char const *p, size_t len)
|
||||
{
|
||||
int i;
|
||||
while (len--) {
|
||||
crc ^= *p++ << 24;
|
||||
for (i = 0; i < 8; i++)
|
||||
crc = (crc << 1) ^ ((crc & 0x80000000) ? CRC32_POLY_BE : 0);
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
/*
|
||||
* calc_chksums calculates the checksums for the blocks described in the
|
||||
* descriptor block.
|
||||
|
||||
Reference in New Issue
Block a user