All of lore.kernel.org
 help / color / mirror / Atom feed
From: Eric Sandeen <sandeen@sandeen.net>
To: Christoph Hellwig <hch@infradead.org>
Cc: Alexander Beregalov <a.beregalov@gmail.com>, xfs@oss.sgi.com
Subject: Re: [PATCH] avoid memory allocations in xfs_fs_vcmn_err
Date: Wed, 17 Dec 2008 12:04:40 -0600	[thread overview]
Message-ID: <49493F38.3070503@sandeen.net> (raw)
In-Reply-To: <20081217172736.GA10797@infradead.org>

Christoph Hellwig wrote:
> xfs_fs_vcmn_err can be called under a spinlock, but does a sleeping memory
> allocation to create buffer for it's internal sprintf.  Fortunately it's
> the only caller of icmn_err, so we can merge the two and have one single
> static buffer and spinlock protecting it.  While we're at it make sure
> we proper __attribute__ format annotations so that the compiler can detect
> mismatched format strings.
> 
> 
> Reported-by: Alexander Beregalov <a.beregalov@gmail.com>
> Signed-off-by: Christoph Hellwig <hch@lst.de>

Reviewed-by: Eric Sandeen <sandeen@sandeen.net>

> Index: xfs/fs/xfs/support/debug.c
> ===================================================================
> --- xfs.orig/fs/xfs/support/debug.c	2008-12-17 14:59:49.000000000 +0100
> +++ xfs/fs/xfs/support/debug.c	2008-12-17 15:10:13.000000000 +0100
> @@ -18,6 +18,13 @@
>  #include <xfs.h>
>  #include "debug.h"
>  
> +/* xfs_mount.h drags a lot of crap in, sorry.. */
> +#include "xfs_sb.h"
> +#include "xfs_inum.h"
> +#include "xfs_ag.h"
> +#include "xfs_dmapi.h"
> +#include "xfs_mount.h"
> +
>  static char		message[1024];	/* keep it off the stack */
>  static DEFINE_SPINLOCK(xfs_err_lock);
>  
> @@ -55,22 +62,42 @@ cmn_err(register int level, char *fmt, .
>  }
>  
>  void
> -icmn_err(register int level, char *fmt, va_list ap)
> +xfs_fs_vcmn_err(
> +	int			level,
> +	struct xfs_mount	*mp,
> +	char			*fmt,
> +	va_list			ap)
>  {
> -	ulong	flags;
> -	int	len;
> +	unsigned long		flags;
> +	int			len = 0;
>  
>  	level &= XFS_ERR_MASK;
> -	if(level > XFS_MAX_ERR_LEVEL)
> +	if (level > XFS_MAX_ERR_LEVEL)
>  		level = XFS_MAX_ERR_LEVEL;
> +
>  	spin_lock_irqsave(&xfs_err_lock,flags);
> -	len = vsnprintf(message, sizeof(message), fmt, ap);
> +
> +	if (mp) {
> +		len = sprintf(message, "Filesystem \"%s\": ", mp->m_fsname);
> +
> +		/*
> +		 * Skip the printk if we can't print anything useful
> +		 * due to an over-long device name.
> +		 */
> +		if (len >= sizeof(message))
> +			goto out;
> +	}
> +
> +	len = vsnprintf(message + len, sizeof(message) - len, fmt, ap);
>  	if (len >= sizeof(message))
>  		len = sizeof(message) - 1;
>  	if (message[len-1] == '\n')
>  		message[len-1] = 0;
> +
>  	printk("%s%s\n", err_level[level], message);
> + out:
>  	spin_unlock_irqrestore(&xfs_err_lock,flags);
> +
>  	BUG_ON(level == CE_PANIC);
>  }
>  
> Index: xfs/fs/xfs/support/debug.h
> ===================================================================
> --- xfs.orig/fs/xfs/support/debug.h	2008-12-17 15:05:34.000000000 +0100
> +++ xfs/fs/xfs/support/debug.h	2008-12-17 15:07:03.000000000 +0100
> @@ -27,8 +27,6 @@
>  #define CE_ALERT        1               /* alert        */
>  #define CE_PANIC        0               /* panic        */
>  
> -extern void icmn_err(int, char *, va_list)
> -	__attribute__ ((format (printf, 2, 0)));
>  extern void cmn_err(int, char *, ...)
>  	__attribute__ ((format (printf, 2, 3)));
>  extern void assfail(char *expr, char *f, int l);
> Index: xfs/fs/xfs/xfs_error.c
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_error.c	2008-12-17 14:58:02.000000000 +0100
> +++ xfs/fs/xfs/xfs_error.c	2008-12-17 15:12:03.000000000 +0100
> @@ -153,21 +153,6 @@ xfs_errortag_clearall(xfs_mount_t *mp, i
>  }
>  #endif /* DEBUG */
>  
> -static void
> -xfs_fs_vcmn_err(int level, xfs_mount_t *mp, char *fmt, va_list ap)
> -{
> -	if (mp != NULL) {
> -		char	*newfmt;
> -		int	len = 16 + mp->m_fsname_len + strlen(fmt);
> -
> -		newfmt = kmem_alloc(len, KM_SLEEP);
> -		sprintf(newfmt, "Filesystem \"%s\": %s", mp->m_fsname, fmt);
> -		icmn_err(level, newfmt, ap);
> -		kmem_free(newfmt);
> -	} else {
> -		icmn_err(level, fmt, ap);
> -	}
> -}
>  
>  void
>  xfs_fs_cmn_err(int level, xfs_mount_t *mp, char *fmt, ...)
> Index: xfs/fs/xfs/xfs_error.h
> ===================================================================
> --- xfs.orig/fs/xfs/xfs_error.h	2008-12-17 15:05:46.000000000 +0100
> +++ xfs/fs/xfs/xfs_error.h	2008-12-17 15:12:01.000000000 +0100
> @@ -159,11 +159,15 @@ extern int xfs_errortag_clearall(xfs_mou
>  #define		XFS_PTAG_FSBLOCK_ZERO		0x00000080
>  
>  struct xfs_mount;
> -/* PRINTFLIKE4 */
> +
> +extern void xfs_fs_vcmn_err(int level, struct xfs_mount *mp,
> +		char *fmt, va_list ap)
> +	__attribute__ ((format (printf, 3, 0)));
>  extern void xfs_cmn_err(int panic_tag, int level, struct xfs_mount *mp,
> -			char *fmt, ...);
> -/* PRINTFLIKE3 */
> -extern void xfs_fs_cmn_err(int level, struct xfs_mount *mp, char *fmt, ...);
> +			char *fmt, ...)
> +	__attribute__ ((format (printf, 4, 5)));
> +extern void xfs_fs_cmn_err(int level, struct xfs_mount *mp, char *fmt, ...)
> +	__attribute__ ((format (printf, 3, 4)));
>  
>  extern void xfs_hex_dump(void *p, int length);
>  
> 
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs
> 

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

      parent reply	other threads:[~2008-12-17 18:04 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-12-17 17:27 [PATCH] avoid memory allocations in xfs_fs_vcmn_err Christoph Hellwig
2008-12-17 17:46 ` Eric Sandeen
2008-12-17 17:57   ` Christoph Hellwig
2008-12-17 18:04 ` Eric Sandeen [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=49493F38.3070503@sandeen.net \
    --to=sandeen@sandeen.net \
    --cc=a.beregalov@gmail.com \
    --cc=hch@infradead.org \
    --cc=xfs@oss.sgi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.