Skip to content

Commit

Permalink
jbd2: clean up how the journal device name is printed
Browse files Browse the repository at this point in the history
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: "Theodore Ts'o" <tytso@mit.edu>
  • Loading branch information
Theodore Ts'o committed Sep 16, 2008
1 parent 899fc1a commit 0549676
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 50 deletions.
12 changes: 3 additions & 9 deletions fs/ext4/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -1476,15 +1476,9 @@ static int ext4_setup_super(struct super_block *sb, struct ext4_super_block *es,
EXT4_INODES_PER_GROUP(sb),
sbi->s_mount_opt);

if (EXT4_SB(sb)->s_journal->j_inode == NULL) {
char b[BDEVNAME_SIZE];

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);
}
printk(KERN_INFO "EXT4 FS on %s, %s journal on %s\n",
sb->s_id, EXT4_SB(sb)->s_journal->j_inode ? "internal" :
"external", EXT4_SB(sb)->s_journal->j_devname);
return res;
}

Expand Down
11 changes: 3 additions & 8 deletions fs/jbd2/commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -147,12 +147,9 @@ static int journal_submit_commit_record(journal_t *journal,
* to remember if we sent a barrier request
*/
if (ret == -EOPNOTSUPP && barrier_done) {
char b[BDEVNAME_SIZE];

printk(KERN_WARNING
"JBD: barrier-based sync failed on %s - "
"disabling barriers\n",
bdevname(journal->j_dev, b));
"JBD: barrier-based sync failed on %s - "
"disabling barriers\n", journal->j_devname);
spin_lock(&journal->j_state_lock);
journal->j_flags &= ~JBD2_BARRIER;
spin_unlock(&journal->j_state_lock);
Expand Down Expand Up @@ -681,11 +678,9 @@ void jbd2_journal_commit_transaction(journal_t *journal)
*/
err = journal_finish_inode_data_buffers(journal, commit_transaction);
if (err) {
char b[BDEVNAME_SIZE];

printk(KERN_WARNING
"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;
}

Expand Down
48 changes: 16 additions & 32 deletions fs/jbd2/journal.c
Original file line number Diff line number Diff line change
Expand Up @@ -597,13 +597,9 @@ int jbd2_journal_bmap(journal_t *journal, unsigned long blocknr,
if (ret)
*retp = ret;
else {
char b[BDEVNAME_SIZE];

printk(KERN_ALERT "%s: journal block not found "
"at offset %lu on %s\n",
__func__,
blocknr,
bdevname(journal->j_dev, b));
__func__, blocknr, journal->j_devname);
err = -EIO;
__journal_abort_soft(journal, err);
}
Expand Down Expand Up @@ -901,10 +897,7 @@ static struct proc_dir_entry *proc_jbd2_stats;

static void jbd2_stats_proc_init(journal_t *journal)
{
char name[BDEVNAME_SIZE];

bdevname(journal->j_dev, name);
journal->j_proc_entry = proc_mkdir(name, proc_jbd2_stats);
journal->j_proc_entry = proc_mkdir(journal->j_devname, proc_jbd2_stats);
if (journal->j_proc_entry) {
proc_create_data("history", S_IRUGO, journal->j_proc_entry,
&jbd2_seq_history_fops, journal);
Expand All @@ -915,12 +908,9 @@ static void jbd2_stats_proc_init(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("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)
Expand Down Expand Up @@ -1018,6 +1008,7 @@ journal_t * jbd2_journal_init_dev(struct block_device *bdev,
{
journal_t *journal = journal_init_common();
struct buffer_head *bh;
char *p;
int n;

if (!journal)
Expand All @@ -1039,6 +1030,10 @@ journal_t * jbd2_journal_init_dev(struct block_device *bdev,
journal->j_fs_dev = fs_dev;
journal->j_blk_offset = start;
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);

bh = __getblk(journal->j_dev, start, journal->j_blocksize);
Expand All @@ -1061,6 +1056,7 @@ journal_t * jbd2_journal_init_inode (struct inode *inode)
{
struct buffer_head *bh;
journal_t *journal = journal_init_common();
char *p;
int err;
int n;
unsigned long long blocknr;
Expand All @@ -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_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,
"journal %p: inode %s/%ld, size %Ld, bits %d, blksize %ld\n",
journal, inode->i_sb->s_id, inode->i_ino,
Expand Down Expand Up @@ -1760,23 +1762,6 @@ int jbd2_journal_wipe(journal_t *journal, int write)
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
* for journal abort.
Expand All @@ -1793,13 +1778,12 @@ static const char *journal_dev_name(journal_t *journal, char *buffer)
void __jbd2_journal_abort_hard(journal_t *journal)
{
transaction_t *transaction;
char b[BDEVNAME_SIZE];

if (journal->j_flags & JBD2_ABORT)
return;

printk(KERN_ERR "Aborting journal on device %s.\n",
journal_dev_name(journal, b));
journal->j_devname);

spin_lock(&journal->j_state_lock);
journal->j_flags |= JBD2_ABORT;
Expand Down
3 changes: 2 additions & 1 deletion include/linux/jbd2.h
Original file line number Diff line number Diff line change
Expand Up @@ -850,7 +850,8 @@ struct journal_s
*/
struct block_device *j_dev;
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
Expand Down

0 comments on commit 0549676

Please sign in to comment.