Commit 05496769 authored by Theodore Ts'o's avatar Theodore Ts'o

jbd2: clean up how the journal device name is printed

Calculate the journal device name once and stash it away in the
journal_s structure.  This avoids needing to call bdevname()
everywhere and reduces stack usage by not needing to allocate an
on-stack buffer.  In addition, we eliminate the '/' that can appear in
device names (e.g. "cciss/c0d0p9" --- see kernel bugzilla #11321) that
can cause problems when creating proc directory names, and include the
inode number to support ocfs2 which creates multiple journals with
different inode numbers.
Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
parent 899fc1a4
...@@ -1476,15 +1476,9 @@ static int ext4_setup_super(struct super_block *sb, struct ext4_super_block *es, ...@@ -1476,15 +1476,9 @@ static int ext4_setup_super(struct super_block *sb, struct ext4_super_block *es,
EXT4_INODES_PER_GROUP(sb), EXT4_INODES_PER_GROUP(sb),
sbi->s_mount_opt); sbi->s_mount_opt);
if (EXT4_SB(sb)->s_journal->j_inode == NULL) { printk(KERN_INFO "EXT4 FS on %s, %s journal on %s\n",
char b[BDEVNAME_SIZE]; sb->s_id, EXT4_SB(sb)->s_journal->j_inode ? "internal" :
"external", EXT4_SB(sb)->s_journal->j_devname);
printk(KERN_INFO "EXT4 FS on %s, external journal on %s\n",
sb->s_id, bdevname(EXT4_SB(sb)->s_journal->j_dev, b));
} else {
printk(KERN_INFO "EXT4 FS on %s, internal journal\n",
sb->s_id);
}
return res; return res;
} }
......
...@@ -147,12 +147,9 @@ static int journal_submit_commit_record(journal_t *journal, ...@@ -147,12 +147,9 @@ static int journal_submit_commit_record(journal_t *journal,
* to remember if we sent a barrier request * to remember if we sent a barrier request
*/ */
if (ret == -EOPNOTSUPP && barrier_done) { if (ret == -EOPNOTSUPP && barrier_done) {
char b[BDEVNAME_SIZE];
printk(KERN_WARNING printk(KERN_WARNING
"JBD: barrier-based sync failed on %s - " "JBD: barrier-based sync failed on %s - "
"disabling barriers\n", "disabling barriers\n", journal->j_devname);
bdevname(journal->j_dev, b));
spin_lock(&journal->j_state_lock); spin_lock(&journal->j_state_lock);
journal->j_flags &= ~JBD2_BARRIER; journal->j_flags &= ~JBD2_BARRIER;
spin_unlock(&journal->j_state_lock); spin_unlock(&journal->j_state_lock);
...@@ -681,11 +678,9 @@ start_journal_io: ...@@ -681,11 +678,9 @@ start_journal_io:
*/ */
err = journal_finish_inode_data_buffers(journal, commit_transaction); err = journal_finish_inode_data_buffers(journal, commit_transaction);
if (err) { if (err) {
char b[BDEVNAME_SIZE];
printk(KERN_WARNING printk(KERN_WARNING
"JBD2: Detected IO errors while flushing file data " "JBD2: Detected IO errors while flushing file data "
"on %s\n", bdevname(journal->j_fs_dev, b)); "on %s\n", journal->j_devname);
err = 0; err = 0;
} }
......
...@@ -597,13 +597,9 @@ int jbd2_journal_bmap(journal_t *journal, unsigned long blocknr, ...@@ -597,13 +597,9 @@ int jbd2_journal_bmap(journal_t *journal, unsigned long blocknr,
if (ret) if (ret)
*retp = ret; *retp = ret;
else { else {
char b[BDEVNAME_SIZE];
printk(KERN_ALERT "%s: journal block not found " printk(KERN_ALERT "%s: journal block not found "
"at offset %lu on %s\n", "at offset %lu on %s\n",
__func__, __func__, blocknr, journal->j_devname);
blocknr,
bdevname(journal->j_dev, b));
err = -EIO; err = -EIO;
__journal_abort_soft(journal, err); __journal_abort_soft(journal, err);
} }
...@@ -901,10 +897,7 @@ static struct proc_dir_entry *proc_jbd2_stats; ...@@ -901,10 +897,7 @@ static struct proc_dir_entry *proc_jbd2_stats;
static void jbd2_stats_proc_init(journal_t *journal) static void jbd2_stats_proc_init(journal_t *journal)
{ {
char name[BDEVNAME_SIZE]; journal->j_proc_entry = proc_mkdir(journal->j_devname, proc_jbd2_stats);
bdevname(journal->j_dev, name);
journal->j_proc_entry = proc_mkdir(name, proc_jbd2_stats);
if (journal->j_proc_entry) { if (journal->j_proc_entry) {
proc_create_data("history", S_IRUGO, journal->j_proc_entry, proc_create_data("history", S_IRUGO, journal->j_proc_entry,
&jbd2_seq_history_fops, journal); &jbd2_seq_history_fops, journal);
...@@ -915,12 +908,9 @@ static void jbd2_stats_proc_init(journal_t *journal) ...@@ -915,12 +908,9 @@ static void jbd2_stats_proc_init(journal_t *journal)
static void jbd2_stats_proc_exit(journal_t *journal) static void jbd2_stats_proc_exit(journal_t *journal)
{ {
char name[BDEVNAME_SIZE];
bdevname(journal->j_dev, name);
remove_proc_entry("info", journal->j_proc_entry); remove_proc_entry("info", journal->j_proc_entry);
remove_proc_entry("history", journal->j_proc_entry); remove_proc_entry("history", journal->j_proc_entry);
remove_proc_entry(name, proc_jbd2_stats); remove_proc_entry(journal->j_devname, proc_jbd2_stats);
} }
static void journal_init_stats(journal_t *journal) static void journal_init_stats(journal_t *journal)
...@@ -1018,6 +1008,7 @@ journal_t * jbd2_journal_init_dev(struct block_device *bdev, ...@@ -1018,6 +1008,7 @@ journal_t * jbd2_journal_init_dev(struct block_device *bdev,
{ {
journal_t *journal = journal_init_common(); journal_t *journal = journal_init_common();
struct buffer_head *bh; struct buffer_head *bh;
char *p;
int n; int n;
if (!journal) if (!journal)
...@@ -1039,6 +1030,10 @@ journal_t * jbd2_journal_init_dev(struct block_device *bdev, ...@@ -1039,6 +1030,10 @@ journal_t * jbd2_journal_init_dev(struct block_device *bdev,
journal->j_fs_dev = fs_dev; journal->j_fs_dev = fs_dev;
journal->j_blk_offset = start; journal->j_blk_offset = start;
journal->j_maxlen = len; journal->j_maxlen = len;
bdevname(journal->j_dev, journal->j_devname);
p = journal->j_devname;
while ((p = strchr(p, '/')))
*p = '!';
jbd2_stats_proc_init(journal); jbd2_stats_proc_init(journal);
bh = __getblk(journal->j_dev, start, journal->j_blocksize); bh = __getblk(journal->j_dev, start, journal->j_blocksize);
...@@ -1061,6 +1056,7 @@ journal_t * jbd2_journal_init_inode (struct inode *inode) ...@@ -1061,6 +1056,7 @@ journal_t * jbd2_journal_init_inode (struct inode *inode)
{ {
struct buffer_head *bh; struct buffer_head *bh;
journal_t *journal = journal_init_common(); journal_t *journal = journal_init_common();
char *p;
int err; int err;
int n; int n;
unsigned long long blocknr; unsigned long long blocknr;
...@@ -1070,6 +1066,12 @@ journal_t * jbd2_journal_init_inode (struct inode *inode) ...@@ -1070,6 +1066,12 @@ journal_t * jbd2_journal_init_inode (struct inode *inode)
journal->j_dev = journal->j_fs_dev = inode->i_sb->s_bdev; journal->j_dev = journal->j_fs_dev = inode->i_sb->s_bdev;
journal->j_inode = inode; journal->j_inode = inode;
bdevname(journal->j_dev, journal->j_devname);
p = journal->j_devname;
while ((p = strchr(p, '/')))
*p = '!';
p = journal->j_devname + strlen(journal->j_devname);
sprintf(p, ":%lu", journal->j_inode->i_ino);
jbd_debug(1, jbd_debug(1,
"journal %p: inode %s/%ld, size %Ld, bits %d, blksize %ld\n", "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,
...@@ -1760,23 +1762,6 @@ int jbd2_journal_wipe(journal_t *journal, int write) ...@@ -1760,23 +1762,6 @@ int jbd2_journal_wipe(journal_t *journal, int write)
return err; return err;
} }
/*
* journal_dev_name: format a character string to describe on what
* device this journal is present.
*/
static const char *journal_dev_name(journal_t *journal, char *buffer)
{
struct block_device *bdev;
if (journal->j_inode)
bdev = journal->j_inode->i_sb->s_bdev;
else
bdev = journal->j_dev;
return bdevname(bdev, buffer);
}
/* /*
* Journal abort has very specific semantics, which we describe * Journal abort has very specific semantics, which we describe
* for journal abort. * for journal abort.
...@@ -1793,13 +1778,12 @@ static const char *journal_dev_name(journal_t *journal, char *buffer) ...@@ -1793,13 +1778,12 @@ static const char *journal_dev_name(journal_t *journal, char *buffer)
void __jbd2_journal_abort_hard(journal_t *journal) void __jbd2_journal_abort_hard(journal_t *journal)
{ {
transaction_t *transaction; transaction_t *transaction;
char b[BDEVNAME_SIZE];
if (journal->j_flags & JBD2_ABORT) if (journal->j_flags & JBD2_ABORT)
return; return;
printk(KERN_ERR "Aborting journal on device %s.\n", printk(KERN_ERR "Aborting journal on device %s.\n",
journal_dev_name(journal, b)); journal->j_devname);
spin_lock(&journal->j_state_lock); spin_lock(&journal->j_state_lock);
journal->j_flags |= JBD2_ABORT; journal->j_flags |= JBD2_ABORT;
......
...@@ -851,6 +851,7 @@ struct journal_s ...@@ -851,6 +851,7 @@ struct journal_s
struct block_device *j_dev; struct block_device *j_dev;
int j_blocksize; int j_blocksize;
unsigned long long j_blk_offset; unsigned long long j_blk_offset;
char j_devname[BDEVNAME_SIZE+24];
/* /*
* Device which holds the client fs. For internal journal this will be * Device which holds the client fs. For internal journal this will be
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment