Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+3 −9
Original line number Original line Diff line number Diff line
@@ -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;
}
}


+3 −8
Original line number Original line Diff line number Diff line
@@ -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:
	 */
	 */
	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;
	}
	}


+16 −32
Original line number Original line Diff line number Diff line
@@ -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;


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)


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,
{
{
	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,
	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)
{
{
	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)


	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)
	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)
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;
+2 −1
Original line number Original line Diff line number Diff line
@@ -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