2.6.27.51-stable review
Subsystems (10)
cover 2.6.27.51-stable review
This is the start of the stable review cycle for the 2.6.27.51 release. There are 11 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let us know. If anyone is a maintainer of the proper subsystem, and wants to add a Signed-off-by: line to the patch, please respond with it.
Responses should be made by Friday, August 13, 2010, 20:00:00 UTC. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v2.6/stable-review/patch-2.6.27.51-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
Makefile | 2 +- arch/x86/xen/enlighten.c | 2 +- arch/x86/xen/time.c | 43 +---------------------- arch/x86/xen/xen-ops.h | 3 +- drivers/char/nvram.c | 14 +++++-- drivers/md/raid10.c | 18 +++++++++ drivers/pci/quirks.c | 1 + fs/ecryptfs/file.c | 60 +++++++++++++++++++------------ fs/jfs/xattr.c | 87 ++++++++++++++++++++-------------------------- fs/signalfd.c | 2 + fs/splice.c | 12 +------ mm/backing-dev.c | 3 ++ 12 files changed, 115 insertions(+), 132 deletions(-)
PATCH 1/11 nvram: Fix write beyond end condition; prove to gcc copy is safe
2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: H. Peter Anvin <[email protected]>
commit a01c7800420d2c294ca403988488a635d4087a6d upstream.
In nvram_write, first of all, correctly handle the case where the file pointer is already beyond the end; we should return EOF in that case.
Second, make the logic a bit more explicit so that gcc can statically prove that the copy_from_user() is safe. Once the condition of the beyond-end filepointer is eliminated, the copy is safe but gcc can't prove it, causing build failures for i386 allyesconfig.
Third, eliminate the entirely superfluous variable "len", and just use the passed-in variable "count" instead.
LKML-Reference: <tip-*@git.kernel.org>
--- drivers/char/nvram.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-)
drivers/char/nvram.c +10 -4
@@ -265,10 +265,16 @@ nvram_write(struct file *file, const chaunsigned char contents[NVRAM_BYTES ];unsigned i = *ppos;unsigned char *tmp; -int len; - len = (NVRAM_BYTES - i) < count ? (NVRAM_BYTES - i) : count; -if (copy_from_user (contents, buf, len)) +if (i >=NVRAM_BYTES ) +return 0 ;/* Past EOF */ + +if (count >NVRAM_BYTES - i) + count =NVRAM_BYTES - i; +if (count >NVRAM_BYTES ) +return -EFAULT ;/* Can't happen, but prove it to gcc */ + +if (copy_from_user (contents, buf, count))return -EFAULT ;spin_lock_irq (&rtc_lock);
@@ -276,7 +282,7 @@ nvram_write(struct file *file, const chaif (!__nvram_check_checksum ()) goto checksum_err; -for (tmp = contents; count-- >0 && i <NVRAM_BYTES ; ++i, ++tmp) +for (tmp = contents; count--; ++i, ++tmp)__nvram_write_byte (*tmp, i);__nvram_set_checksum ();
PATCH 2/11 splice: fix misuse of SPLICE_F_NONBLOCK
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Miklos Szeredi <[email protected]>
commit 6965031d331a642e31278fa1b5bd47f372ffdd5d upstream.
SPLICE_F_NONBLOCK is clearly documented to only affect blocking on the pipe. In __generic_file_splice_read(), however, it causes an EAGAIN if the page is currently being read.
This makes it impossible to write an application that only wants failure if the pipe is full. For example if the same process is handling both ends of a pipe and isn't otherwise able to determine whether a splice to the pipe will fill it or not.
We could make the read non-blocking on O_NONBLOCK or some other splice flag, but for now this is the simplest fix.
fs/splice.c +1 -11
@@ -399,17 +399,7 @@ __generic_file_splice_read(struct file *in, loff_t *ppos,* If the page isn't uptodate, we may need to start io on it */ if (!PageUptodate (page)) { -/* -* If in nonblock mode then dont block on waiting -* for an in-flight io page -*/ -if (flags &SPLICE_F_NONBLOCK ) { -if (!trylock_page (page)) { - error = -EAGAIN ; -break ; - } - }else -lock_page (page); +lock_page (page);/* * Page was truncated, or invalidated by the
PATCH 3/11 PCI: disable MSI on VIA K8M800
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Tejun Heo <[email protected]>
commit 549e15611b4ac1de51ef0e0a79c2704f50a638a2 upstream.
MSI delivery from on-board ahci controller doesn't work on K8M800. At this point, it's unclear whether the culprit is with the ahci controller or the host bridge. Given the track record and considering the rather minimal impact of MSI, disabling it seems reasonable.
drivers/pci/quirks.c +1 -0
@@ -2115,6 +2115,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS480, quirk_disablDECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_VIA ,PCI_DEVICE_ID_VIA_VT3336 , quirk_disable_all_msi);DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_VIA ,PCI_DEVICE_ID_VIA_VT3351 , quirk_disable_all_msi);DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_VIA ,PCI_DEVICE_ID_VIA_VT3364 , quirk_disable_all_msi); +DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_VIA ,PCI_DEVICE_ID_VIA_8380_0 , quirk_disable_all_msi);/* Disable MSI on chipsets that are known to not support it */ static void __devinit quirk_disable_msi (struct pci_dev *dev)
PATCH 4/11 md/raid10: fix deadlock with unaligned read during resync
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: NeilBrown <[email protected]>
commit 51e9ac77035a3dfcb6fc0a88a0d80b6f99b5edb1 upstream.
If the 'bio_split' path in raid10-read is used while resync/recovery is happening it is possible to deadlock. Fix this be elevating ->nr_waiting for the duration of both parts of the split request.
This fixes a bug that has been present since 2.6.22 but has only started manifesting recently for unknown reasons. It is suitable for and -stable since then.
--- drivers/md/raid10.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
drivers/md/raid10.c +18 -0
@@ -818,11 +818,29 @@ static int make_request(struct request_q*/ bp =bio_split (bio, bio_split_pool, chunk_sects - (bio->bi_sector & (chunk_sects -1 )) ); + +/* Each of these 'make_request' calls will call 'wait_barrier'. +* If the first succeeds but the second blocks due to the resync +* thread raising the barrier, we will deadlock because the +* IO to the underlying device will be queued in generic_make_request +* and will never complete, so will never reduce nr_pending. +* So increment nr_waiting here so no new raise_barriers will +* succeed, and so the second wait_barrier cannot block. +*/ +spin_lock_irq (&conf->resync_lock); + conf->nr_waiting++; +spin_unlock_irq (&conf->resync_lock); +if (make_request (q, &bp->bio1))generic_make_request (&bp->bio1);if (make_request (q, &bp->bio2))generic_make_request (&bp->bio2); +spin_lock_irq (&conf->resync_lock); + conf->nr_waiting--; +wake_up (&conf->wait_barrier); +spin_unlock_irq (&conf->resync_lock); +bio_pair_release (bp);return 0 ; bad_map:
PATCH 5/11 eCryptfs: Handle ioctl calls with unlocked and compat functions
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Tyler Hicks <[email protected]>
commit c43f7b8fb03be8bcc579bfc4e6ab70eac887ab55 upstream.
Lower filesystems that only implemented unlocked_ioctl weren't being passed ioctl calls because eCryptfs only checked for lower_file->f_op->ioctl and returned -ENOTTY if it was NULL.
eCryptfs shouldn't implement ioctl(), since it doesn't require the BKL. This patch introduces ecryptfs_unlocked_ioctl() and ecryptfs_compat_ioctl(), which passes the calls on to the lower file system.
https://bugs.launchpad.net/ecryptfs/+bug/469664
--- fs/ecryptfs/file.c | 56 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 21 deletions(-)
fs/ecryptfs/file.c +35 -21
@@ -303,12 +303,40 @@ static int ecryptfs_fasync(int fd, strucreturn rc; } -static int ecryptfs_ioctl (struct inode *inode,struct file *file, -unsigned int cmd,unsigned long arg); +static long +ecryptfs_unlocked_ioctl (struct file *file,unsigned int cmd,unsigned long arg) +{ +struct file *lower_file =NULL ; +long rc = -ENOTTY ; + +if (ecryptfs_file_to_private (file)) + lower_file =ecryptfs_file_to_lower (file); +if (lower_file && lower_file->f_op && lower_file->f_op->unlocked_ioctl) + rc = lower_file->f_op->unlocked_ioctl (lower_file, cmd, arg); +return rc; +} + +#ifdef CONFIG_COMPAT +static long +ecryptfs_compat_ioctl (struct file *file,unsigned int cmd,unsigned long arg) +{ +struct file *lower_file =NULL ; +long rc = -ENOIOCTLCMD ; + +if (ecryptfs_file_to_private (file)) + lower_file =ecryptfs_file_to_lower (file); +if (lower_file && lower_file->f_op && lower_file->f_op->compat_ioctl) + rc = lower_file->f_op->compat_ioctl (lower_file, cmd, arg); +return rc; +} +#endif const struct file_operations ecryptfs_dir_fops = { .readdir = ecryptfs_readdir, - .ioctl = ecryptfs_ioctl, + .unlocked_ioctl = ecryptfs_unlocked_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = ecryptfs_compat_ioctl, +#endif .mmap = generic_file_mmap, .open = ecryptfs_open, .flush = ecryptfs_flush,
@@ -325,7 +353,10 @@ const struct file_operations ecryptfs_ma .write = do_sync_write, .aio_write = generic_file_aio_write, .readdir = ecryptfs_readdir, - .ioctl = ecryptfs_ioctl, + .unlocked_ioctl = ecryptfs_unlocked_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = ecryptfs_compat_ioctl, +#endif .mmap = generic_file_mmap, .open = ecryptfs_open, .flush = ecryptfs_flush,
@@ -334,20 +365,3 @@ const struct file_operations ecryptfs_ma .fasync = ecryptfs_fasync, .splice_read = generic_file_splice_read, }; - -static int -ecryptfs_ioctl (struct inode *inode,struct file *file,unsigned int cmd, -unsigned long arg) -{ -int rc =0 ; -struct file *lower_file =NULL ; - -if (ecryptfs_file_to_private (file)) - lower_file =ecryptfs_file_to_lower (file); -if (lower_file && lower_file->f_op && lower_file->f_op->ioctl) - rc = lower_file->f_op->ioctl (ecryptfs_inode_to_lower (inode), - lower_file, cmd, arg); -else - rc = -ENOTTY ; -return rc; -}
PATCH 6/11 fs/ecryptfs/file.c: introduce missing free
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Julia Lawall <[email protected]>
commit ceeab92971e8af05c1e81a4ff2c271124b55bb9b upstream.
The comments in the code indicate that file_info should be released if the function fails. This releasing is done at the label out_free, not out.
The semantic match that finds this problem is as follows:
(http://www.emn.fr/x-info/coccinelle/)
// <smpl>
@r exists@
local idexpression x;
statement S;
expression E;
identifier f,f1,l;
position p1,p2;
expression *ptr != NULL;
@@
x@p1 = kmem_cache_zalloc(...);
...
if (x == NULL) S
<... when != x
when != if (...) { <+...x...+> }(x->f1 = E
|
(x->f1 == NULL || ...)
|
f(...,x->f1,...)
)
...>
(
return <+...x...+>;
|
return@p2 ...;
)
@script:python@
p1 << r.p1;
p2 << r.p2;
@@
print "* file: %s kmem_cache_zalloc %s" % (p1[0].file,p1[0].line) // </smpl>
--- fs/ecryptfs/file.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/ecryptfs/file.c +2 -2
@@ -199,7 +199,7 @@ static int ecryptfs_open(struct inode *i"the persistent file for the dentry with name " "[%s]; rc = [%d]\n" , __func__, ecryptfs_dentry->d_name.name, rc); - goto out; + goto out_free; } } if ((ecryptfs_inode_to_private(inode)->lower_file->f_flags & O_RDONLY)
@@ -207,7 +207,7 @@ static int ecryptfs_open(struct inode *i rc = -EPERM ;printk (KERN_WARNING "%s: Lower persistent file is RO; eCryptfs " "file must hence be opened RO\n" , __func__); - goto out; + goto out_free; }ecryptfs_set_file_lower ( file,ecryptfs_inode_to_private (inode)->lower_file);
PATCH 7/11 signalfd: fill in ssi_int for posix timers and message queues
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Nathan Lynch <[email protected]>
commit a2a20c412c86e0bb46a9ab0dd31bcfe6d201b913 upstream.
If signalfd is used to consume a signal generated by a POSIX interval timer or POSIX message queue, the ssi_int field does not reflect the data (sigevent->sigev_value) supplied to timer_create(2) or mq_notify(3). (The ssi_ptr field, however, is filled in.)
This behavior differs from signalfd's treatment of sigqueue-generated signals -- see the default case in signalfd_copyinfo. It also gives results that differ from the case when a signal is handled conventionally via a sigaction-registered handler.
So, set signalfd_siginfo->ssi_int in the remaining cases (__SI_TIMER, __SI_MESGQ) where ssi_ptr is set.
akpm: a non-back-compatible change. Merge into -stable to minimise the number of kernels which are in the field and which miss this feature.
--- fs/signalfd.c | 2 ++ 1 file changed, 2 insertions(+)
fs/signalfd.c +2 -0
@@ -87,6 +87,7 @@ static int signalfd_copyinfo(struct sign err |=__put_user (kinfo->si_tid, &uinfo->ssi_tid); err |=__put_user (kinfo->si_overrun, &uinfo->ssi_overrun); err |=__put_user ((long ) kinfo->si_ptr, &uinfo->ssi_ptr); + err |=__put_user (kinfo->si_int, &uinfo->ssi_int);break ;case __SI_POLL: err |=__put_user (kinfo->si_band, &uinfo->ssi_band);
@@ -110,6 +111,7 @@ static int signalfd_copyinfo(struct sign err |=__put_user (kinfo->si_pid, &uinfo->ssi_pid); err |=__put_user (kinfo->si_uid, &uinfo->ssi_uid); err |=__put_user ((long ) kinfo->si_ptr, &uinfo->ssi_ptr); + err |=__put_user (kinfo->si_int, &uinfo->ssi_int);break ;default :/*
PATCH 8/11 jfs: dont allow os2 xattr namespace overlap with others
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Dave Kleikamp <[email protected]>
commit aca0fa34bdaba39bfddddba8ca70dba4782e8fe6 upstream.
It's currently possible to bypass xattr namespace access rules by prefixing valid xattr names with "os2.", since the os2 namespace stores extended attributes in a legacy format with no prefix.
This patch adds checking to deny access to any valid namespace prefix following "os2.".
--- fs/jfs/xattr.c | 87 ++++++++++++++++++++++++--------------------------------- 1 file changed, 38 insertions(+), 49 deletions(-)
fs/jfs/xattr.c +38 -49
@@ -85,46 +85,25 @@ struct ea_buffer {#define EA_MALLOC 0x0008 +static int is_known_namespace (const char *name) +{ +if (strncmp (name,XATTR_SYSTEM_PREFIX ,XATTR_SYSTEM_PREFIX_LEN ) && +strncmp (name,XATTR_USER_PREFIX ,XATTR_USER_PREFIX_LEN ) && +strncmp (name,XATTR_SECURITY_PREFIX ,XATTR_SECURITY_PREFIX_LEN ) && +strncmp (name,XATTR_TRUSTED_PREFIX ,XATTR_TRUSTED_PREFIX_LEN )) +return false; + +return true; +} +/* * These three routines are used to recognize on-disk extended attributes * that are in a recognized namespace. If the attribute is not recognized, * "os2." is prepended to the name */ -static inline int is_os2_xattr (struct jfs_ea *ea) +static int is_os2_xattr (struct jfs_ea *ea) { -/* -* Check for "system." -*/ -if ((ea->namelen >=XATTR_SYSTEM_PREFIX_LEN ) && - !strncmp (ea->name,XATTR_SYSTEM_PREFIX ,XATTR_SYSTEM_PREFIX_LEN )) -return false; -/* -* Check for "user." -*/ -if ((ea->namelen >=XATTR_USER_PREFIX_LEN ) && - !strncmp (ea->name,XATTR_USER_PREFIX ,XATTR_USER_PREFIX_LEN )) -return false; -/* -* Check for "security." -*/ -if ((ea->namelen >=XATTR_SECURITY_PREFIX_LEN ) && - !strncmp (ea->name,XATTR_SECURITY_PREFIX , -XATTR_SECURITY_PREFIX_LEN )) -return false; -/* -* Check for "trusted." -*/ -if ((ea->namelen >=XATTR_TRUSTED_PREFIX_LEN ) && - !strncmp (ea->name,XATTR_TRUSTED_PREFIX ,XATTR_TRUSTED_PREFIX_LEN )) -return false; -/* -* Add any other valid namespace prefixes here -*/ - -/* -* We assume it's OS/2's flat namespace -*/ -return true; +return !is_known_namespace (ea->name); }static inline int name_size (struct jfs_ea *ea)
@@ -768,13 +747,23 @@ static int can_set_xattr(struct inode *iif (!strncmp (name,XATTR_SYSTEM_PREFIX ,XATTR_SYSTEM_PREFIX_LEN ))return can_set_system_xattr (inode, name, value, value_len); +if (!strncmp (name,XATTR_OS2_PREFIX ,XATTR_OS2_PREFIX_LEN )) { +/* +* This makes sure that we aren't trying to set an +* attribute in a different namespace by prefixing it +* with "os2." +*/ +if (is_known_namespace (name +XATTR_OS2_PREFIX_LEN )) +return -EOPNOTSUPP ; +return 0 ; + } +/* * Don't allow setting an attribute in an unknown namespace. */ if (strncmp (name,XATTR_TRUSTED_PREFIX ,XATTR_TRUSTED_PREFIX_LEN ) &&strncmp (name,XATTR_SECURITY_PREFIX ,XATTR_SECURITY_PREFIX_LEN ) && -strncmp (name,XATTR_USER_PREFIX ,XATTR_USER_PREFIX_LEN ) && -strncmp (name,XATTR_OS2_PREFIX ,XATTR_OS2_PREFIX_LEN )) +strncmp (name,XATTR_USER_PREFIX ,XATTR_USER_PREFIX_LEN ))return -EOPNOTSUPP ;return 0 ;
@@ -956,19 +945,8 @@ ssize_t __jfs_getxattr(struct inode *inoint xattr_size;ssize_t size;int namelen =strlen (name); -char *os2name =NULL ;char *value; -if (strncmp (name,XATTR_OS2_PREFIX ,XATTR_OS2_PREFIX_LEN ) ==0 ) { - os2name =kmalloc (namelen -XATTR_OS2_PREFIX_LEN +1 , -GFP_KERNEL ); -if (!os2name) -return -ENOMEM ; -strcpy (os2name, name +XATTR_OS2_PREFIX_LEN ); - name = os2name; - namelen -=XATTR_OS2_PREFIX_LEN ; - } -down_read (&JFS_IP (inode)->xattr_sem); xattr_size =ea_get (inode, &ea_buf,0 );
@@ -1006,8 +984,6 @@ ssize_t __jfs_getxattr(struct inode *ino out:up_read (&JFS_IP (inode)->xattr_sem); -kfree (os2name); -return size; }
@@ -1016,6 +992,19 @@ ssize_t jfs_getxattr(struct dentry *dent {int err; +if (strncmp (name,XATTR_OS2_PREFIX ,XATTR_OS2_PREFIX_LEN ) ==0 ) { +/* +* skip past "os2." prefix +*/ + name +=XATTR_OS2_PREFIX_LEN ; +/* +* Don't allow retrieving properly prefixed attributes +* by prepending them with "os2." +*/ +if (is_known_namespace (name)) +return -EOPNOTSUPP ; + } + err =__jfs_getxattr (dentry->d_inode, name, data, buf_size);return err;
PATCH 9/11 xen: drop xen_sched_clock in favour of using plain wallclock time
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Jeremy Fitzhardinge <[email protected]>
commit 8a22b9996b001c88f2bfb54c6de6a05fc39e177a upstream.
xen_sched_clock only counts unstolen time. In principle this should be useful to the Linux scheduler so that it knows how much time a process actually consumed. But in practice this doesn't work very well as the scheduler expects the sched_clock time to be synchronized between cpus. It also uses sched_clock to measure the time a task spends sleeping, in which case "unstolen time" isn't meaningful.
So just use plain xen_clocksource_read to return wallclock nanoseconds for sched_clock.
--- arch/x86/xen/enlighten.c | 2 +- arch/x86/xen/time.c | 43 +------------------------------------------ arch/x86/xen/xen-ops.h | 3 ++- 3 files changed, 4 insertions(+), 44 deletions(-)
arch/x86/xen/enlighten.c +1 -1
@@ -1179,7 +1179,7 @@ static const struct pv_time_ops xen_time .set_wallclock = xen_set_wallclock, .get_wallclock = xen_get_wallclock, .get_tsc_khz = xen_tsc_khz, - .sched_clock = xen_sched_clock, + .sched_clock = xen_clocksource_read, };static const struct pv_cpu_ops xen_cpu_ops__initdata = {
arch/x86/xen/time.c +1 -42
61 lines not on this page · raw message
arch/x86/xen/xen-ops.h +2 -1
@@ -3,6 +3,7 @@#include <linux/init.h> #include <linux/irqreturn.h> +#include <linux/clocksource.h> #include <xen/xen-ops.h> /* These are code, but not functions. Defined in entry.S */
@@ -37,7 +38,7 @@ unsigned long xen_tsc_khz(void);void __init xen_time_init (void );unsigned long xen_get_wallclock (void );int xen_set_wallclock (unsigned long time); -unsigned long long xen_sched_clock (void ); +cycle_t xen_clocksource_read (void );irqreturn_t xen_debug_interrupt (int irq,void *dev_id);
PATCH 10/11 bdi: register sysfs bdi device only once per queue
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Kay Sievers <[email protected]>
commit f1d0b063d993527754f062c589b73f125024d216 upstream.
Devices which share the same queue, like floppies and mtd devices, get registered multiple times in the bdi interface, but bdi accounts only the last registered device of the devices sharing one queue.
On remove, all earlier registered devices leak, stay around in sysfs, and cause "duplicate filename" errors if the devices are re-created.
This prevents the creation of multiple bdi interfaces per queue, and the bdi device will carry the dev_t name of the block device which is the first one registered, of the pool of devices using the same queue.
--- mm/backing-dev.c | 3 +++ 1 file changed, 3 insertions(+)
mm/backing-dev.c +3 -0
@@ -176,6 +176,9 @@ int bdi_register(struct backing_dev_infoint ret =0 ;struct device *dev; +if (WARN_ON (bdi->dev)) + goto exit; +va_start (args, fmt); dev =device_create_vargs (bdi_class, parent,MKDEV (0 ,0 ), bdi, fmt, args);va_end (args);
PATCH 11/11 mm/backing-dev.c: remove recently-added WARN_ON()
In reply to Greg KH2.6.27-stable review patch. If anyone has any objections, please let us know.
------------------
From: Andrew Morton <[email protected]>
commit 69fc208be5b7eb18d22d1eca185b201400fd5ffc upstream.
On second thoughts, this is just going to disturb people while telling us things which we already knew.
--- mm/backing-dev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
mm/backing-dev.c +1 -1
@@ -176,7 +176,7 @@ int bdi_register(struct backing_dev_infoint ret =0 ;struct device *dev; -if (WARN_ON (bdi->dev)) +if (bdi->dev)/* The driver needs to use separate queues per device */ goto exit;va_start (args, fmt);