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: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
Родитель
899fc1a4cf
Коммит
05496769e5
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
@ -681,11 +678,9 @@ start_journal_io:
|
|||
*/
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче