linux-next.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* linux-next: manual merge of the bcon tree
@ 2013-09-30 11:26 Thierry Reding
  2013-09-30 11:26 ` linux-next: manual merge of the block tree Thierry Reding
                   ` (9 more replies)
  0 siblings, 10 replies; 46+ messages in thread
From: Thierry Reding @ 2013-09-30 11:26 UTC (permalink / raw)
  To: Joern Engel; +Cc: linux-next, linux-kernel

Today's linux-next merge of the bcon tree got conflicts in

	drivers/block/Kconfig
	kernel/printk.c

I fixed it up (see below). Please check if the resolution looks correct.

Thanks,
Thierry
---
diff --cc drivers/block/Kconfig
index 555aed0,06eb42f..4cd9323
--- a/drivers/block/Kconfig
+++ b/drivers/block/Kconfig
@@@ -541,14 -544,10 +541,20 @@@ config BLK_DEV_RB
  
  	  If unsure, say N.
  
 +config BLK_DEV_RSXX
 +	tristate "IBM Flash Adapter 900GB Full Height PCIe Device Driver"
 +	depends on PCI
 +	help
 +	  Device driver for IBM's high speed PCIe SSD
 +	  storage device: Flash Adapter 900GB Full Height.
 +
 +	  To compile this driver as a module, choose M here: the
 +	  module will be called rsxx.
 +
+ config BLOCKCONSOLE
+ 	bool "Block device console logging support"
+ 	help
+ 	  This enables logging to block devices.
+ 	  See <file:Documentation/block/blockconsole.txt> for details.
+ 
  endif # BLK_DEV
diff --cc drivers/block/Makefile
index f33b366,99c5c2e..08da80f
--- a/drivers/block/Makefile
+++ b/drivers/block/Makefile
@@@ -40,9 -40,6 +40,10 @@@ obj-$(CONFIG_XEN_BLKDEV_BACKEND)	+= xen
  obj-$(CONFIG_BLK_DEV_DRBD)     += drbd/
  obj-$(CONFIG_BLK_DEV_RBD)     += rbd.o
  obj-$(CONFIG_BLK_DEV_PCIESSD_MTIP32XX)	+= mtip32xx/
+ obj-$(CONFIG_BLOCKCONSOLE)	+= blockconsole.o
  
 +obj-$(CONFIG_BLK_DEV_RSXX) += rsxx/
 +
 +nvme-y		:= nvme-core.o nvme-scsi.o
 +skd-y		:= skd_main.o
  swim_mod-y	:= swim.o swim_asm.o
diff --cc kernel/printk/printk.c
index b4e8500,0000000..1cba1ea
mode 100644,000000..100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@@ -1,2910 -1,0 +1,2911 @@@
 +/*
 + *  linux/kernel/printk.c
 + *
 + *  Copyright (C) 1991, 1992  Linus Torvalds
 + *
 + * Modified to make sys_syslog() more flexible: added commands to
 + * return the last 4k of kernel messages, regardless of whether
 + * they've been read or not.  Added option to suppress kernel printk's
 + * to the console.  Added hook for sending the console messages
 + * elsewhere, in preparation for a serial line console (someday).
 + * Ted Ts'o, 2/11/93.
 + * Modified for sysctl support, 1/8/97, Chris Horn.
 + * Fixed SMP synchronization, 08/08/99, Manfred Spraul
 + *     manfred@colorfullife.com
 + * Rewrote bits to get rid of console_lock
 + *	01Mar01 Andrew Morton
 + */
 +
 +#include <linux/kernel.h>
 +#include <linux/mm.h>
 +#include <linux/tty.h>
 +#include <linux/tty_driver.h>
 +#include <linux/console.h>
 +#include <linux/init.h>
 +#include <linux/jiffies.h>
 +#include <linux/nmi.h>
 +#include <linux/module.h>
 +#include <linux/moduleparam.h>
 +#include <linux/interrupt.h>			/* For in_interrupt() */
 +#include <linux/delay.h>
 +#include <linux/smp.h>
 +#include <linux/security.h>
 +#include <linux/bootmem.h>
 +#include <linux/memblock.h>
 +#include <linux/aio.h>
 +#include <linux/syscalls.h>
 +#include <linux/kexec.h>
 +#include <linux/kdb.h>
 +#include <linux/ratelimit.h>
 +#include <linux/kmsg_dump.h>
 +#include <linux/syslog.h>
 +#include <linux/cpu.h>
 +#include <linux/notifier.h>
 +#include <linux/rculist.h>
 +#include <linux/poll.h>
 +#include <linux/irq_work.h>
 +#include <linux/utsname.h>
 +
 +#include <asm/uaccess.h>
 +
 +#define CREATE_TRACE_POINTS
 +#include <trace/events/printk.h>
 +
 +#include "console_cmdline.h"
 +#include "braille.h"
 +
 +/* printk's without a loglevel use this.. */
 +#define DEFAULT_MESSAGE_LOGLEVEL CONFIG_DEFAULT_MESSAGE_LOGLEVEL
 +
 +/* We show everything that is MORE important than this.. */
 +#define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
 +#define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */
 +
 +int console_printk[4] = {
 +	DEFAULT_CONSOLE_LOGLEVEL,	/* console_loglevel */
 +	DEFAULT_MESSAGE_LOGLEVEL,	/* default_message_loglevel */
 +	MINIMUM_CONSOLE_LOGLEVEL,	/* minimum_console_loglevel */
 +	DEFAULT_CONSOLE_LOGLEVEL,	/* default_console_loglevel */
 +};
 +
 +/*
 + * Low level drivers may need that to know if they can schedule in
 + * their unblank() callback or not. So let's export it.
 + */
 +int oops_in_progress;
 +EXPORT_SYMBOL(oops_in_progress);
 +
 +/*
 + * console_sem protects the console_drivers list, and also
 + * provides serialisation for access to the entire console
 + * driver system.
 + */
 +static DEFINE_SEMAPHORE(console_sem);
 +struct console *console_drivers;
 +EXPORT_SYMBOL_GPL(console_drivers);
 +
 +#ifdef CONFIG_LOCKDEP
 +static struct lockdep_map console_lock_dep_map = {
 +	.name = "console_lock"
 +};
 +#endif
 +
 +/*
 + * This is used for debugging the mess that is the VT code by
 + * keeping track if we have the console semaphore held. It's
 + * definitely not the perfect debug tool (we don't know if _WE_
 + * hold it are racing, but it helps tracking those weird code
 + * path in the console code where we end up in places I want
 + * locked without the console sempahore held
 + */
 +static int console_locked, console_suspended;
 +
 +/*
 + * If exclusive_console is non-NULL then only this console is to be printed to.
 + */
 +static struct console *exclusive_console;
 +
 +/*
 + *	Array of consoles built from command line options (console=)
 + */
 +
 +#define MAX_CMDLINECONSOLES 8
 +
 +static struct console_cmdline console_cmdline[MAX_CMDLINECONSOLES];
 +
 +static int selected_console = -1;
 +static int preferred_console = -1;
 +int console_set_on_cmdline;
 +EXPORT_SYMBOL(console_set_on_cmdline);
 +
 +/* Flag: console code may call schedule() */
 +static int console_may_schedule;
 +
 +/*
 + * The printk log buffer consists of a chain of concatenated variable
 + * length records. Every record starts with a record header, containing
 + * the overall length of the record.
 + *
 + * The heads to the first and last entry in the buffer, as well as the
 + * sequence numbers of these both entries are maintained when messages
 + * are stored..
 + *
 + * If the heads indicate available messages, the length in the header
 + * tells the start next message. A length == 0 for the next message
 + * indicates a wrap-around to the beginning of the buffer.
 + *
 + * Every record carries the monotonic timestamp in microseconds, as well as
 + * the standard userspace syslog level and syslog facility. The usual
 + * kernel messages use LOG_KERN; userspace-injected messages always carry
 + * a matching syslog facility, by default LOG_USER. The origin of every
 + * message can be reliably determined that way.
 + *
 + * The human readable log message directly follows the message header. The
 + * length of the message text is stored in the header, the stored message
 + * is not terminated.
 + *
 + * Optionally, a message can carry a dictionary of properties (key/value pairs),
 + * to provide userspace with a machine-readable message context.
 + *
 + * Examples for well-defined, commonly used property names are:
 + *   DEVICE=b12:8               device identifier
 + *                                b12:8         block dev_t
 + *                                c127:3        char dev_t
 + *                                n8            netdev ifindex
 + *                                +sound:card0  subsystem:devname
 + *   SUBSYSTEM=pci              driver-core subsystem name
 + *
 + * Valid characters in property names are [a-zA-Z0-9.-_]. The plain text value
 + * follows directly after a '=' character. Every property is terminated by
 + * a '\0' character. The last property is not terminated.
 + *
 + * Example of a message structure:
 + *   0000  ff 8f 00 00 00 00 00 00      monotonic time in nsec
 + *   0008  34 00                        record is 52 bytes long
 + *   000a        0b 00                  text is 11 bytes long
 + *   000c              1f 00            dictionary is 23 bytes long
 + *   000e                    03 00      LOG_KERN (facility) LOG_ERR (level)
 + *   0010  69 74 27 73 20 61 20 6c      "it's a l"
 + *         69 6e 65                     "ine"
 + *   001b           44 45 56 49 43      "DEVIC"
 + *         45 3d 62 38 3a 32 00 44      "E=b8:2\0D"
 + *         52 49 56 45 52 3d 62 75      "RIVER=bu"
 + *         67                           "g"
 + *   0032     00 00 00                  padding to next message header
 + *
 + * The 'struct printk_log' buffer header must never be directly exported to
 + * userspace, it is a kernel-private implementation detail that might
 + * need to be changed in the future, when the requirements change.
 + *
 + * /dev/kmsg exports the structured data in the following line format:
 + *   "level,sequnum,timestamp;<message text>\n"
 + *
 + * The optional key/value pairs are attached as continuation lines starting
 + * with a space character and terminated by a newline. All possible
 + * non-prinatable characters are escaped in the "\xff" notation.
 + *
 + * Users of the export format should ignore possible additional values
 + * separated by ',', and find the message after the ';' character.
 + */
 +
 +enum log_flags {
 +	LOG_NOCONS	= 1,	/* already flushed, do not print to console */
 +	LOG_NEWLINE	= 2,	/* text ended with a newline */
 +	LOG_PREFIX	= 4,	/* text started with a prefix */
 +	LOG_CONT	= 8,	/* text is a fragment of a continuation line */
 +};
 +
 +struct printk_log {
 +	u64 ts_nsec;		/* timestamp in nanoseconds */
 +	u16 len;		/* length of entire record */
 +	u16 text_len;		/* length of text buffer */
 +	u16 dict_len;		/* length of dictionary buffer */
 +	u8 facility;		/* syslog facility */
 +	u8 flags:5;		/* internal record flags */
 +	u8 level:3;		/* syslog level */
 +};
 +
 +/*
 + * The logbuf_lock protects kmsg buffer, indices, counters. It is also
 + * used in interesting ways to provide interlocking in console_unlock();
 + */
 +static DEFINE_RAW_SPINLOCK(logbuf_lock);
 +
 +#ifdef CONFIG_PRINTK
 +DECLARE_WAIT_QUEUE_HEAD(log_wait);
 +/* the next printk record to read by syslog(READ) or /proc/kmsg */
 +static u64 syslog_seq;
 +static u32 syslog_idx;
 +static enum log_flags syslog_prev;
 +static size_t syslog_partial;
 +
 +/* index and sequence number of the first record stored in the buffer */
 +static u64 log_first_seq;
 +static u32 log_first_idx;
 +
 +/* index and sequence number of the next record to store in the buffer */
 +static u64 log_next_seq;
 +static u32 log_next_idx;
 +
 +/* the next printk record to write to the console */
 +static u64 console_seq;
 +static u32 console_idx;
 +static enum log_flags console_prev;
 +
 +/* the next printk record to read after the last 'clear' command */
 +static u64 clear_seq;
 +static u32 clear_idx;
 +
 +#define PREFIX_MAX		32
 +#define LOG_LINE_MAX		1024 - PREFIX_MAX
 +
 +/* record buffer */
 +#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
 +#define LOG_ALIGN 4
 +#else
 +#define LOG_ALIGN __alignof__(struct printk_log)
 +#endif
 +#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)
 +static char __log_buf[__LOG_BUF_LEN] __aligned(LOG_ALIGN);
 +static char *log_buf = __log_buf;
 +static u32 log_buf_len = __LOG_BUF_LEN;
 +
 +/* cpu currently holding logbuf_lock */
 +static volatile unsigned int logbuf_cpu = UINT_MAX;
 +
 +/* human readable text of the record */
 +static char *log_text(const struct printk_log *msg)
 +{
 +	return (char *)msg + sizeof(struct printk_log);
 +}
 +
 +/* optional key/value pair dictionary attached to the record */
 +static char *log_dict(const struct printk_log *msg)
 +{
 +	return (char *)msg + sizeof(struct printk_log) + msg->text_len;
 +}
 +
 +/* get record by index; idx must point to valid msg */
 +static struct printk_log *log_from_idx(u32 idx)
 +{
 +	struct printk_log *msg = (struct printk_log *)(log_buf + idx);
 +
 +	/*
 +	 * A length == 0 record is the end of buffer marker. Wrap around and
 +	 * read the message at the start of the buffer.
 +	 */
 +	if (!msg->len)
 +		return (struct printk_log *)log_buf;
 +	return msg;
 +}
 +
 +/* get next record; idx must point to valid msg */
 +static u32 log_next(u32 idx)
 +{
 +	struct printk_log *msg = (struct printk_log *)(log_buf + idx);
 +
 +	/* length == 0 indicates the end of the buffer; wrap */
 +	/*
 +	 * A length == 0 record is the end of buffer marker. Wrap around and
 +	 * read the message at the start of the buffer as *this* one, and
 +	 * return the one after that.
 +	 */
 +	if (!msg->len) {
 +		msg = (struct printk_log *)log_buf;
 +		return msg->len;
 +	}
 +	return idx + msg->len;
 +}
 +
 +/* insert record into the buffer, discard old ones, update heads */
 +static void log_store(int facility, int level,
 +		      enum log_flags flags, u64 ts_nsec,
 +		      const char *dict, u16 dict_len,
 +		      const char *text, u16 text_len)
 +{
 +	struct printk_log *msg;
 +	u32 size, pad_len;
 +
 +	/* number of '\0' padding bytes to next message */
 +	size = sizeof(struct printk_log) + text_len + dict_len;
 +	pad_len = (-size) & (LOG_ALIGN - 1);
 +	size += pad_len;
 +
 +	while (log_first_seq < log_next_seq) {
 +		u32 free;
 +
 +		if (log_next_idx > log_first_idx)
 +			free = max(log_buf_len - log_next_idx, log_first_idx);
 +		else
 +			free = log_first_idx - log_next_idx;
 +
 +		if (free > size + sizeof(struct printk_log))
 +			break;
 +
 +		/* drop old messages until we have enough contiuous space */
 +		log_first_idx = log_next(log_first_idx);
 +		log_first_seq++;
 +	}
 +
 +	if (log_next_idx + size + sizeof(struct printk_log) >= log_buf_len) {
 +		/*
 +		 * This message + an additional empty header does not fit
 +		 * at the end of the buffer. Add an empty header with len == 0
 +		 * to signify a wrap around.
 +		 */
 +		memset(log_buf + log_next_idx, 0, sizeof(struct printk_log));
 +		log_next_idx = 0;
 +	}
 +
 +	/* fill message */
 +	msg = (struct printk_log *)(log_buf + log_next_idx);
 +	memcpy(log_text(msg), text, text_len);
 +	msg->text_len = text_len;
 +	memcpy(log_dict(msg), dict, dict_len);
 +	msg->dict_len = dict_len;
 +	msg->facility = facility;
 +	msg->level = level & 7;
 +	msg->flags = flags & 0x1f;
 +	if (ts_nsec > 0)
 +		msg->ts_nsec = ts_nsec;
 +	else
 +		msg->ts_nsec = local_clock();
 +	memset(log_dict(msg) + dict_len, 0, pad_len);
 +	msg->len = sizeof(struct printk_log) + text_len + dict_len + pad_len;
 +
 +	/* insert message */
 +	log_next_idx += msg->len;
 +	log_next_seq++;
 +}
 +
 +#ifdef CONFIG_SECURITY_DMESG_RESTRICT
 +int dmesg_restrict = 1;
 +#else
 +int dmesg_restrict;
 +#endif
 +
 +static int syslog_action_restricted(int type)
 +{
 +	if (dmesg_restrict)
 +		return 1;
 +	/*
 +	 * Unless restricted, we allow "read all" and "get buffer size"
 +	 * for everybody.
 +	 */
 +	return type != SYSLOG_ACTION_READ_ALL &&
 +	       type != SYSLOG_ACTION_SIZE_BUFFER;
 +}
 +
 +static int check_syslog_permissions(int type, bool from_file)
 +{
 +	/*
 +	 * If this is from /proc/kmsg and we've already opened it, then we've
 +	 * already done the capabilities checks at open time.
 +	 */
 +	if (from_file && type != SYSLOG_ACTION_OPEN)
 +		return 0;
 +
 +	if (syslog_action_restricted(type)) {
 +		if (capable(CAP_SYSLOG))
 +			return 0;
 +		/*
 +		 * For historical reasons, accept CAP_SYS_ADMIN too, with
 +		 * a warning.
 +		 */
 +		if (capable(CAP_SYS_ADMIN)) {
 +			pr_warn_once("%s (%d): Attempt to access syslog with "
 +				     "CAP_SYS_ADMIN but no CAP_SYSLOG "
 +				     "(deprecated).\n",
 +				 current->comm, task_pid_nr(current));
 +			return 0;
 +		}
 +		return -EPERM;
 +	}
 +	return security_syslog(type);
 +}
 +
 +
 +/* /dev/kmsg - userspace message inject/listen interface */
 +struct devkmsg_user {
 +	u64 seq;
 +	u32 idx;
 +	enum log_flags prev;
 +	struct mutex lock;
 +	char buf[8192];
 +};
 +
 +static ssize_t devkmsg_writev(struct kiocb *iocb, const struct iovec *iv,
 +			      unsigned long count, loff_t pos)
 +{
 +	char *buf, *line;
 +	int i;
 +	int level = default_message_loglevel;
 +	int facility = 1;	/* LOG_USER */
 +	size_t len = iov_length(iv, count);
 +	ssize_t ret = len;
 +
 +	if (len > LOG_LINE_MAX)
 +		return -EINVAL;
 +	buf = kmalloc(len+1, GFP_KERNEL);
 +	if (buf == NULL)
 +		return -ENOMEM;
 +
 +	line = buf;
 +	for (i = 0; i < count; i++) {
 +		if (copy_from_user(line, iv[i].iov_base, iv[i].iov_len)) {
 +			ret = -EFAULT;
 +			goto out;
 +		}
 +		line += iv[i].iov_len;
 +	}
 +
 +	/*
 +	 * Extract and skip the syslog prefix <[0-9]*>. Coming from userspace
 +	 * the decimal value represents 32bit, the lower 3 bit are the log
 +	 * level, the rest are the log facility.
 +	 *
 +	 * If no prefix or no userspace facility is specified, we
 +	 * enforce LOG_USER, to be able to reliably distinguish
 +	 * kernel-generated messages from userspace-injected ones.
 +	 */
 +	line = buf;
 +	if (line[0] == '<') {
 +		char *endp = NULL;
 +
 +		i = simple_strtoul(line+1, &endp, 10);
 +		if (endp && endp[0] == '>') {
 +			level = i & 7;
 +			if (i >> 3)
 +				facility = i >> 3;
 +			endp++;
 +			len -= endp - line;
 +			line = endp;
 +		}
 +	}
 +	line[len] = '\0';
 +
 +	printk_emit(facility, level, NULL, 0, "%s", line);
 +out:
 +	kfree(buf);
 +	return ret;
 +}
 +
 +static ssize_t devkmsg_read(struct file *file, char __user *buf,
 +			    size_t count, loff_t *ppos)
 +{
 +	struct devkmsg_user *user = file->private_data;
 +	struct printk_log *msg;
 +	u64 ts_usec;
 +	size_t i;
 +	char cont = '-';
 +	size_t len;
 +	ssize_t ret;
 +
 +	if (!user)
 +		return -EBADF;
 +
 +	ret = mutex_lock_interruptible(&user->lock);
 +	if (ret)
 +		return ret;
 +	raw_spin_lock_irq(&logbuf_lock);
 +	while (user->seq == log_next_seq) {
 +		if (file->f_flags & O_NONBLOCK) {
 +			ret = -EAGAIN;
 +			raw_spin_unlock_irq(&logbuf_lock);
 +			goto out;
 +		}
 +
 +		raw_spin_unlock_irq(&logbuf_lock);
 +		ret = wait_event_interruptible(log_wait,
 +					       user->seq != log_next_seq);
 +		if (ret)
 +			goto out;
 +		raw_spin_lock_irq(&logbuf_lock);
 +	}
 +
 +	if (user->seq < log_first_seq) {
 +		/* our last seen message is gone, return error and reset */
 +		user->idx = log_first_idx;
 +		user->seq = log_first_seq;
 +		ret = -EPIPE;
 +		raw_spin_unlock_irq(&logbuf_lock);
 +		goto out;
 +	}
 +
 +	msg = log_from_idx(user->idx);
 +	ts_usec = msg->ts_nsec;
 +	do_div(ts_usec, 1000);
 +
 +	/*
 +	 * If we couldn't merge continuation line fragments during the print,
 +	 * export the stored flags to allow an optional external merge of the
 +	 * records. Merging the records isn't always neccessarily correct, like
 +	 * when we hit a race during printing. In most cases though, it produces
 +	 * better readable output. 'c' in the record flags mark the first
 +	 * fragment of a line, '+' the following.
 +	 */
 +	if (msg->flags & LOG_CONT && !(user->prev & LOG_CONT))
 +		cont = 'c';
 +	else if ((msg->flags & LOG_CONT) ||
 +		 ((user->prev & LOG_CONT) && !(msg->flags & LOG_PREFIX)))
 +		cont = '+';
 +
 +	len = sprintf(user->buf, "%u,%llu,%llu,%c;",
 +		      (msg->facility << 3) | msg->level,
 +		      user->seq, ts_usec, cont);
 +	user->prev = msg->flags;
 +
 +	/* escape non-printable characters */
 +	for (i = 0; i < msg->text_len; i++) {
 +		unsigned char c = log_text(msg)[i];
 +
 +		if (c < ' ' || c >= 127 || c == '\\')
 +			len += sprintf(user->buf + len, "\\x%02x", c);
 +		else
 +			user->buf[len++] = c;
 +	}
 +	user->buf[len++] = '\n';
 +
 +	if (msg->dict_len) {
 +		bool line = true;
 +
 +		for (i = 0; i < msg->dict_len; i++) {
 +			unsigned char c = log_dict(msg)[i];
 +
 +			if (line) {
 +				user->buf[len++] = ' ';
 +				line = false;
 +			}
 +
 +			if (c == '\0') {
 +				user->buf[len++] = '\n';
 +				line = true;
 +				continue;
 +			}
 +
 +			if (c < ' ' || c >= 127 || c == '\\') {
 +				len += sprintf(user->buf + len, "\\x%02x", c);
 +				continue;
 +			}
 +
 +			user->buf[len++] = c;
 +		}
 +		user->buf[len++] = '\n';
 +	}
 +
 +	user->idx = log_next(user->idx);
 +	user->seq++;
 +	raw_spin_unlock_irq(&logbuf_lock);
 +
 +	if (len > count) {
 +		ret = -EINVAL;
 +		goto out;
 +	}
 +
 +	if (copy_to_user(buf, user->buf, len)) {
 +		ret = -EFAULT;
 +		goto out;
 +	}
 +	ret = len;
 +out:
 +	mutex_unlock(&user->lock);
 +	return ret;
 +}
 +
 +static loff_t devkmsg_llseek(struct file *file, loff_t offset, int whence)
 +{
 +	struct devkmsg_user *user = file->private_data;
 +	loff_t ret = 0;
 +
 +	if (!user)
 +		return -EBADF;
 +	if (offset)
 +		return -ESPIPE;
 +
 +	raw_spin_lock_irq(&logbuf_lock);
 +	switch (whence) {
 +	case SEEK_SET:
 +		/* the first record */
 +		user->idx = log_first_idx;
 +		user->seq = log_first_seq;
 +		break;
 +	case SEEK_DATA:
 +		/*
 +		 * The first record after the last SYSLOG_ACTION_CLEAR,
 +		 * like issued by 'dmesg -c'. Reading /dev/kmsg itself
 +		 * changes no global state, and does not clear anything.
 +		 */
 +		user->idx = clear_idx;
 +		user->seq = clear_seq;
 +		break;
 +	case SEEK_END:
 +		/* after the last record */
 +		user->idx = log_next_idx;
 +		user->seq = log_next_seq;
 +		break;
 +	default:
 +		ret = -EINVAL;
 +	}
 +	raw_spin_unlock_irq(&logbuf_lock);
 +	return ret;
 +}
 +
 +static unsigned int devkmsg_poll(struct file *file, poll_table *wait)
 +{
 +	struct devkmsg_user *user = file->private_data;
 +	int ret = 0;
 +
 +	if (!user)
 +		return POLLERR|POLLNVAL;
 +
 +	poll_wait(file, &log_wait, wait);
 +
 +	raw_spin_lock_irq(&logbuf_lock);
 +	if (user->seq < log_next_seq) {
 +		/* return error when data has vanished underneath us */
 +		if (user->seq < log_first_seq)
 +			ret = POLLIN|POLLRDNORM|POLLERR|POLLPRI;
 +		else
 +			ret = POLLIN|POLLRDNORM;
 +	}
 +	raw_spin_unlock_irq(&logbuf_lock);
 +
 +	return ret;
 +}
 +
 +static int devkmsg_open(struct inode *inode, struct file *file)
 +{
 +	struct devkmsg_user *user;
 +	int err;
 +
 +	/* write-only does not need any file context */
 +	if ((file->f_flags & O_ACCMODE) == O_WRONLY)
 +		return 0;
 +
 +	err = check_syslog_permissions(SYSLOG_ACTION_READ_ALL,
 +				       SYSLOG_FROM_READER);
 +	if (err)
 +		return err;
 +
 +	user = kmalloc(sizeof(struct devkmsg_user), GFP_KERNEL);
 +	if (!user)
 +		return -ENOMEM;
 +
 +	mutex_init(&user->lock);
 +
 +	raw_spin_lock_irq(&logbuf_lock);
 +	user->idx = log_first_idx;
 +	user->seq = log_first_seq;
 +	raw_spin_unlock_irq(&logbuf_lock);
 +
 +	file->private_data = user;
 +	return 0;
 +}
 +
 +static int devkmsg_release(struct inode *inode, struct file *file)
 +{
 +	struct devkmsg_user *user = file->private_data;
 +
 +	if (!user)
 +		return 0;
 +
 +	mutex_destroy(&user->lock);
 +	kfree(user);
 +	return 0;
 +}
 +
 +const struct file_operations kmsg_fops = {
 +	.open = devkmsg_open,
 +	.read = devkmsg_read,
 +	.aio_write = devkmsg_writev,
 +	.llseek = devkmsg_llseek,
 +	.poll = devkmsg_poll,
 +	.release = devkmsg_release,
 +};
 +
 +#ifdef CONFIG_KEXEC
 +/*
 + * This appends the listed symbols to /proc/vmcoreinfo
 + *
 + * /proc/vmcoreinfo is used by various utiilties, like crash and makedumpfile to
 + * obtain access to symbols that are otherwise very difficult to locate.  These
 + * symbols are specifically used so that utilities can access and extract the
 + * dmesg log from a vmcore file after a crash.
 + */
 +void log_buf_kexec_setup(void)
 +{
 +	VMCOREINFO_SYMBOL(log_buf);
 +	VMCOREINFO_SYMBOL(log_buf_len);
 +	VMCOREINFO_SYMBOL(log_first_idx);
 +	VMCOREINFO_SYMBOL(log_next_idx);
 +	/*
 +	 * Export struct printk_log size and field offsets. User space tools can
 +	 * parse it and detect any changes to structure down the line.
 +	 */
 +	VMCOREINFO_STRUCT_SIZE(printk_log);
 +	VMCOREINFO_OFFSET(printk_log, ts_nsec);
 +	VMCOREINFO_OFFSET(printk_log, len);
 +	VMCOREINFO_OFFSET(printk_log, text_len);
 +	VMCOREINFO_OFFSET(printk_log, dict_len);
 +}
 +#endif
 +
 +/* requested log_buf_len from kernel cmdline */
 +static unsigned long __initdata new_log_buf_len;
 +
 +/* save requested log_buf_len since it's too early to process it */
 +static int __init log_buf_len_setup(char *str)
 +{
 +	unsigned size = memparse(str, &str);
 +
 +	if (size)
 +		size = roundup_pow_of_two(size);
 +	if (size > log_buf_len)
 +		new_log_buf_len = size;
 +
 +	return 0;
 +}
 +early_param("log_buf_len", log_buf_len_setup);
 +
 +void __init setup_log_buf(int early)
 +{
 +	unsigned long flags;
 +	char *new_log_buf;
 +	int free;
 +
 +	if (!new_log_buf_len)
 +		return;
 +
 +	if (early) {
 +		unsigned long mem;
 +
 +		mem = memblock_alloc(new_log_buf_len, PAGE_SIZE);
 +		if (!mem)
 +			return;
 +		new_log_buf = __va(mem);
 +	} else {
 +		new_log_buf = alloc_bootmem_nopanic(new_log_buf_len);
 +	}
 +
 +	if (unlikely(!new_log_buf)) {
 +		pr_err("log_buf_len: %ld bytes not available\n",
 +			new_log_buf_len);
 +		return;
 +	}
 +
 +	raw_spin_lock_irqsave(&logbuf_lock, flags);
 +	log_buf_len = new_log_buf_len;
 +	log_buf = new_log_buf;
 +	new_log_buf_len = 0;
 +	free = __LOG_BUF_LEN - log_next_idx;
 +	memcpy(log_buf, __log_buf, __LOG_BUF_LEN);
 +	raw_spin_unlock_irqrestore(&logbuf_lock, flags);
 +
 +	pr_info("log_buf_len: %d\n", log_buf_len);
 +	pr_info("early log buf free: %d(%d%%)\n",
 +		free, (free * 100) / __LOG_BUF_LEN);
 +}
 +
 +static bool __read_mostly ignore_loglevel;
 +
 +static int __init ignore_loglevel_setup(char *str)
 +{
 +	ignore_loglevel = 1;
 +	printk(KERN_INFO "debug: ignoring loglevel setting.\n");
 +
 +	return 0;
 +}
 +
 +early_param("ignore_loglevel", ignore_loglevel_setup);
 +module_param(ignore_loglevel, bool, S_IRUGO | S_IWUSR);
 +MODULE_PARM_DESC(ignore_loglevel, "ignore loglevel setting, to"
 +	"print all kernel messages to the console.");
 +
 +#ifdef CONFIG_BOOT_PRINTK_DELAY
 +
 +static int boot_delay; /* msecs delay after each printk during bootup */
 +static unsigned long long loops_per_msec;	/* based on boot_delay */
 +
 +static int __init boot_delay_setup(char *str)
 +{
 +	unsigned long lpj;
 +
 +	lpj = preset_lpj ? preset_lpj : 1000000;	/* some guess */
 +	loops_per_msec = (unsigned long long)lpj / 1000 * HZ;
 +
 +	get_option(&str, &boot_delay);
 +	if (boot_delay > 10 * 1000)
 +		boot_delay = 0;
 +
 +	pr_debug("boot_delay: %u, preset_lpj: %ld, lpj: %lu, "
 +		"HZ: %d, loops_per_msec: %llu\n",
 +		boot_delay, preset_lpj, lpj, HZ, loops_per_msec);
 +	return 1;
 +}
 +__setup("boot_delay=", boot_delay_setup);
 +
 +static void boot_delay_msec(int level)
 +{
 +	unsigned long long k;
 +	unsigned long timeout;
 +
 +	if ((boot_delay == 0 || system_state != SYSTEM_BOOTING)
 +		|| (level >= console_loglevel && !ignore_loglevel)) {
 +		return;
 +	}
 +
 +	k = (unsigned long long)loops_per_msec * boot_delay;
 +
 +	timeout = jiffies + msecs_to_jiffies(boot_delay);
 +	while (k) {
 +		k--;
 +		cpu_relax();
 +		/*
 +		 * use (volatile) jiffies to prevent
 +		 * compiler reduction; loop termination via jiffies
 +		 * is secondary and may or may not happen.
 +		 */
 +		if (time_after(jiffies, timeout))
 +			break;
 +		touch_nmi_watchdog();
 +	}
 +}
 +#else
 +static inline void boot_delay_msec(int level)
 +{
 +}
 +#endif
 +
 +#if defined(CONFIG_PRINTK_TIME)
 +static bool printk_time = 1;
 +#else
 +static bool printk_time;
 +#endif
 +module_param_named(time, printk_time, bool, S_IRUGO | S_IWUSR);
 +
 +static size_t print_time(u64 ts, char *buf)
 +{
 +	unsigned long rem_nsec;
 +
 +	if (!printk_time)
 +		return 0;
 +
 +	rem_nsec = do_div(ts, 1000000000);
 +
 +	if (!buf)
 +		return snprintf(NULL, 0, "[%5lu.000000] ", (unsigned long)ts);
 +
 +	return sprintf(buf, "[%5lu.%06lu] ",
 +		       (unsigned long)ts, rem_nsec / 1000);
 +}
 +
 +static size_t print_prefix(const struct printk_log *msg, bool syslog, char *buf)
 +{
 +	size_t len = 0;
 +	unsigned int prefix = (msg->facility << 3) | msg->level;
 +
 +	if (syslog) {
 +		if (buf) {
 +			len += sprintf(buf, "<%u>", prefix);
 +		} else {
 +			len += 3;
 +			if (prefix > 999)
 +				len += 3;
 +			else if (prefix > 99)
 +				len += 2;
 +			else if (prefix > 9)
 +				len++;
 +		}
 +	}
 +
 +	len += print_time(msg->ts_nsec, buf ? buf + len : NULL);
 +	return len;
 +}
 +
 +static size_t msg_print_text(const struct printk_log *msg, enum log_flags prev,
 +			     bool syslog, char *buf, size_t size)
 +{
 +	const char *text = log_text(msg);
 +	size_t text_size = msg->text_len;
 +	bool prefix = true;
 +	bool newline = true;
 +	size_t len = 0;
 +
 +	if ((prev & LOG_CONT) && !(msg->flags & LOG_PREFIX))
 +		prefix = false;
 +
 +	if (msg->flags & LOG_CONT) {
 +		if ((prev & LOG_CONT) && !(prev & LOG_NEWLINE))
 +			prefix = false;
 +
 +		if (!(msg->flags & LOG_NEWLINE))
 +			newline = false;
 +	}
 +
 +	do {
 +		const char *next = memchr(text, '\n', text_size);
 +		size_t text_len;
 +
 +		if (next) {
 +			text_len = next - text;
 +			next++;
 +			text_size -= next - text;
 +		} else {
 +			text_len = text_size;
 +		}
 +
 +		if (buf) {
 +			if (print_prefix(msg, syslog, NULL) +
 +			    text_len + 1 >= size - len)
 +				break;
 +
 +			if (prefix)
 +				len += print_prefix(msg, syslog, buf + len);
 +			memcpy(buf + len, text, text_len);
 +			len += text_len;
 +			if (next || newline)
 +				buf[len++] = '\n';
 +		} else {
 +			/* SYSLOG_ACTION_* buffer size only calculation */
 +			if (prefix)
 +				len += print_prefix(msg, syslog, NULL);
 +			len += text_len;
 +			if (next || newline)
 +				len++;
 +		}
 +
 +		prefix = true;
 +		text = next;
 +	} while (text);
 +
 +	return len;
 +}
 +
 +static int syslog_print(char __user *buf, int size)
 +{
 +	char *text;
 +	struct printk_log *msg;
 +	int len = 0;
 +
 +	text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL);
 +	if (!text)
 +		return -ENOMEM;
 +
 +	while (size > 0) {
 +		size_t n;
 +		size_t skip;
 +
 +		raw_spin_lock_irq(&logbuf_lock);
 +		if (syslog_seq < log_first_seq) {
 +			/* messages are gone, move to first one */
 +			syslog_seq = log_first_seq;
 +			syslog_idx = log_first_idx;
 +			syslog_prev = 0;
 +			syslog_partial = 0;
 +		}
 +		if (syslog_seq == log_next_seq) {
 +			raw_spin_unlock_irq(&logbuf_lock);
 +			break;
 +		}
 +
 +		skip = syslog_partial;
 +		msg = log_from_idx(syslog_idx);
 +		n = msg_print_text(msg, syslog_prev, true, text,
 +				   LOG_LINE_MAX + PREFIX_MAX);
 +		if (n - syslog_partial <= size) {
 +			/* message fits into buffer, move forward */
 +			syslog_idx = log_next(syslog_idx);
 +			syslog_seq++;
 +			syslog_prev = msg->flags;
 +			n -= syslog_partial;
 +			syslog_partial = 0;
 +		} else if (!len){
 +			/* partial read(), remember position */
 +			n = size;
 +			syslog_partial += n;
 +		} else
 +			n = 0;
 +		raw_spin_unlock_irq(&logbuf_lock);
 +
 +		if (!n)
 +			break;
 +
 +		if (copy_to_user(buf, text + skip, n)) {
 +			if (!len)
 +				len = -EFAULT;
 +			break;
 +		}
 +
 +		len += n;
 +		size -= n;
 +		buf += n;
 +	}
 +
 +	kfree(text);
 +	return len;
 +}
 +
 +static int syslog_print_all(char __user *buf, int size, bool clear)
 +{
 +	char *text;
 +	int len = 0;
 +
 +	text = kmalloc(LOG_LINE_MAX + PREFIX_MAX, GFP_KERNEL);
 +	if (!text)
 +		return -ENOMEM;
 +
 +	raw_spin_lock_irq(&logbuf_lock);
 +	if (buf) {
 +		u64 next_seq;
 +		u64 seq;
 +		u32 idx;
 +		enum log_flags prev;
 +
 +		if (clear_seq < log_first_seq) {
 +			/* messages are gone, move to first available one */
 +			clear_seq = log_first_seq;
 +			clear_idx = log_first_idx;
 +		}
 +
 +		/*
 +		 * Find first record that fits, including all following records,
 +		 * into the user-provided buffer for this dump.
 +		 */
 +		seq = clear_seq;
 +		idx = clear_idx;
 +		prev = 0;
 +		while (seq < log_next_seq) {
 +			struct printk_log *msg = log_from_idx(idx);
 +
 +			len += msg_print_text(msg, prev, true, NULL, 0);
 +			prev = msg->flags;
 +			idx = log_next(idx);
 +			seq++;
 +		}
 +
 +		/* move first record forward until length fits into the buffer */
 +		seq = clear_seq;
 +		idx = clear_idx;
 +		prev = 0;
 +		while (len > size && seq < log_next_seq) {
 +			struct printk_log *msg = log_from_idx(idx);
 +
 +			len -= msg_print_text(msg, prev, true, NULL, 0);
 +			prev = msg->flags;
 +			idx = log_next(idx);
 +			seq++;
 +		}
 +
 +		/* last message fitting into this dump */
 +		next_seq = log_next_seq;
 +
 +		len = 0;
 +		prev = 0;
 +		while (len >= 0 && seq < next_seq) {
 +			struct printk_log *msg = log_from_idx(idx);
 +			int textlen;
 +
 +			textlen = msg_print_text(msg, prev, true, text,
 +						 LOG_LINE_MAX + PREFIX_MAX);
 +			if (textlen < 0) {
 +				len = textlen;
 +				break;
 +			}
 +			idx = log_next(idx);
 +			seq++;
 +			prev = msg->flags;
 +
 +			raw_spin_unlock_irq(&logbuf_lock);
 +			if (copy_to_user(buf + len, text, textlen))
 +				len = -EFAULT;
 +			else
 +				len += textlen;
 +			raw_spin_lock_irq(&logbuf_lock);
 +
 +			if (seq < log_first_seq) {
 +				/* messages are gone, move to next one */
 +				seq = log_first_seq;
 +				idx = log_first_idx;
 +				prev = 0;
 +			}
 +		}
 +	}
 +
 +	if (clear) {
 +		clear_seq = log_next_seq;
 +		clear_idx = log_next_idx;
 +	}
 +	raw_spin_unlock_irq(&logbuf_lock);
 +
 +	kfree(text);
 +	return len;
 +}
 +
 +int do_syslog(int type, char __user *buf, int len, bool from_file)
 +{
 +	bool clear = false;
 +	static int saved_console_loglevel = -1;
 +	int error;
 +
 +	error = check_syslog_permissions(type, from_file);
 +	if (error)
 +		goto out;
 +
 +	error = security_syslog(type);
 +	if (error)
 +		return error;
 +
 +	switch (type) {
 +	case SYSLOG_ACTION_CLOSE:	/* Close log */
 +		break;
 +	case SYSLOG_ACTION_OPEN:	/* Open log */
 +		break;
 +	case SYSLOG_ACTION_READ:	/* Read from log */
 +		error = -EINVAL;
 +		if (!buf || len < 0)
 +			goto out;
 +		error = 0;
 +		if (!len)
 +			goto out;
 +		if (!access_ok(VERIFY_WRITE, buf, len)) {
 +			error = -EFAULT;
 +			goto out;
 +		}
 +		error = wait_event_interruptible(log_wait,
 +						 syslog_seq != log_next_seq);
 +		if (error)
 +			goto out;
 +		error = syslog_print(buf, len);
 +		break;
 +	/* Read/clear last kernel messages */
 +	case SYSLOG_ACTION_READ_CLEAR:
 +		clear = true;
 +		/* FALL THRU */
 +	/* Read last kernel messages */
 +	case SYSLOG_ACTION_READ_ALL:
 +		error = -EINVAL;
 +		if (!buf || len < 0)
 +			goto out;
 +		error = 0;
 +		if (!len)
 +			goto out;
 +		if (!access_ok(VERIFY_WRITE, buf, len)) {
 +			error = -EFAULT;
 +			goto out;
 +		}
 +		error = syslog_print_all(buf, len, clear);
 +		break;
 +	/* Clear ring buffer */
 +	case SYSLOG_ACTION_CLEAR:
 +		syslog_print_all(NULL, 0, true);
 +		break;
 +	/* Disable logging to console */
 +	case SYSLOG_ACTION_CONSOLE_OFF:
 +		if (saved_console_loglevel == -1)
 +			saved_console_loglevel = console_loglevel;
 +		console_loglevel = minimum_console_loglevel;
 +		break;
 +	/* Enable logging to console */
 +	case SYSLOG_ACTION_CONSOLE_ON:
 +		if (saved_console_loglevel != -1) {
 +			console_loglevel = saved_console_loglevel;
 +			saved_console_loglevel = -1;
 +		}
 +		break;
 +	/* Set level of messages printed to console */
 +	case SYSLOG_ACTION_CONSOLE_LEVEL:
 +		error = -EINVAL;
 +		if (len < 1 || len > 8)
 +			goto out;
 +		if (len < minimum_console_loglevel)
 +			len = minimum_console_loglevel;
 +		console_loglevel = len;
 +		/* Implicitly re-enable logging to console */
 +		saved_console_loglevel = -1;
 +		error = 0;
 +		break;
 +	/* Number of chars in the log buffer */
 +	case SYSLOG_ACTION_SIZE_UNREAD:
 +		raw_spin_lock_irq(&logbuf_lock);
 +		if (syslog_seq < log_first_seq) {
 +			/* messages are gone, move to first one */
 +			syslog_seq = log_first_seq;
 +			syslog_idx = log_first_idx;
 +			syslog_prev = 0;
 +			syslog_partial = 0;
 +		}
 +		if (from_file) {
 +			/*
 +			 * Short-cut for poll(/"proc/kmsg") which simply checks
 +			 * for pending data, not the size; return the count of
 +			 * records, not the length.
 +			 */
 +			error = log_next_idx - syslog_idx;
 +		} else {
 +			u64 seq = syslog_seq;
 +			u32 idx = syslog_idx;
 +			enum log_flags prev = syslog_prev;
 +
 +			error = 0;
 +			while (seq < log_next_seq) {
 +				struct printk_log *msg = log_from_idx(idx);
 +
 +				error += msg_print_text(msg, prev, true, NULL, 0);
 +				idx = log_next(idx);
 +				seq++;
 +				prev = msg->flags;
 +			}
 +			error -= syslog_partial;
 +		}
 +		raw_spin_unlock_irq(&logbuf_lock);
 +		break;
 +	/* Size of the log buffer */
 +	case SYSLOG_ACTION_SIZE_BUFFER:
 +		error = log_buf_len;
 +		break;
 +	default:
 +		error = -EINVAL;
 +		break;
 +	}
 +out:
 +	return error;
 +}
 +
 +SYSCALL_DEFINE3(syslog, int, type, char __user *, buf, int, len)
 +{
 +	return do_syslog(type, buf, len, SYSLOG_FROM_READER);
 +}
 +
 +/*
 + * Call the console drivers, asking them to write out
 + * log_buf[start] to log_buf[end - 1].
 + * The console_lock must be held.
 + */
 +static void call_console_drivers(int level, const char *text, size_t len)
 +{
 +	struct console *con;
 +
 +	trace_console(text, len);
 +
- 	if (level >= console_loglevel && !ignore_loglevel)
- 		return;
 +	if (!console_drivers)
 +		return;
 +
 +	for_each_console(con) {
 +		if (exclusive_console && con != exclusive_console)
 +			continue;
 +		if (!(con->flags & CON_ENABLED))
 +			continue;
 +		if (!con->write)
 +			continue;
 +		if (!cpu_online(smp_processor_id()) &&
 +		    !(con->flags & CON_ANYTIME))
 +			continue;
++		if (level >= console_loglevel && !ignore_loglevel &&
++		    !(con->flags & CON_ALLDATA))
++			continue;
 +		con->write(con, text, len);
 +	}
 +}
 +
 +/*
 + * Zap console related locks when oopsing. Only zap at most once
 + * every 10 seconds, to leave time for slow consoles to print a
 + * full oops.
 + */
 +static void zap_locks(void)
 +{
 +	static unsigned long oops_timestamp;
 +
 +	if (time_after_eq(jiffies, oops_timestamp) &&
 +			!time_after(jiffies, oops_timestamp + 30 * HZ))
 +		return;
 +
 +	oops_timestamp = jiffies;
 +
 +	debug_locks_off();
 +	/* If a crash is occurring, make sure we can't deadlock */
 +	raw_spin_lock_init(&logbuf_lock);
 +	/* And make sure that we print immediately */
 +	sema_init(&console_sem, 1);
 +}
 +
 +/* Check if we have any console registered that can be called early in boot. */
 +static int have_callable_console(void)
 +{
 +	struct console *con;
 +
 +	for_each_console(con)
 +		if (con->flags & CON_ANYTIME)
 +			return 1;
 +
 +	return 0;
 +}
 +
 +/*
 + * Can we actually use the console at this time on this cpu?
 + *
 + * Console drivers may assume that per-cpu resources have
 + * been allocated. So unless they're explicitly marked as
 + * being able to cope (CON_ANYTIME) don't call them until
 + * this CPU is officially up.
 + */
 +static inline int can_use_console(unsigned int cpu)
 +{
 +	return cpu_online(cpu) || have_callable_console();
 +}
 +
 +/*
 + * Try to get console ownership to actually show the kernel
 + * messages from a 'printk'. Return true (and with the
 + * console_lock held, and 'console_locked' set) if it
 + * is successful, false otherwise.
 + *
 + * This gets called with the 'logbuf_lock' spinlock held and
 + * interrupts disabled. It should return with 'lockbuf_lock'
 + * released but interrupts still disabled.
 + */
 +static int console_trylock_for_printk(unsigned int cpu)
 +	__releases(&logbuf_lock)
 +{
 +	int retval = 0, wake = 0;
 +
 +	if (console_trylock()) {
 +		retval = 1;
 +
 +		/*
 +		 * If we can't use the console, we need to release
 +		 * the console semaphore by hand to avoid flushing
 +		 * the buffer. We need to hold the console semaphore
 +		 * in order to do this test safely.
 +		 */
 +		if (!can_use_console(cpu)) {
 +			console_locked = 0;
 +			wake = 1;
 +			retval = 0;
 +		}
 +	}
 +	logbuf_cpu = UINT_MAX;
 +	raw_spin_unlock(&logbuf_lock);
 +	if (wake)
 +		up(&console_sem);
 +	return retval;
 +}
 +
 +int printk_delay_msec __read_mostly;
 +
 +static inline void printk_delay(void)
 +{
 +	if (unlikely(printk_delay_msec)) {
 +		int m = printk_delay_msec;
 +
 +		while (m--) {
 +			mdelay(1);
 +			touch_nmi_watchdog();
 +		}
 +	}
 +}
 +
 +/*
 + * Continuation lines are buffered, and not committed to the record buffer
 + * until the line is complete, or a race forces it. The line fragments
 + * though, are printed immediately to the consoles to ensure everything has
 + * reached the console in case of a kernel crash.
 + */
 +static struct cont {
 +	char buf[LOG_LINE_MAX];
 +	size_t len;			/* length == 0 means unused buffer */
 +	size_t cons;			/* bytes written to console */
 +	struct task_struct *owner;	/* task of first print*/
 +	u64 ts_nsec;			/* time of first print */
 +	u8 level;			/* log level of first message */
 +	u8 facility;			/* log level of first message */
 +	enum log_flags flags;		/* prefix, newline flags */
 +	bool flushed:1;			/* buffer sealed and committed */
 +} cont;
 +
 +static void cont_flush(enum log_flags flags)
 +{
 +	if (cont.flushed)
 +		return;
 +	if (cont.len == 0)
 +		return;
 +
 +	if (cont.cons) {
 +		/*
 +		 * If a fragment of this line was directly flushed to the
 +		 * console; wait for the console to pick up the rest of the
 +		 * line. LOG_NOCONS suppresses a duplicated output.
 +		 */
 +		log_store(cont.facility, cont.level, flags | LOG_NOCONS,
 +			  cont.ts_nsec, NULL, 0, cont.buf, cont.len);
 +		cont.flags = flags;
 +		cont.flushed = true;
 +	} else {
 +		/*
 +		 * If no fragment of this line ever reached the console,
 +		 * just submit it to the store and free the buffer.
 +		 */
 +		log_store(cont.facility, cont.level, flags, 0,
 +			  NULL, 0, cont.buf, cont.len);
 +		cont.len = 0;
 +	}
 +}
 +
 +static bool cont_add(int facility, int level, const char *text, size_t len)
 +{
 +	if (cont.len && cont.flushed)
 +		return false;
 +
 +	if (cont.len + len > sizeof(cont.buf)) {
 +		/* the line gets too long, split it up in separate records */
 +		cont_flush(LOG_CONT);
 +		return false;
 +	}
 +
 +	if (!cont.len) {
 +		cont.facility = facility;
 +		cont.level = level;
 +		cont.owner = current;
 +		cont.ts_nsec = local_clock();
 +		cont.flags = 0;
 +		cont.cons = 0;
 +		cont.flushed = false;
 +	}
 +
 +	memcpy(cont.buf + cont.len, text, len);
 +	cont.len += len;
 +
 +	if (cont.len > (sizeof(cont.buf) * 80) / 100)
 +		cont_flush(LOG_CONT);
 +
 +	return true;
 +}
 +
 +static size_t cont_print_text(char *text, size_t size)
 +{
 +	size_t textlen = 0;
 +	size_t len;
 +
 +	if (cont.cons == 0 && (console_prev & LOG_NEWLINE)) {
 +		textlen += print_time(cont.ts_nsec, text);
 +		size -= textlen;
 +	}
 +
 +	len = cont.len - cont.cons;
 +	if (len > 0) {
 +		if (len+1 > size)
 +			len = size-1;
 +		memcpy(text + textlen, cont.buf + cont.cons, len);
 +		textlen += len;
 +		cont.cons = cont.len;
 +	}
 +
 +	if (cont.flushed) {
 +		if (cont.flags & LOG_NEWLINE)
 +			text[textlen++] = '\n';
 +		/* got everything, release buffer */
 +		cont.len = 0;
 +	}
 +	return textlen;
 +}
 +
 +asmlinkage int vprintk_emit(int facility, int level,
 +			    const char *dict, size_t dictlen,
 +			    const char *fmt, va_list args)
 +{
 +	static int recursion_bug;
 +	static char textbuf[LOG_LINE_MAX];
 +	char *text = textbuf;
 +	size_t text_len;
 +	enum log_flags lflags = 0;
 +	unsigned long flags;
 +	int this_cpu;
 +	int printed_len = 0;
 +
 +	boot_delay_msec(level);
 +	printk_delay();
 +
 +	/* This stops the holder of console_sem just where we want him */
 +	local_irq_save(flags);
 +	this_cpu = smp_processor_id();
 +
 +	/*
 +	 * Ouch, printk recursed into itself!
 +	 */
 +	if (unlikely(logbuf_cpu == this_cpu)) {
 +		/*
 +		 * If a crash is occurring during printk() on this CPU,
 +		 * then try to get the crash message out but make sure
 +		 * we can't deadlock. Otherwise just return to avoid the
 +		 * recursion and return - but flag the recursion so that
 +		 * it can be printed at the next appropriate moment:
 +		 */
 +		if (!oops_in_progress && !lockdep_recursing(current)) {
 +			recursion_bug = 1;
 +			goto out_restore_irqs;
 +		}
 +		zap_locks();
 +	}
 +
 +	lockdep_off();
 +	raw_spin_lock(&logbuf_lock);
 +	logbuf_cpu = this_cpu;
 +
 +	if (recursion_bug) {
 +		static const char recursion_msg[] =
 +			"BUG: recent printk recursion!";
 +
 +		recursion_bug = 0;
 +		printed_len += strlen(recursion_msg);
 +		/* emit KERN_CRIT message */
 +		log_store(0, 2, LOG_PREFIX|LOG_NEWLINE, 0,
 +			  NULL, 0, recursion_msg, printed_len);
 +	}
 +
 +	/*
 +	 * The printf needs to come first; we need the syslog
 +	 * prefix which might be passed-in as a parameter.
 +	 */
 +	text_len = vscnprintf(text, sizeof(textbuf), fmt, args);
 +
 +	/* mark and strip a trailing newline */
 +	if (text_len && text[text_len-1] == '\n') {
 +		text_len--;
 +		lflags |= LOG_NEWLINE;
 +	}
 +
 +	/* strip kernel syslog prefix and extract log level or control flags */
 +	if (facility == 0) {
 +		int kern_level = printk_get_level(text);
 +
 +		if (kern_level) {
 +			const char *end_of_header = printk_skip_level(text);
 +			switch (kern_level) {
 +			case '0' ... '7':
 +				if (level == -1)
 +					level = kern_level - '0';
 +			case 'd':	/* KERN_DEFAULT */
 +				lflags |= LOG_PREFIX;
 +			case 'c':	/* KERN_CONT */
 +				break;
 +			}
 +			text_len -= end_of_header - text;
 +			text = (char *)end_of_header;
 +		}
 +	}
 +
 +	if (level == -1)
 +		level = default_message_loglevel;
 +
 +	if (dict)
 +		lflags |= LOG_PREFIX|LOG_NEWLINE;
 +
 +	if (!(lflags & LOG_NEWLINE)) {
 +		/*
 +		 * Flush the conflicting buffer. An earlier newline was missing,
 +		 * or another task also prints continuation lines.
 +		 */
 +		if (cont.len && (lflags & LOG_PREFIX || cont.owner != current))
 +			cont_flush(LOG_NEWLINE);
 +
 +		/* buffer line if possible, otherwise store it right away */
 +		if (!cont_add(facility, level, text, text_len))
 +			log_store(facility, level, lflags | LOG_CONT, 0,
 +				  dict, dictlen, text, text_len);
 +	} else {
 +		bool stored = false;
 +
 +		/*
 +		 * If an earlier newline was missing and it was the same task,
 +		 * either merge it with the current buffer and flush, or if
 +		 * there was a race with interrupts (prefix == true) then just
 +		 * flush it out and store this line separately.
 +		 */
 +		if (cont.len && cont.owner == current) {
 +			if (!(lflags & LOG_PREFIX))
 +				stored = cont_add(facility, level, text, text_len);
 +			cont_flush(LOG_NEWLINE);
 +		}
 +
 +		if (!stored)
 +			log_store(facility, level, lflags, 0,
 +				  dict, dictlen, text, text_len);
 +	}
 +	printed_len += text_len;
 +
 +	/*
 +	 * Try to acquire and then immediately release the console semaphore.
 +	 * The release will print out buffers and wake up /dev/kmsg and syslog()
 +	 * users.
 +	 *
 +	 * The console_trylock_for_printk() function will release 'logbuf_lock'
 +	 * regardless of whether it actually gets the console semaphore or not.
 +	 */
 +	if (console_trylock_for_printk(this_cpu))
 +		console_unlock();
 +
 +	lockdep_on();
 +out_restore_irqs:
 +	local_irq_restore(flags);
 +
 +	return printed_len;
 +}
 +EXPORT_SYMBOL(vprintk_emit);
 +
 +asmlinkage int vprintk(const char *fmt, va_list args)
 +{
 +	return vprintk_emit(0, -1, NULL, 0, fmt, args);
 +}
 +EXPORT_SYMBOL(vprintk);
 +
 +asmlinkage int printk_emit(int facility, int level,
 +			   const char *dict, size_t dictlen,
 +			   const char *fmt, ...)
 +{
 +	va_list args;
 +	int r;
 +
 +	va_start(args, fmt);
 +	r = vprintk_emit(facility, level, dict, dictlen, fmt, args);
 +	va_end(args);
 +
 +	return r;
 +}
 +EXPORT_SYMBOL(printk_emit);
 +
 +/**
 + * printk - print a kernel message
 + * @fmt: format string
 + *
 + * This is printk(). It can be called from any context. We want it to work.
 + *
 + * We try to grab the console_lock. If we succeed, it's easy - we log the
 + * output and call the console drivers.  If we fail to get the semaphore, we
 + * place the output into the log buffer and return. The current holder of
 + * the console_sem will notice the new output in console_unlock(); and will
 + * send it to the consoles before releasing the lock.
 + *
 + * One effect of this deferred printing is that code which calls printk() and
 + * then changes console_loglevel may break. This is because console_loglevel
 + * is inspected when the actual printing occurs.
 + *
 + * See also:
 + * printf(3)
 + *
 + * See the vsnprintf() documentation for format string extensions over C99.
 + */
 +asmlinkage int printk(const char *fmt, ...)
 +{
 +	va_list args;
 +	int r;
 +
 +#ifdef CONFIG_KGDB_KDB
 +	if (unlikely(kdb_trap_printk)) {
 +		va_start(args, fmt);
 +		r = vkdb_printf(fmt, args);
 +		va_end(args);
 +		return r;
 +	}
 +#endif
 +	va_start(args, fmt);
 +	r = vprintk_emit(0, -1, NULL, 0, fmt, args);
 +	va_end(args);
 +
 +	return r;
 +}
 +EXPORT_SYMBOL(printk);
 +
 +#else /* CONFIG_PRINTK */
 +
 +#define LOG_LINE_MAX		0
 +#define PREFIX_MAX		0
 +#define LOG_LINE_MAX 0
 +static u64 syslog_seq;
 +static u32 syslog_idx;
 +static u64 console_seq;
 +static u32 console_idx;
 +static enum log_flags syslog_prev;
 +static u64 log_first_seq;
 +static u32 log_first_idx;
 +static u64 log_next_seq;
 +static enum log_flags console_prev;
 +static struct cont {
 +	size_t len;
 +	size_t cons;
 +	u8 level;
 +	bool flushed:1;
 +} cont;
 +static struct printk_log *log_from_idx(u32 idx) { return NULL; }
 +static u32 log_next(u32 idx) { return 0; }
 +static void call_console_drivers(int level, const char *text, size_t len) {}
 +static size_t msg_print_text(const struct printk_log *msg, enum log_flags prev,
 +			     bool syslog, char *buf, size_t size) { return 0; }
 +static size_t cont_print_text(char *text, size_t size) { return 0; }
 +
 +#endif /* CONFIG_PRINTK */
 +
 +#ifdef CONFIG_EARLY_PRINTK
 +struct console *early_console;
 +
 +void early_vprintk(const char *fmt, va_list ap)
 +{
 +	if (early_console) {
 +		char buf[512];
 +		int n = vscnprintf(buf, sizeof(buf), fmt, ap);
 +
 +		early_console->write(early_console, buf, n);
 +	}
 +}
 +
 +asmlinkage void early_printk(const char *fmt, ...)
 +{
 +	va_list ap;
 +
 +	va_start(ap, fmt);
 +	early_vprintk(fmt, ap);
 +	va_end(ap);
 +}
 +#endif
 +
 +static int __add_preferred_console(char *name, int idx, char *options,
 +				   char *brl_options)
 +{
 +	struct console_cmdline *c;
 +	int i;
 +
 +	/*
 +	 *	See if this tty is not yet registered, and
 +	 *	if we have a slot free.
 +	 */
 +	for (i = 0, c = console_cmdline;
 +	     i < MAX_CMDLINECONSOLES && c->name[0];
 +	     i++, c++) {
 +		if (strcmp(c->name, name) == 0 && c->index == idx) {
 +			if (!brl_options)
 +				selected_console = i;
 +			return 0;
 +		}
 +	}
 +	if (i == MAX_CMDLINECONSOLES)
 +		return -E2BIG;
 +	if (!brl_options)
 +		selected_console = i;
 +	strlcpy(c->name, name, sizeof(c->name));
 +	c->options = options;
 +	braille_set_options(c, brl_options);
 +
 +	c->index = idx;
 +	return 0;
 +}
 +/*
 + * Set up a list of consoles.  Called from init/main.c
 + */
 +static int __init console_setup(char *str)
 +{
 +	char buf[sizeof(console_cmdline[0].name) + 4]; /* 4 for index */
 +	char *s, *options, *brl_options = NULL;
 +	int idx;
 +
 +	if (_braille_console_setup(&str, &brl_options))
 +		return 1;
 +
 +	/*
 +	 * Decode str into name, index, options.
 +	 */
 +	if (str[0] >= '0' && str[0] <= '9') {
 +		strcpy(buf, "ttyS");
 +		strncpy(buf + 4, str, sizeof(buf) - 5);
 +	} else {
 +		strncpy(buf, str, sizeof(buf) - 1);
 +	}
 +	buf[sizeof(buf) - 1] = 0;
 +	if ((options = strchr(str, ',')) != NULL)
 +		*(options++) = 0;
 +#ifdef __sparc__
 +	if (!strcmp(str, "ttya"))
 +		strcpy(buf, "ttyS0");
 +	if (!strcmp(str, "ttyb"))
 +		strcpy(buf, "ttyS1");
 +#endif
 +	for (s = buf; *s; s++)
 +		if ((*s >= '0' && *s <= '9') || *s == ',')
 +			break;
 +	idx = simple_strtoul(s, NULL, 10);
 +	*s = 0;
 +
 +	__add_preferred_console(buf, idx, options, brl_options);
 +	console_set_on_cmdline = 1;
 +	return 1;
 +}
 +__setup("console=", console_setup);
 +
 +/**
 + * add_preferred_console - add a device to the list of preferred consoles.
 + * @name: device name
 + * @idx: device index
 + * @options: options for this console
 + *
 + * The last preferred console added will be used for kernel messages
 + * and stdin/out/err for init.  Normally this is used by console_setup
 + * above to handle user-supplied console arguments; however it can also
 + * be used by arch-specific code either to override the user or more
 + * commonly to provide a default console (ie from PROM variables) when
 + * the user has not supplied one.
 + */
 +int add_preferred_console(char *name, int idx, char *options)
 +{
 +	return __add_preferred_console(name, idx, options, NULL);
 +}
 +
 +int update_console_cmdline(char *name, int idx, char *name_new, int idx_new, char *options)
 +{
 +	struct console_cmdline *c;
 +	int i;
 +
 +	for (i = 0, c = console_cmdline;
 +	     i < MAX_CMDLINECONSOLES && c->name[0];
 +	     i++, c++)
 +		if (strcmp(c->name, name) == 0 && c->index == idx) {
 +			strlcpy(c->name, name_new, sizeof(c->name));
 +			c->name[sizeof(c->name) - 1] = 0;
 +			c->options = options;
 +			c->index = idx_new;
 +			return i;
 +		}
 +	/* not found */
 +	return -1;
 +}
 +
 +bool console_suspend_enabled = 1;
 +EXPORT_SYMBOL(console_suspend_enabled);
 +
 +static int __init console_suspend_disable(char *str)
 +{
 +	console_suspend_enabled = 0;
 +	return 1;
 +}
 +__setup("no_console_suspend", console_suspend_disable);
 +module_param_named(console_suspend, console_suspend_enabled,
 +		bool, S_IRUGO | S_IWUSR);
 +MODULE_PARM_DESC(console_suspend, "suspend console during suspend"
 +	" and hibernate operations");
 +
 +/**
 + * suspend_console - suspend the console subsystem
 + *
 + * This disables printk() while we go into suspend states
 + */
 +void suspend_console(void)
 +{
 +	if (!console_suspend_enabled)
 +		return;
 +	printk("Suspending console(s) (use no_console_suspend to debug)\n");
 +	console_lock();
 +	console_suspended = 1;
 +	up(&console_sem);
 +}
 +
 +void resume_console(void)
 +{
 +	if (!console_suspend_enabled)
 +		return;
 +	down(&console_sem);
 +	console_suspended = 0;
 +	console_unlock();
 +}
 +
 +/**
 + * console_cpu_notify - print deferred console messages after CPU hotplug
 + * @self: notifier struct
 + * @action: CPU hotplug event
 + * @hcpu: unused
 + *
 + * If printk() is called from a CPU that is not online yet, the messages
 + * will be spooled but will not show up on the console.  This function is
 + * called when a new CPU comes online (or fails to come up), and ensures
 + * that any such output gets printed.
 + */
 +static int console_cpu_notify(struct notifier_block *self,
 +	unsigned long action, void *hcpu)
 +{
 +	switch (action) {
 +	case CPU_ONLINE:
 +	case CPU_DEAD:
 +	case CPU_DOWN_FAILED:
 +	case CPU_UP_CANCELED:
 +		console_lock();
 +		console_unlock();
 +	}
 +	return NOTIFY_OK;
 +}
 +
 +/**
 + * console_lock - lock the console system for exclusive use.
 + *
 + * Acquires a lock which guarantees that the caller has
 + * exclusive access to the console system and the console_drivers list.
 + *
 + * Can sleep, returns nothing.
 + */
 +void console_lock(void)
 +{
 +	might_sleep();
 +
 +	down(&console_sem);
 +	if (console_suspended)
 +		return;
 +	console_locked = 1;
 +	console_may_schedule = 1;
 +	mutex_acquire(&console_lock_dep_map, 0, 0, _RET_IP_);
 +}
 +EXPORT_SYMBOL(console_lock);
 +
 +/**
 + * console_trylock - try to lock the console system for exclusive use.
 + *
 + * Tried to acquire a lock which guarantees that the caller has
 + * exclusive access to the console system and the console_drivers list.
 + *
 + * returns 1 on success, and 0 on failure to acquire the lock.
 + */
 +int console_trylock(void)
 +{
 +	if (down_trylock(&console_sem))
 +		return 0;
 +	if (console_suspended) {
 +		up(&console_sem);
 +		return 0;
 +	}
 +	console_locked = 1;
 +	console_may_schedule = 0;
 +	mutex_acquire(&console_lock_dep_map, 0, 1, _RET_IP_);
 +	return 1;
 +}
 +EXPORT_SYMBOL(console_trylock);
 +
 +int is_console_locked(void)
 +{
 +	return console_locked;
 +}
 +
 +static void console_cont_flush(char *text, size_t size)
 +{
 +	unsigned long flags;
 +	size_t len;
 +
 +	raw_spin_lock_irqsave(&logbuf_lock, flags);
 +
 +	if (!cont.len)
 +		goto out;
 +
 +	/*
 +	 * We still queue earlier records, likely because the console was
 +	 * busy. The earlier ones need to be printed before this one, we
 +	 * did not flush any fragment so far, so just let it queue up.
 +	 */
 +	if (console_seq < log_next_seq && !cont.cons)
 +		goto out;
 +
 +	len = cont_print_text(text, size);
 +	raw_spin_unlock(&logbuf_lock);
 +	stop_critical_timings();
 +	call_console_drivers(cont.level, text, len);
 +	start_critical_timings();
 +	local_irq_restore(flags);
 +	return;
 +out:
 +	raw_spin_unlock_irqrestore(&logbuf_lock, flags);
 +}
 +
 +/**
 + * console_unlock - unlock the console system
 + *
 + * Releases the console_lock which the caller holds on the console system
 + * and the console driver list.
 + *
 + * While the console_lock was held, console output may have been buffered
 + * by printk().  If this is the case, console_unlock(); emits
 + * the output prior to releasing the lock.
 + *
 + * If there is output waiting, we wake /dev/kmsg and syslog() users.
 + *
 + * console_unlock(); may be called from any context.
 + */
 +void console_unlock(void)
 +{
 +	static char text[LOG_LINE_MAX + PREFIX_MAX];
 +	static u64 seen_seq;
 +	unsigned long flags;
 +	bool wake_klogd = false;
 +	bool retry;
 +
 +	if (console_suspended) {
 +		up(&console_sem);
 +		return;
 +	}
 +
 +	console_may_schedule = 0;
 +
 +	/* flush buffered message fragment immediately to console */
 +	console_cont_flush(text, sizeof(text));
 +again:
 +	for (;;) {
 +		struct printk_log *msg;
 +		size_t len;
 +		int level;
 +
 +		raw_spin_lock_irqsave(&logbuf_lock, flags);
 +		if (seen_seq != log_next_seq) {
 +			wake_klogd = true;
 +			seen_seq = log_next_seq;
 +		}
 +
 +		if (console_seq < log_first_seq) {
 +			/* messages are gone, move to first one */
 +			console_seq = log_first_seq;
 +			console_idx = log_first_idx;
 +			console_prev = 0;
 +		}
 +skip:
 +		if (console_seq == log_next_seq)
 +			break;
 +
 +		msg = log_from_idx(console_idx);
 +		if (msg->flags & LOG_NOCONS) {
 +			/*
 +			 * Skip record we have buffered and already printed
 +			 * directly to the console when we received it.
 +			 */
 +			console_idx = log_next(console_idx);
 +			console_seq++;
 +			/*
 +			 * We will get here again when we register a new
 +			 * CON_PRINTBUFFER console. Clear the flag so we
 +			 * will properly dump everything later.
 +			 */
 +			msg->flags &= ~LOG_NOCONS;
 +			console_prev = msg->flags;
 +			goto skip;
 +		}
 +
 +		level = msg->level;
 +		len = msg_print_text(msg, console_prev, false,
 +				     text, sizeof(text));
 +		console_idx = log_next(console_idx);
 +		console_seq++;
 +		console_prev = msg->flags;
 +		raw_spin_unlock(&logbuf_lock);
 +
 +		stop_critical_timings();	/* don't trace print latency */
 +		call_console_drivers(level, text, len);
 +		start_critical_timings();
 +		local_irq_restore(flags);
 +	}
 +	console_locked = 0;
 +	mutex_release(&console_lock_dep_map, 1, _RET_IP_);
 +
 +	/* Release the exclusive_console once it is used */
 +	if (unlikely(exclusive_console))
 +		exclusive_console = NULL;
 +
 +	raw_spin_unlock(&logbuf_lock);
 +
 +	up(&console_sem);
 +
 +	/*
 +	 * Someone could have filled up the buffer again, so re-check if there's
 +	 * something to flush. In case we cannot trylock the console_sem again,
 +	 * there's a new owner and the console_unlock() from them will do the
 +	 * flush, no worries.
 +	 */
 +	raw_spin_lock(&logbuf_lock);
 +	retry = console_seq != log_next_seq;
 +	raw_spin_unlock_irqrestore(&logbuf_lock, flags);
 +
 +	if (retry && console_trylock())
 +		goto again;
 +
 +	if (wake_klogd)
 +		wake_up_klogd();
 +}
 +EXPORT_SYMBOL(console_unlock);
 +
 +/**
 + * console_conditional_schedule - yield the CPU if required
 + *
 + * If the console code is currently allowed to sleep, and
 + * if this CPU should yield the CPU to another task, do
 + * so here.
 + *
 + * Must be called within console_lock();.
 + */
 +void __sched console_conditional_schedule(void)
 +{
 +	if (console_may_schedule)
 +		cond_resched();
 +}
 +EXPORT_SYMBOL(console_conditional_schedule);
 +
 +void console_unblank(void)
 +{
 +	struct console *c;
 +
 +	/*
 +	 * console_unblank can no longer be called in interrupt context unless
 +	 * oops_in_progress is set to 1..
 +	 */
 +	if (oops_in_progress) {
 +		if (down_trylock(&console_sem) != 0)
 +			return;
 +	} else
 +		console_lock();
 +
 +	console_locked = 1;
 +	console_may_schedule = 0;
 +	for_each_console(c)
 +		if ((c->flags & CON_ENABLED) && c->unblank)
 +			c->unblank();
 +	console_unlock();
 +}
 +
 +/*
 + * Return the console tty driver structure and its associated index
 + */
 +struct tty_driver *console_device(int *index)
 +{
 +	struct console *c;
 +	struct tty_driver *driver = NULL;
 +
 +	console_lock();
 +	for_each_console(c) {
 +		if (!c->device)
 +			continue;
 +		driver = c->device(c, index);
 +		if (driver)
 +			break;
 +	}
 +	console_unlock();
 +	return driver;
 +}
 +
 +/*
 + * Prevent further output on the passed console device so that (for example)
 + * serial drivers can disable console output before suspending a port, and can
 + * re-enable output afterwards.
 + */
 +void console_stop(struct console *console)
 +{
 +	console_lock();
 +	console->flags &= ~CON_ENABLED;
 +	console_unlock();
 +}
 +EXPORT_SYMBOL(console_stop);
 +
 +void console_start(struct console *console)
 +{
 +	console_lock();
 +	console->flags |= CON_ENABLED;
 +	console_unlock();
 +}
 +EXPORT_SYMBOL(console_start);
 +
 +static int __read_mostly keep_bootcon;
 +
 +static int __init keep_bootcon_setup(char *str)
 +{
 +	keep_bootcon = 1;
 +	printk(KERN_INFO "debug: skip boot console de-registration.\n");
 +
 +	return 0;
 +}
 +
 +early_param("keep_bootcon", keep_bootcon_setup);
 +
 +/*
 + * The console driver calls this routine during kernel initialization
 + * to register the console printing procedure with printk() and to
 + * print any messages that were printed by the kernel before the
 + * console driver was initialized.
 + *
 + * This can happen pretty early during the boot process (because of
 + * early_printk) - sometimes before setup_arch() completes - be careful
 + * of what kernel features are used - they may not be initialised yet.
 + *
 + * There are two types of consoles - bootconsoles (early_printk) and
 + * "real" consoles (everything which is not a bootconsole) which are
 + * handled differently.
 + *  - Any number of bootconsoles can be registered at any time.
 + *  - As soon as a "real" console is registered, all bootconsoles
 + *    will be unregistered automatically.
 + *  - Once a "real" console is registered, any attempt to register a
 + *    bootconsoles will be rejected
 + */
 +void register_console(struct console *newcon)
 +{
 +	int i;
 +	unsigned long flags;
 +	struct console *bcon = NULL;
 +	struct console_cmdline *c;
 +
 +	if (console_drivers)
 +		for_each_console(bcon)
 +			if (WARN(bcon == newcon,
 +					"console '%s%d' already registered\n",
 +					bcon->name, bcon->index))
 +				return;
 +
 +	/*
 +	 * before we register a new CON_BOOT console, make sure we don't
 +	 * already have a valid console
 +	 */
 +	if (console_drivers && newcon->flags & CON_BOOT) {
 +		/* find the last or real console */
 +		for_each_console(bcon) {
 +			if (!(bcon->flags & CON_BOOT)) {
 +				printk(KERN_INFO "Too late to register bootconsole %s%d\n",
 +					newcon->name, newcon->index);
 +				return;
 +			}
 +		}
 +	}
 +
 +	if (console_drivers && console_drivers->flags & CON_BOOT)
 +		bcon = console_drivers;
 +
 +	if (preferred_console < 0 || bcon || !console_drivers)
 +		preferred_console = selected_console;
 +
 +	if (newcon->early_setup)
 +		newcon->early_setup();
 +
 +	/*
 +	 *	See if we want to use this console driver. If we
 +	 *	didn't select a console we take the first one
 +	 *	that registers here.
 +	 */
 +	if (preferred_console < 0) {
 +		if (newcon->index < 0)
 +			newcon->index = 0;
 +		if (newcon->setup == NULL ||
 +		    newcon->setup(newcon, NULL) == 0) {
 +			newcon->flags |= CON_ENABLED;
 +			if (newcon->device) {
 +				newcon->flags |= CON_CONSDEV;
 +				preferred_console = 0;
 +			}
 +		}
 +	}
 +
 +	/*
 +	 *	See if this console matches one we selected on
 +	 *	the command line.
 +	 */
 +	for (i = 0, c = console_cmdline;
 +	     i < MAX_CMDLINECONSOLES && c->name[0];
 +	     i++, c++) {
 +		if (strcmp(c->name, newcon->name) != 0)
 +			continue;
 +		if (newcon->index >= 0 &&
 +		    newcon->index != c->index)
 +			continue;
 +		if (newcon->index < 0)
 +			newcon->index = c->index;
 +
 +		if (_braille_register_console(newcon, c))
 +			return;
 +
 +		if (newcon->setup &&
 +		    newcon->setup(newcon, console_cmdline[i].options) != 0)
 +			break;
 +		newcon->flags |= CON_ENABLED;
 +		newcon->index = c->index;
 +		if (i == selected_console) {
 +			newcon->flags |= CON_CONSDEV;
 +			preferred_console = selected_console;
 +		}
 +		break;
 +	}
 +
 +	if (!(newcon->flags & CON_ENABLED))
 +		return;
 +
 +	/*
 +	 * If we have a bootconsole, and are switching to a real console,
 +	 * don't print everything out again, since when the boot console, and
 +	 * the real console are the same physical device, it's annoying to
 +	 * see the beginning boot messages twice
 +	 */
 +	if (bcon && ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV))
 +		newcon->flags &= ~CON_PRINTBUFFER;
 +
 +	/*
 +	 *	Put this console in the list - keep the
 +	 *	preferred driver at the head of the list.
 +	 */
 +	console_lock();
 +	if ((newcon->flags & CON_CONSDEV) || console_drivers == NULL) {
 +		newcon->next = console_drivers;
 +		console_drivers = newcon;
 +		if (newcon->next)
 +			newcon->next->flags &= ~CON_CONSDEV;
 +	} else {
 +		newcon->next = console_drivers->next;
 +		console_drivers->next = newcon;
 +	}
 +	if (newcon->flags & CON_PRINTBUFFER) {
 +		/*
 +		 * console_unlock(); will print out the buffered messages
 +		 * for us.
 +		 */
 +		raw_spin_lock_irqsave(&logbuf_lock, flags);
 +		console_seq = syslog_seq;
 +		console_idx = syslog_idx;
 +		console_prev = syslog_prev;
 +		raw_spin_unlock_irqrestore(&logbuf_lock, flags);
 +		/*
 +		 * We're about to replay the log buffer.  Only do this to the
 +		 * just-registered console to avoid excessive message spam to
 +		 * the already-registered consoles.
 +		 */
 +		exclusive_console = newcon;
 +	}
 +	console_unlock();
 +	console_sysfs_notify();
 +
 +	/*
 +	 * By unregistering the bootconsoles after we enable the real console
 +	 * we get the "console xxx enabled" message on all the consoles -
 +	 * boot consoles, real consoles, etc - this is to ensure that end
 +	 * users know there might be something in the kernel's log buffer that
 +	 * went to the bootconsole (that they do not see on the real console)
 +	 */
 +	if (bcon &&
 +	    ((newcon->flags & (CON_CONSDEV | CON_BOOT)) == CON_CONSDEV) &&
 +	    !keep_bootcon) {
 +		/* we need to iterate through twice, to make sure we print
 +		 * everything out, before we unregister the console(s)
 +		 */
 +		printk(KERN_INFO "console [%s%d] enabled, bootconsole disabled\n",
 +			newcon->name, newcon->index);
 +		for_each_console(bcon)
 +			if (bcon->flags & CON_BOOT)
 +				unregister_console(bcon);
 +	} else {
 +		printk(KERN_INFO "%sconsole [%s%d] enabled\n",
 +			(newcon->flags & CON_BOOT) ? "boot" : "" ,
 +			newcon->name, newcon->index);
 +	}
 +}
 +EXPORT_SYMBOL(register_console);
 +
 +int unregister_console(struct console *console)
 +{
 +        struct console *a, *b;
 +	int res;
 +
 +	res = _braille_unregister_console(console);
 +	if (res)
 +		return res;
 +
 +	res = 1;
 +	console_lock();
 +	if (console_drivers == console) {
 +		console_drivers=console->next;
 +		res = 0;
 +	} else if (console_drivers) {
 +		for (a=console_drivers->next, b=console_drivers ;
 +		     a; b=a, a=b->next) {
 +			if (a == console) {
 +				b->next = a->next;
 +				res = 0;
 +				break;
 +			}
 +		}
 +	}
 +
 +	/*
 +	 * If this isn't the last console and it has CON_CONSDEV set, we
 +	 * need to set it on the next preferred console.
 +	 */
 +	if (console_drivers != NULL && console->flags & CON_CONSDEV)
 +		console_drivers->flags |= CON_CONSDEV;
 +
 +	console_unlock();
 +	console_sysfs_notify();
 +	return res;
 +}
 +EXPORT_SYMBOL(unregister_console);
 +
 +static int __init printk_late_init(void)
 +{
 +	struct console *con;
 +
 +	for_each_console(con) {
 +		if (!keep_bootcon && con->flags & CON_BOOT) {
 +			printk(KERN_INFO "turn off boot console %s%d\n",
 +				con->name, con->index);
 +			unregister_console(con);
 +		}
 +	}
 +	hotcpu_notifier(console_cpu_notify, 0);
 +	return 0;
 +}
 +late_initcall(printk_late_init);
 +
 +#if defined CONFIG_PRINTK
 +/*
 + * Delayed printk version, for scheduler-internal messages:
 + */
 +#define PRINTK_BUF_SIZE		512
 +
 +#define PRINTK_PENDING_WAKEUP	0x01
 +#define PRINTK_PENDING_SCHED	0x02
 +
 +static DEFINE_PER_CPU(int, printk_pending);
 +static DEFINE_PER_CPU(char [PRINTK_BUF_SIZE], printk_sched_buf);
 +
 +static void wake_up_klogd_work_func(struct irq_work *irq_work)
 +{
 +	int pending = __this_cpu_xchg(printk_pending, 0);
 +
 +	if (pending & PRINTK_PENDING_SCHED) {
 +		char *buf = __get_cpu_var(printk_sched_buf);
 +		printk(KERN_WARNING "[sched_delayed] %s", buf);
 +	}
 +
 +	if (pending & PRINTK_PENDING_WAKEUP)
 +		wake_up_interruptible(&log_wait);
 +}
 +
 +static DEFINE_PER_CPU(struct irq_work, wake_up_klogd_work) = {
 +	.func = wake_up_klogd_work_func,
 +	.flags = IRQ_WORK_LAZY,
 +};
 +
 +void wake_up_klogd(void)
 +{
 +	preempt_disable();
 +	if (waitqueue_active(&log_wait)) {
 +		this_cpu_or(printk_pending, PRINTK_PENDING_WAKEUP);
 +		irq_work_queue(&__get_cpu_var(wake_up_klogd_work));
 +	}
 +	preempt_enable();
 +}
 +
 +int printk_sched(const char *fmt, ...)
 +{
 +	unsigned long flags;
 +	va_list args;
 +	char *buf;
 +	int r;
 +
 +	local_irq_save(flags);
 +	buf = __get_cpu_var(printk_sched_buf);
 +
 +	va_start(args, fmt);
 +	r = vsnprintf(buf, PRINTK_BUF_SIZE, fmt, args);
 +	va_end(args);
 +
 +	__this_cpu_or(printk_pending, PRINTK_PENDING_SCHED);
 +	irq_work_queue(&__get_cpu_var(wake_up_klogd_work));
 +	local_irq_restore(flags);
 +
 +	return r;
 +}
 +
 +/*
 + * printk rate limiting, lifted from the networking subsystem.
 + *
 + * This enforces a rate limit: not more than 10 kernel messages
 + * every 5s to make a denial-of-service attack impossible.
 + */
 +DEFINE_RATELIMIT_STATE(printk_ratelimit_state, 5 * HZ, 10);
 +
 +int __printk_ratelimit(const char *func)
 +{
 +	return ___ratelimit(&printk_ratelimit_state, func);
 +}
 +EXPORT_SYMBOL(__printk_ratelimit);
 +
 +/**
 + * printk_timed_ratelimit - caller-controlled printk ratelimiting
 + * @caller_jiffies: pointer to caller's state
 + * @interval_msecs: minimum interval between prints
 + *
 + * printk_timed_ratelimit() returns true if more than @interval_msecs
 + * milliseconds have elapsed since the last time printk_timed_ratelimit()
 + * returned true.
 + */
 +bool printk_timed_ratelimit(unsigned long *caller_jiffies,
 +			unsigned int interval_msecs)
 +{
 +	if (*caller_jiffies == 0
 +			|| !time_in_range(jiffies, *caller_jiffies,
 +					*caller_jiffies
 +					+ msecs_to_jiffies(interval_msecs))) {
 +		*caller_jiffies = jiffies;
 +		return true;
 +	}
 +	return false;
 +}
 +EXPORT_SYMBOL(printk_timed_ratelimit);
 +
 +static DEFINE_SPINLOCK(dump_list_lock);
 +static LIST_HEAD(dump_list);
 +
 +/**
 + * kmsg_dump_register - register a kernel log dumper.
 + * @dumper: pointer to the kmsg_dumper structure
 + *
 + * Adds a kernel log dumper to the system. The dump callback in the
 + * structure will be called when the kernel oopses or panics and must be
 + * set. Returns zero on success and %-EINVAL or %-EBUSY otherwise.
 + */
 +int kmsg_dump_register(struct kmsg_dumper *dumper)
 +{
 +	unsigned long flags;
 +	int err = -EBUSY;
 +
 +	/* The dump callback needs to be set */
 +	if (!dumper->dump)
 +		return -EINVAL;
 +
 +	spin_lock_irqsave(&dump_list_lock, flags);
 +	/* Don't allow registering multiple times */
 +	if (!dumper->registered) {
 +		dumper->registered = 1;
 +		list_add_tail_rcu(&dumper->list, &dump_list);
 +		err = 0;
 +	}
 +	spin_unlock_irqrestore(&dump_list_lock, flags);
 +
 +	return err;
 +}
 +EXPORT_SYMBOL_GPL(kmsg_dump_register);
 +
 +/**
 + * kmsg_dump_unregister - unregister a kmsg dumper.
 + * @dumper: pointer to the kmsg_dumper structure
 + *
 + * Removes a dump device from the system. Returns zero on success and
 + * %-EINVAL otherwise.
 + */
 +int kmsg_dump_unregister(struct kmsg_dumper *dumper)
 +{
 +	unsigned long flags;
 +	int err = -EINVAL;
 +
 +	spin_lock_irqsave(&dump_list_lock, flags);
 +	if (dumper->registered) {
 +		dumper->registered = 0;
 +		list_del_rcu(&dumper->list);
 +		err = 0;
 +	}
 +	spin_unlock_irqrestore(&dump_list_lock, flags);
 +	synchronize_rcu();
 +
 +	return err;
 +}
 +EXPORT_SYMBOL_GPL(kmsg_dump_unregister);
 +
 +static bool always_kmsg_dump;
 +module_param_named(always_kmsg_dump, always_kmsg_dump, bool, S_IRUGO | S_IWUSR);
 +
 +/**
 + * kmsg_dump - dump kernel log to kernel message dumpers.
 + * @reason: the reason (oops, panic etc) for dumping
 + *
 + * Call each of the registered dumper's dump() callback, which can
 + * retrieve the kmsg records with kmsg_dump_get_line() or
 + * kmsg_dump_get_buffer().
 + */
 +void kmsg_dump(enum kmsg_dump_reason reason)
 +{
 +	struct kmsg_dumper *dumper;
 +	unsigned long flags;
 +
 +	if ((reason > KMSG_DUMP_OOPS) && !always_kmsg_dump)
 +		return;
 +
 +	rcu_read_lock();
 +	list_for_each_entry_rcu(dumper, &dump_list, list) {
 +		if (dumper->max_reason && reason > dumper->max_reason)
 +			continue;
 +
 +		/* initialize iterator with data about the stored records */
 +		dumper->active = true;
 +
 +		raw_spin_lock_irqsave(&logbuf_lock, flags);
 +		dumper->cur_seq = clear_seq;
 +		dumper->cur_idx = clear_idx;
 +		dumper->next_seq = log_next_seq;
 +		dumper->next_idx = log_next_idx;
 +		raw_spin_unlock_irqrestore(&logbuf_lock, flags);
 +
 +		/* invoke dumper which will iterate over records */
 +		dumper->dump(dumper, reason);
 +
 +		/* reset iterator */
 +		dumper->active = false;
 +	}
 +	rcu_read_unlock();
 +}
 +
 +/**
 + * kmsg_dump_get_line_nolock - retrieve one kmsg log line (unlocked version)
 + * @dumper: registered kmsg dumper
 + * @syslog: include the "<4>" prefixes
 + * @line: buffer to copy the line to
 + * @size: maximum size of the buffer
 + * @len: length of line placed into buffer
 + *
 + * Start at the beginning of the kmsg buffer, with the oldest kmsg
 + * record, and copy one record into the provided buffer.
 + *
 + * Consecutive calls will return the next available record moving
 + * towards the end of the buffer with the youngest messages.
 + *
 + * A return value of FALSE indicates that there are no more records to
 + * read.
 + *
 + * The function is similar to kmsg_dump_get_line(), but grabs no locks.
 + */
 +bool kmsg_dump_get_line_nolock(struct kmsg_dumper *dumper, bool syslog,
 +			       char *line, size_t size, size_t *len)
 +{
 +	struct printk_log *msg;
 +	size_t l = 0;
 +	bool ret = false;
 +
 +	if (!dumper->active)
 +		goto out;
 +
 +	if (dumper->cur_seq < log_first_seq) {
 +		/* messages are gone, move to first available one */
 +		dumper->cur_seq = log_first_seq;
 +		dumper->cur_idx = log_first_idx;
 +	}
 +
 +	/* last entry */
 +	if (dumper->cur_seq >= log_next_seq)
 +		goto out;
 +
 +	msg = log_from_idx(dumper->cur_idx);
 +	l = msg_print_text(msg, 0, syslog, line, size);
 +
 +	dumper->cur_idx = log_next(dumper->cur_idx);
 +	dumper->cur_seq++;
 +	ret = true;
 +out:
 +	if (len)
 +		*len = l;
 +	return ret;
 +}
 +
 +/**
 + * kmsg_dump_get_line - retrieve one kmsg log line
 + * @dumper: registered kmsg dumper
 + * @syslog: include the "<4>" prefixes
 + * @line: buffer to copy the line to
 + * @size: maximum size of the buffer
 + * @len: length of line placed into buffer
 + *
 + * Start at the beginning of the kmsg buffer, with the oldest kmsg
 + * record, and copy one record into the provided buffer.
 + *
 + * Consecutive calls will return the next available record moving
 + * towards the end of the buffer with the youngest messages.
 + *
 + * A return value of FALSE indicates that there are no more records to
 + * read.
 + */
 +bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog,
 +			char *line, size_t size, size_t *len)
 +{
 +	unsigned long flags;
 +	bool ret;
 +
 +	raw_spin_lock_irqsave(&logbuf_lock, flags);
 +	ret = kmsg_dump_get_line_nolock(dumper, syslog, line, size, len);
 +	raw_spin_unlock_irqrestore(&logbuf_lock, flags);
 +
 +	return ret;
 +}
 +EXPORT_SYMBOL_GPL(kmsg_dump_get_line);
 +
 +/**
 + * kmsg_dump_get_buffer - copy kmsg log lines
 + * @dumper: registered kmsg dumper
 + * @syslog: include the "<4>" prefixes
 + * @buf: buffer to copy the line to
 + * @size: maximum size of the buffer
 + * @len: length of line placed into buffer
 + *
 + * Start at the end of the kmsg buffer and fill the provided buffer
 + * with as many of the the *youngest* kmsg records that fit into it.
 + * If the buffer is large enough, all available kmsg records will be
 + * copied with a single call.
 + *
 + * Consecutive calls will fill the buffer with the next block of
 + * available older records, not including the earlier retrieved ones.
 + *
 + * A return value of FALSE indicates that there are no more records to
 + * read.
 + */
 +bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog,
 +			  char *buf, size_t size, size_t *len)
 +{
 +	unsigned long flags;
 +	u64 seq;
 +	u32 idx;
 +	u64 next_seq;
 +	u32 next_idx;
 +	enum log_flags prev;
 +	size_t l = 0;
 +	bool ret = false;
 +
 +	if (!dumper->active)
 +		goto out;
 +
 +	raw_spin_lock_irqsave(&logbuf_lock, flags);
 +	if (dumper->cur_seq < log_first_seq) {
 +		/* messages are gone, move to first available one */
 +		dumper->cur_seq = log_first_seq;
 +		dumper->cur_idx = log_first_idx;
 +	}
 +
 +	/* last entry */
 +	if (dumper->cur_seq >= dumper->next_seq) {
 +		raw_spin_unlock_irqrestore(&logbuf_lock, flags);
 +		goto out;
 +	}
 +
 +	/* calculate length of entire buffer */
 +	seq = dumper->cur_seq;
 +	idx = dumper->cur_idx;
 +	prev = 0;
 +	while (seq < dumper->next_seq) {
 +		struct printk_log *msg = log_from_idx(idx);
 +
 +		l += msg_print_text(msg, prev, true, NULL, 0);
 +		idx = log_next(idx);
 +		seq++;
 +		prev = msg->flags;
 +	}
 +
 +	/* move first record forward until length fits into the buffer */
 +	seq = dumper->cur_seq;
 +	idx = dumper->cur_idx;
 +	prev = 0;
 +	while (l > size && seq < dumper->next_seq) {
 +		struct printk_log *msg = log_from_idx(idx);
 +
 +		l -= msg_print_text(msg, prev, true, NULL, 0);
 +		idx = log_next(idx);
 +		seq++;
 +		prev = msg->flags;
 +	}
 +
 +	/* last message in next interation */
 +	next_seq = seq;
 +	next_idx = idx;
 +
 +	l = 0;
 +	prev = 0;
 +	while (seq < dumper->next_seq) {
 +		struct printk_log *msg = log_from_idx(idx);
 +
 +		l += msg_print_text(msg, prev, syslog, buf + l, size - l);
 +		idx = log_next(idx);
 +		seq++;
 +		prev = msg->flags;
 +	}
 +
 +	dumper->next_seq = next_seq;
 +	dumper->next_idx = next_idx;
 +	ret = true;
 +	raw_spin_unlock_irqrestore(&logbuf_lock, flags);
 +out:
 +	if (len)
 +		*len = l;
 +	return ret;
 +}
 +EXPORT_SYMBOL_GPL(kmsg_dump_get_buffer);
 +
 +/**
 + * kmsg_dump_rewind_nolock - reset the interator (unlocked version)
 + * @dumper: registered kmsg dumper
 + *
 + * Reset the dumper's iterator so that kmsg_dump_get_line() and
 + * kmsg_dump_get_buffer() can be called again and used multiple
 + * times within the same dumper.dump() callback.
 + *
 + * The function is similar to kmsg_dump_rewind(), but grabs no locks.
 + */
 +void kmsg_dump_rewind_nolock(struct kmsg_dumper *dumper)
 +{
 +	dumper->cur_seq = clear_seq;
 +	dumper->cur_idx = clear_idx;
 +	dumper->next_seq = log_next_seq;
 +	dumper->next_idx = log_next_idx;
 +}
 +
 +/**
 + * kmsg_dump_rewind - reset the interator
 + * @dumper: registered kmsg dumper
 + *
 + * Reset the dumper's iterator so that kmsg_dump_get_line() and
 + * kmsg_dump_get_buffer() can be called again and used multiple
 + * times within the same dumper.dump() callback.
 + */
 +void kmsg_dump_rewind(struct kmsg_dumper *dumper)
 +{
 +	unsigned long flags;
 +
 +	raw_spin_lock_irqsave(&logbuf_lock, flags);
 +	kmsg_dump_rewind_nolock(dumper);
 +	raw_spin_unlock_irqrestore(&logbuf_lock, flags);
 +}
 +EXPORT_SYMBOL_GPL(kmsg_dump_rewind);
 +
 +static char dump_stack_arch_desc_str[128];
 +
 +/**
 + * dump_stack_set_arch_desc - set arch-specific str to show with task dumps
 + * @fmt: printf-style format string
 + * @...: arguments for the format string
 + *
 + * The configured string will be printed right after utsname during task
 + * dumps.  Usually used to add arch-specific system identifiers.  If an
 + * arch wants to make use of such an ID string, it should initialize this
 + * as soon as possible during boot.
 + */
 +void __init dump_stack_set_arch_desc(const char *fmt, ...)
 +{
 +	va_list args;
 +
 +	va_start(args, fmt);
 +	vsnprintf(dump_stack_arch_desc_str, sizeof(dump_stack_arch_desc_str),
 +		  fmt, args);
 +	va_end(args);
 +}
 +
 +/**
 + * dump_stack_print_info - print generic debug info for dump_stack()
 + * @log_lvl: log level
 + *
 + * Arch-specific dump_stack() implementations can use this function to
 + * print out the same debug information as the generic dump_stack().
 + */
 +void dump_stack_print_info(const char *log_lvl)
 +{
 +	printk("%sCPU: %d PID: %d Comm: %.20s %s %s %.*s\n",
 +	       log_lvl, raw_smp_processor_id(), current->pid, current->comm,
 +	       print_tainted(), init_utsname()->release,
 +	       (int)strcspn(init_utsname()->version, " "),
 +	       init_utsname()->version);
 +
 +	if (dump_stack_arch_desc_str[0] != '\0')
 +		printk("%sHardware name: %s\n",
 +		       log_lvl, dump_stack_arch_desc_str);
 +
 +	print_worker_info(log_lvl, current);
 +}
 +
 +/**
 + * show_regs_print_info - print generic debug info for show_regs()
 + * @log_lvl: log level
 + *
 + * show_regs() implementations can use this function to print out generic
 + * debug information.
 + */
 +void show_regs_print_info(const char *log_lvl)
 +{
 +	dump_stack_print_info(log_lvl);
 +
 +	printk("%stask: %p ti: %p task.ti: %p\n",
 +	       log_lvl, current, current_thread_info(),
 +	       task_thread_info(current));
 +}
 +
 +#endif

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the block tree
  2013-09-30 11:26 linux-next: manual merge of the bcon tree Thierry Reding
@ 2013-09-30 11:26 ` Thierry Reding
       [not found] ` <1380540373-25352-1-git-send-email-treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 46+ messages in thread
From: Thierry Reding @ 2013-09-30 11:26 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-next, linux-kernel

Today's linux-next merge of the block tree got conflicts in

	drivers/md/bcache/bcache.h
	drivers/md/bcache/bset.c
	drivers/md/bcache/journal.c
	drivers/md/bcache/request.c
	drivers/md/bcache/writeback.c

I fixed it up (see below). Please check if the resolution looks correct.

Thanks,
Thierry

diff --cc drivers/md/bcache/btree.c
index f42fc7e,117a12a..1ccb702
--- a/drivers/md/bcache/btree.c
+++ b/drivers/md/bcache/btree.c
@@@ -633,10 -712,10 +707,10 @@@ static unsigned long bch_mca_scan(struc
  			break;
  
  		if (++i > 3 &&
- 		    !mca_reap(b, NULL, 0)) {
+ 		    !mca_reap(b, 0, false)) {
  			mca_data_free(b);
  			rw_unlock(true, b);
 -			--nr;
 +			freed++;
  		}
  	}
  
diff --cc drivers/md/bcache/request.c
index 71eb233,231b108..49ee1cf
--- a/drivers/md/bcache/request.c
+++ b/drivers/md/bcache/request.c
@@@ -979,68 -1059,52 +1059,55 @@@ static void cached_dev_write(struct cac
  
  	if (should_writeback(dc, s->orig_bio,
  			     cache_mode(dc, bio),
- 			     s->op.skip)) {
- 		s->op.skip = false;
- 		s->writeback = true;
+ 			     s->iop.bypass)) {
+ 		s->iop.bypass = false;
+ 		s->iop.writeback = true;
  	}
  
- 	if (s->op.skip)
- 		goto skip;
- 
- 	trace_bcache_write(s->orig_bio, s->writeback, s->op.skip);
+ 	if (s->iop.bypass) {
+ 		s->iop.bio = s->orig_bio;
+ 		bio_get(s->iop.bio);
  
- 	if (!s->writeback) {
- 		s->op.cache_bio = bio_clone_bioset(bio, GFP_NOIO,
- 						   dc->disk.bio_split);
- 
- 		closure_bio_submit(bio, cl, s->d);
- 	} else {
+ 		if (!(bio->bi_rw & REQ_DISCARD) ||
+ 		    blk_queue_discard(bdev_get_queue(dc->bdev)))
+ 			closure_bio_submit(bio, cl, s->d);
+ 	} else if (s->iop.writeback) {
  		bch_writeback_add(dc);
  
 -		if (s->iop.flush_journal) {
 +		if (bio->bi_rw & REQ_FLUSH) {
  			/* Also need to send a flush to the backing device */
 -			s->iop.bio = bio_clone_bioset(bio, GFP_NOIO,
 -						      dc->disk.bio_split);
 +			struct bio *flush = bio_alloc_bioset(0, GFP_NOIO,
 +							     dc->disk.bio_split);
  
 -			bio->bi_size = 0;
 -			bio->bi_vcnt = 0;
 -			closure_bio_submit(bio, cl, s->d);
 +			flush->bi_rw	= WRITE_FLUSH;
 +			flush->bi_bdev	= bio->bi_bdev;
 +			flush->bi_end_io = request_endio;
 +			flush->bi_private = cl;
 +
 +			closure_bio_submit(flush, cl, s->d);
  		} else {
- 			s->op.cache_bio = bio;
+ 			s->iop.bio = bio;
  		}
- 	}
- out:
- 	closure_call(&s->op.cl, bch_insert_data, NULL, cl);
- 	continue_at(cl, cached_dev_write_complete, NULL);
- skip:
- 	s->op.skip = true;
- 	s->op.cache_bio = s->orig_bio;
- 	bio_get(s->op.cache_bio);
+ 	} else {
+ 		s->iop.bio = bio_clone_bioset(bio, GFP_NOIO,
+ 					      dc->disk.bio_split);
  
- 	if ((bio->bi_rw & REQ_DISCARD) &&
- 	    !blk_queue_discard(bdev_get_queue(dc->bdev)))
- 		goto out;
+ 		closure_bio_submit(bio, cl, s->d);
+ 	}
  
- 	closure_bio_submit(bio, cl, s->d);
- 	goto out;
+ 	closure_call(&s->iop.cl, bch_data_insert, NULL, cl);
+ 	continue_at(cl, cached_dev_write_complete, NULL);
  }
  
- static void request_nodata(struct cached_dev *dc, struct search *s)
+ static void cached_dev_nodata(struct closure *cl)
  {
- 	struct closure *cl = &s->cl;
+ 	struct search *s = container_of(cl, struct search, cl);
  	struct bio *bio = &s->bio.bio;
  
- 	if (bio->bi_rw & REQ_DISCARD) {
- 		request_write(dc, s);
- 		return;
- 	}
- 
- 	if (s->op.flush_journal)
- 		bch_journal_meta(s->op.c, cl);
+ 	if (s->iop.flush_journal)
+ 		bch_journal_meta(s->iop.c, cl);
  
+ 	/* If it's a flush, we send the flush to the backing device too */
  	closure_bio_submit(bio, cl, s->d);
  
  	continue_at(cl, cached_dev_bio_complete, NULL);

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the cgroup tree
       [not found] ` <1380540373-25352-1-git-send-email-treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
@ 2013-09-30 11:26   ` Thierry Reding
  0 siblings, 0 replies; 46+ messages in thread
From: Thierry Reding @ 2013-09-30 11:26 UTC (permalink / raw)
  To: Tejun Heo, Li Zefan
  Cc: cgroups-u79uwXL29TY76Z2rM5mHXA,
	linux-next-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA

Today's linux-next merge of the cgroup tree got conflicts in

	mm/memcontrol.c

I fixed it up (see below). Please check if the resolution looks correct.

Thanks,
Thierry
---
diff --cc mm/memcontrol.c
index 1c52ddb,65a46ef..84dcc5c
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@@ -6203,9 -5979,6 +6216,8 @@@ static void __mem_cgroup_free(struct me
  	int node;
  	size_t size = memcg_size();
  
 +	mem_cgroup_remove_from_trees(memcg);
- 	free_css_id(&mem_cgroup_subsys, &memcg->css);
 +
  	for_each_node(node)
  		free_mem_cgroup_per_zone_info(memcg, node);
  

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the drm-intel tree
  2013-09-30 11:26 linux-next: manual merge of the bcon tree Thierry Reding
  2013-09-30 11:26 ` linux-next: manual merge of the block tree Thierry Reding
       [not found] ` <1380540373-25352-1-git-send-email-treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
@ 2013-09-30 11:26 ` Thierry Reding
  2013-09-30 11:32   ` Daniel Vetter
  2013-09-30 11:26 ` linux-next: manual merge of the ipsec-next tree Thierry Reding
                   ` (6 subsequent siblings)
  9 siblings, 1 reply; 46+ messages in thread
From: Thierry Reding @ 2013-09-30 11:26 UTC (permalink / raw)
  To: Daniel Vetter; +Cc: intel-gfx, linux-next, linux-kernel, dri-devel

Today's linux-next merge of the drm-intel tree got conflicts in

	drivers/gpu/drm/i915/intel_display.c

I fixed it up (see below). Please check if the resolution looks correct.

Thanks,
Thierry
---
diff --cc drivers/gpu/drm/i915/intel_display.c
index e5822e7,cbbdab6..76870f0
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@@ -4775,21 -4882,8 +4882,12 @@@ static void i9xx_set_pipeconf(struct in
  
  	pipeconf = 0;
  
 +	if (dev_priv->quirks & QUIRK_PIPEA_FORCE &&
 +	    I915_READ(PIPECONF(intel_crtc->pipe)) & PIPECONF_ENABLE)
 +		pipeconf |= PIPECONF_ENABLE;
 +
- 	if (intel_crtc->pipe == 0 && INTEL_INFO(dev)->gen < 4) {
- 		/* Enable pixel doubling when the dot clock is > 90% of the (display)
- 		 * core speed.
- 		 *
- 		 * XXX: No double-wide on 915GM pipe B. Is that the only reason for the
- 		 * pipe == 0 check?
- 		 */
- 		if (intel_crtc->config.requested_mode.clock >
- 		    dev_priv->display.get_display_clock_speed(dev) * 9 / 10)
- 			pipeconf |= PIPECONF_DOUBLE_WIDE;
- 	}
+ 	if (intel_crtc->config.double_wide)
+ 		pipeconf |= PIPECONF_DOUBLE_WIDE;
  
  	/* only g4x and later have fancy bpc/dither controls */
  	if (IS_G4X(dev) || IS_VALLEYVIEW(dev)) {

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the ipsec-next tree
  2013-09-30 11:26 linux-next: manual merge of the bcon tree Thierry Reding
                   ` (2 preceding siblings ...)
  2013-09-30 11:26 ` linux-next: manual merge of the drm-intel tree Thierry Reding
@ 2013-09-30 11:26 ` Thierry Reding
  2013-09-30 11:26 ` linux-next: manual merge of the net-next tree Thierry Reding
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 46+ messages in thread
From: Thierry Reding @ 2013-09-30 11:26 UTC (permalink / raw)
  To: Steffen Klassert, Herbert Xu, David S. Miller
  Cc: netdev, linux-next, linux-kernel

Today's linux-next merge of the ipsec-next tree got conflicts in

	include/net/xfrm.h

I fixed it up (see below). Please check if the resolution looks correct.

Thanks,
Thierry
---
diff --cc include/net/xfrm.h
index 7657461,c7afa6e..041820c
--- a/include/net/xfrm.h
+++ b/include/net/xfrm.h
@@@ -1493,39 -1495,35 +1499,39 @@@ static inline int xfrm4_rcv_spi(struct 
  	return xfrm4_rcv_encap(skb, nexthdr, spi, 0);
  }
  
 -extern int xfrm4_extract_output(struct xfrm_state *x, struct sk_buff *skb);
 -extern int xfrm4_prepare_output(struct xfrm_state *x, struct sk_buff *skb);
 -extern int xfrm4_output(struct sk_buff *skb);
 -extern int xfrm4_output_finish(struct sk_buff *skb);
 -extern int xfrm4_tunnel_register(struct xfrm_tunnel *handler, unsigned short family);
 -extern int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler, unsigned short family);
 -extern int xfrm4_mode_tunnel_input_register(struct xfrm_tunnel_notifier *handler);
 -extern int xfrm4_mode_tunnel_input_deregister(struct xfrm_tunnel_notifier *handler);
 -extern int xfrm6_extract_header(struct sk_buff *skb);
 -extern int xfrm6_extract_input(struct xfrm_state *x, struct sk_buff *skb);
 -extern int xfrm6_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi);
 -extern int xfrm6_transport_finish(struct sk_buff *skb, int async);
 -extern int xfrm6_rcv(struct sk_buff *skb);
 -extern int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr,
 -			    xfrm_address_t *saddr, u8 proto);
 -extern int xfrm6_tunnel_register(struct xfrm6_tunnel *handler, unsigned short family);
 -extern int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler, unsigned short family);
 -extern __be32 xfrm6_tunnel_alloc_spi(struct net *net, xfrm_address_t *saddr);
 -extern __be32 xfrm6_tunnel_spi_lookup(struct net *net, const xfrm_address_t *saddr);
 -extern int xfrm6_extract_output(struct xfrm_state *x, struct sk_buff *skb);
 -extern int xfrm6_prepare_output(struct xfrm_state *x, struct sk_buff *skb);
 -extern int xfrm6_output(struct sk_buff *skb);
 -extern int xfrm6_output_finish(struct sk_buff *skb);
 -extern int xfrm6_find_1stfragopt(struct xfrm_state *x, struct sk_buff *skb,
 -				 u8 **prevhdr);
 +int xfrm4_extract_output(struct xfrm_state *x, struct sk_buff *skb);
 +int xfrm4_prepare_output(struct xfrm_state *x, struct sk_buff *skb);
 +int xfrm4_output(struct sk_buff *skb);
 +int xfrm4_output_finish(struct sk_buff *skb);
 +int xfrm4_tunnel_register(struct xfrm_tunnel *handler, unsigned short family);
 +int xfrm4_tunnel_deregister(struct xfrm_tunnel *handler, unsigned short family);
- int xfrm4_mode_tunnel_input_register(struct xfrm_tunnel *handler);
- int xfrm4_mode_tunnel_input_deregister(struct xfrm_tunnel *handler);
++int xfrm4_mode_tunnel_input_register(struct xfrm_tunnel_notifier *handler);
++int xfrm4_mode_tunnel_input_deregister(struct xfrm_tunnel_notifier *handler);
 +void xfrm4_local_error(struct sk_buff *skb, u32 mtu);
 +int xfrm6_extract_header(struct sk_buff *skb);
 +int xfrm6_extract_input(struct xfrm_state *x, struct sk_buff *skb);
 +int xfrm6_rcv_spi(struct sk_buff *skb, int nexthdr, __be32 spi);
 +int xfrm6_transport_finish(struct sk_buff *skb, int async);
 +int xfrm6_rcv(struct sk_buff *skb);
 +int xfrm6_input_addr(struct sk_buff *skb, xfrm_address_t *daddr,
 +		     xfrm_address_t *saddr, u8 proto);
 +int xfrm6_tunnel_register(struct xfrm6_tunnel *handler, unsigned short family);
 +int xfrm6_tunnel_deregister(struct xfrm6_tunnel *handler,
 +			    unsigned short family);
 +__be32 xfrm6_tunnel_alloc_spi(struct net *net, xfrm_address_t *saddr);
 +__be32 xfrm6_tunnel_spi_lookup(struct net *net, const xfrm_address_t *saddr);
 +int xfrm6_extract_output(struct xfrm_state *x, struct sk_buff *skb);
 +int xfrm6_prepare_output(struct xfrm_state *x, struct sk_buff *skb);
 +int xfrm6_output(struct sk_buff *skb);
 +int xfrm6_output_finish(struct sk_buff *skb);
 +int xfrm6_find_1stfragopt(struct xfrm_state *x, struct sk_buff *skb,
 +			  u8 **prevhdr);
 +void xfrm6_local_error(struct sk_buff *skb, u32 mtu);
  
  #ifdef CONFIG_XFRM
 -extern int xfrm4_udp_encap_rcv(struct sock *sk, struct sk_buff *skb);
 -extern int xfrm_user_policy(struct sock *sk, int optname, u8 __user *optval, int optlen);
 +int xfrm4_udp_encap_rcv(struct sock *sk, struct sk_buff *skb);
 +int xfrm_user_policy(struct sock *sk, int optname,
 +		     u8 __user *optval, int optlen);
  #else
  static inline int xfrm_user_policy(struct sock *sk, int optname, u8 __user *optval, int optlen)
  {

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the net-next tree
  2013-09-30 11:26 linux-next: manual merge of the bcon tree Thierry Reding
                   ` (3 preceding siblings ...)
  2013-09-30 11:26 ` linux-next: manual merge of the ipsec-next tree Thierry Reding
@ 2013-09-30 11:26 ` Thierry Reding
  2013-09-30 11:26 ` linux-next: manual merge of the random tree Thierry Reding
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 46+ messages in thread
From: Thierry Reding @ 2013-09-30 11:26 UTC (permalink / raw)
  To: David S. Miller; +Cc: netdev, linux-next, linux-kernel

Today's linux-next merge of the net-next tree got conflicts in

	arch/h8300/include/uapi/asm/socket.h
	drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
	include/net/secure_seq.h

I removed the h8300 file and I fixed up the other two (see below). Please
check if the resolution looks correct.

Thanks,
Thierry
---
diff --cc drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
index 74156f8,5bc0276..7f1340d
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
@@@ -132,35 -132,33 +132,34 @@@ struct pktq *brcmf_bus_gettxq(struct br
   * interface functions from common layer
   */
  
- extern bool brcmf_c_prec_enq(struct device *dev, struct pktq *q,
- 			 struct sk_buff *pkt, int prec);
+ bool brcmf_c_prec_enq(struct device *dev, struct pktq *q, struct sk_buff *pkt,
+ 		      int prec);
  
  /* Receive frame for delivery to OS.  Callee disposes of rxp. */
- extern void brcmf_rx_frames(struct device *dev, struct sk_buff_head *rxlist);
+ void brcmf_rx_frames(struct device *dev, struct sk_buff_head *rxlist);
  
  /* Indication from bus module regarding presence/insertion of dongle. */
- extern int brcmf_attach(uint bus_hdrlen, struct device *dev);
+ int brcmf_attach(uint bus_hdrlen, struct device *dev);
  /* Indication from bus module regarding removal/absence of dongle */
- extern void brcmf_detach(struct device *dev);
+ void brcmf_detach(struct device *dev);
  /* Indication from bus module that dongle should be reset */
- extern void brcmf_dev_reset(struct device *dev);
+ void brcmf_dev_reset(struct device *dev);
  /* Indication from bus module to change flow-control state */
- extern void brcmf_txflowblock(struct device *dev, bool state);
+ void brcmf_txflowblock(struct device *dev, bool state);
  
  /* Notify the bus has transferred the tx packet to firmware */
- extern void brcmf_txcomplete(struct device *dev, struct sk_buff *txp,
- 			     bool success);
+ void brcmf_txcomplete(struct device *dev, struct sk_buff *txp, bool success);
  
- extern int brcmf_bus_start(struct device *dev);
+ int brcmf_bus_start(struct device *dev);
  
  #ifdef CONFIG_BRCMFMAC_SDIO
- extern void brcmf_sdio_exit(void);
- extern void brcmf_sdio_init(void);
- extern void brcmf_sdio_register(void);
+ void brcmf_sdio_exit(void);
+ void brcmf_sdio_init(void);
++void brcmf_sdio_register(void);
  #endif
  #ifdef CONFIG_BRCMFMAC_USB
- extern void brcmf_usb_exit(void);
- extern void brcmf_usb_register(void);
+ void brcmf_usb_exit(void);
 -void brcmf_usb_init(void);
++void brcmf_usb_register(void);
  #endif
  
  #endif				/* _BRCMF_BUS_H_ */
diff --cc include/net/secure_seq.h
index c2e542b,52c1a90..f257486
--- a/include/net/secure_seq.h
+++ b/include/net/secure_seq.h
@@@ -3,18 -3,19 +3,18 @@@
  
  #include <linux/types.h>
  
- extern __u32 secure_ip_id(__be32 daddr);
- extern __u32 secure_ipv6_id(const __be32 daddr[4]);
- extern u32 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport);
- extern u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr,
- 				      __be16 dport);
- extern __u32 secure_tcp_sequence_number(__be32 saddr, __be32 daddr,
- 					__be16 sport, __be16 dport);
- extern __u32 secure_tcpv6_sequence_number(const __be32 *saddr, const __be32 *daddr,
- 					  __be16 sport, __be16 dport);
- extern u64 secure_dccp_sequence_number(__be32 saddr, __be32 daddr,
- 				       __be16 sport, __be16 dport);
- extern u64 secure_dccpv6_sequence_number(__be32 *saddr, __be32 *daddr,
- 					 __be16 sport, __be16 dport);
 -void net_secret_init(void);
+ __u32 secure_ip_id(__be32 daddr);
+ __u32 secure_ipv6_id(const __be32 daddr[4]);
+ u32 secure_ipv4_port_ephemeral(__be32 saddr, __be32 daddr, __be16 dport);
+ u32 secure_ipv6_port_ephemeral(const __be32 *saddr, const __be32 *daddr,
+ 			       __be16 dport);
+ __u32 secure_tcp_sequence_number(__be32 saddr, __be32 daddr,
+ 				 __be16 sport, __be16 dport);
+ __u32 secure_tcpv6_sequence_number(const __be32 *saddr, const __be32 *daddr,
+ 				   __be16 sport, __be16 dport);
+ u64 secure_dccp_sequence_number(__be32 saddr, __be32 daddr,
+ 				__be16 sport, __be16 dport);
+ u64 secure_dccpv6_sequence_number(__be32 *saddr, __be32 *daddr,
+ 				  __be16 sport, __be16 dport);
  
  #endif /* _NET_SECURE_SEQ */

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the random tree
  2013-09-30 11:26 linux-next: manual merge of the bcon tree Thierry Reding
                   ` (4 preceding siblings ...)
  2013-09-30 11:26 ` linux-next: manual merge of the net-next tree Thierry Reding
@ 2013-09-30 11:26 ` Thierry Reding
  2013-09-30 11:26 ` linux-next: manual merge of the sh tree Thierry Reding
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 46+ messages in thread
From: Thierry Reding @ 2013-09-30 11:26 UTC (permalink / raw)
  Cc: linux-next, linux-kernel

Today's linux-next merge of the random tree got conflicts in

	init/main.c

I fixed it up (see below). Please check if the resolution looks correct.

Thanks,
Thierry
---
diff --cc init/main.c
index 7cc4b78,586cd33..379090f
--- a/init/main.c
+++ b/init/main.c
@@@ -75,7 -75,7 +75,8 @@@
  #include <linux/blkdev.h>
  #include <linux/elevator.h>
  #include <linux/sched_clock.h>
 +#include <linux/context_tracking.h>
+ #include <linux/random.h>
  
  #include <asm/io.h>
  #include <asm/bugs.h>

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the sh tree
  2013-09-30 11:26 linux-next: manual merge of the bcon tree Thierry Reding
                   ` (5 preceding siblings ...)
  2013-09-30 11:26 ` linux-next: manual merge of the random tree Thierry Reding
@ 2013-09-30 11:26 ` Thierry Reding
  2013-09-30 11:26 ` linux-next: manual merge of the tip tree Thierry Reding
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 46+ messages in thread
From: Thierry Reding @ 2013-09-30 11:26 UTC (permalink / raw)
  To: Paul Mundt; +Cc: linux-sh, linux-next, linux-kernel

Today's linux-next merge of the sh tree got conflicts in

	arch/sh/kernel/cpu/sh2a/Makefile
	drivers/tty/serial/sh-sci.c
	include/linux/serial_sci.h

I fixed them up (see below). Please check if the resolution looks correct.

Thanks,
Thierry
---
diff --cc arch/sh/kernel/cpu/sh2a/Makefile
index 990195d,130984c..92f0da4
--- a/arch/sh/kernel/cpu/sh2a/Makefile
+++ b/arch/sh/kernel/cpu/sh2a/Makefile
@@@ -21,4 -21,5 +21,5 @@@ pinmux-$(CONFIG_CPU_SUBTYPE_SH7203)	:= 
  pinmux-$(CONFIG_CPU_SUBTYPE_SH7264)	:= pinmux-sh7264.o
  pinmux-$(CONFIG_CPU_SUBTYPE_SH7269)	:= pinmux-sh7269.o
  
 -obj-$(CONFIG_GENERIC_GPIO)		+= $(pinmux-y)
 +obj-$(CONFIG_GPIOLIB)			+= $(pinmux-y)
+ obj-$(CONFIG_HAVE_HW_BREAKPOINT)	+= ubc.o
diff --cc drivers/tty/serial/sh-sci.c
index 5377502,e3847cc..d262c1f
--- a/drivers/tty/serial/sh-sci.c
+++ b/drivers/tty/serial/sh-sci.c
@@@ -2481,9 -2502,20 +2588,20 @@@ static int sci_probe(struct platform_de
  	if (is_early_platform_device(dev))
  		return sci_probe_earlyprintk(dev);
  
+ 	if (dev->dev.of_node)
+ 		p = sci_parse_dt(dev, &dev_id);
+ 	else
 -		p = dev->dev.platform_data;
++		p = dev_get_platdata(&dev->dev);
+ 
+ 	if (!p) {
+ 		dev_err(&dev->dev, "no setup data supplied\n");
+ 		return -EINVAL;
+ 	}
+ 
+ 	sp = &sci_ports[dev_id];
  	platform_set_drvdata(dev, sp);
  
- 	ret = sci_probe_single(dev, dev->id, p, sp);
+ 	ret = sci_probe_single(dev, dev_id, p, sp);
  	if (ret)
  		return ret;
  
diff --cc include/linux/serial_sci.h
index 50fe651,857eec4..3dbdf7e
--- a/include/linux/serial_sci.h
+++ b/include/linux/serial_sci.h
@@@ -16,7 -18,8 +18,9 @@@ enum 
  	SCBRR_ALGO_3,		/* (((clk * 2) + 16 * bps) / (16 * bps) - 1) */
  	SCBRR_ALGO_4,		/* (((clk * 2) + 16 * bps) / (32 * bps) - 1) */
  	SCBRR_ALGO_5,		/* (((clk * 1000 / 32) / bps) - 1) */
 +	SCBRR_ALGO_6,		/* HSCIF variable sample rate algorithm */
+ 
+ 	SCBRR_NR_ALGOS,
  };
  
  #define SCSCR_TIE	(1 << 7)

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the tip tree
  2013-09-30 11:26 linux-next: manual merge of the bcon tree Thierry Reding
                   ` (6 preceding siblings ...)
  2013-09-30 11:26 ` linux-next: manual merge of the sh tree Thierry Reding
@ 2013-09-30 11:26 ` Thierry Reding
  2013-09-30 11:26 ` linux-next: manual merge of the vfs tree Thierry Reding
  2013-09-30 11:26 ` linux-next: manual merge of the wireless-next tree Thierry Reding
  9 siblings, 0 replies; 46+ messages in thread
From: Thierry Reding @ 2013-09-30 11:26 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar, H. Peter Anvin
  Cc: x86, linux-next, linux-kernel

Today's linux-next merge of the tip tree got conflicts in

	arch/h8300/include/asm/Kbuild

I just removed the file.

Thanks,
Thierry

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the vfs tree
  2013-09-30 11:26 linux-next: manual merge of the bcon tree Thierry Reding
                   ` (7 preceding siblings ...)
  2013-09-30 11:26 ` linux-next: manual merge of the tip tree Thierry Reding
@ 2013-09-30 11:26 ` Thierry Reding
  2013-09-30 11:26 ` linux-next: manual merge of the wireless-next tree Thierry Reding
  9 siblings, 0 replies; 46+ messages in thread
From: Thierry Reding @ 2013-09-30 11:26 UTC (permalink / raw)
  To: Alexander Viro; +Cc: linux-fsdevel, linux-next, linux-kernel

Today's linux-next merge of the vfs tree got conflicts in

	fs/nfs/direct.c
	fs/nfs/file.c

I fixed them up (see below). Please check if the resolution looks correct.

Thanks,
Thierry
---
diff --cc fs/nfs/direct.c
index 239c2fe,d71d66c..e83817c
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@@ -118,18 -117,26 +118,17 @@@ static inline int put_dreq(struct nfs_d
   * @nr_segs: size of iovec array
   *
   * The presence of this routine in the address space ops vector means
 - * the NFS client supports direct I/O. However, for most direct IO, we
 - * shunt off direct read and write requests before the VFS gets them,
 - * so this method is only ever called for swap.
 + * the NFS client supports direct I/O. However, we shunt off direct
 + * read and write requests before the VFS gets them, so this method
 + * should never be called.
   */
 -ssize_t nfs_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov, loff_t pos, unsigned long nr_segs)
 +ssize_t nfs_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter,
 +		      loff_t pos)
  {
- 	dprintk("NFS: nfs_direct_IO (%s) off/no(%Ld/%lu) EINVAL\n",
- 			iocb->ki_filp->f_path.dentry->d_name.name,
- 			(long long) pos, iter->nr_segs);
 -#ifndef CONFIG_NFS_SWAP
+ 	dprintk("NFS: nfs_direct_IO (%pD) off/no(%Ld/%lu) EINVAL\n",
+ 			iocb->ki_filp, (long long) pos, nr_segs);
  
  	return -EINVAL;
 -#else
 -	VM_BUG_ON(iocb->ki_nbytes != PAGE_SIZE);
 -
 -	if (rw == READ || rw == KERNEL_READ)
 -		return nfs_file_direct_read(iocb, iov, nr_segs, pos,
 -				rw == READ ? true : false);
 -	return nfs_file_direct_write(iocb, iov, nr_segs, pos,
 -				rw == WRITE ? true : false);
 -#endif /* CONFIG_NFS_SWAP */
  }
  
  static void nfs_direct_release_pages(struct page **pages, unsigned int npages)
@@@ -1010,13 -905,11 +1009,11 @@@ ssize_t nfs_file_direct_read(struct kio
  	struct address_space *mapping = file->f_mapping;
  	size_t count;
  
 -	count = iov_length(iov, nr_segs);
 +	count = iov_iter_count(iter);
  	nfs_add_stats(mapping->host, NFSIOS_DIRECTREADBYTES, count);
  
- 	dfprintk(FILE, "NFS: direct read(%s/%s, %zd@%Ld)\n",
- 		file->f_path.dentry->d_parent->d_name.name,
- 		file->f_path.dentry->d_name.name,
- 		count, (long long) pos);
+ 	dfprintk(FILE, "NFS: direct read(%pD2, %zd@%Ld)\n",
+ 		file, count, (long long) pos);
  
  	retval = 0;
  	if (!count)
@@@ -1065,13 -959,11 +1062,11 @@@ ssize_t nfs_file_direct_write(struct ki
  	struct address_space *mapping = file->f_mapping;
  	size_t count;
  
 -	count = iov_length(iov, nr_segs);
 +	count = iov_iter_count(iter);
  	nfs_add_stats(mapping->host, NFSIOS_DIRECTWRITTENBYTES, count);
  
- 	dfprintk(FILE, "NFS: direct write(%s/%s, %zd@%Ld)\n",
- 		file->f_path.dentry->d_parent->d_name.name,
- 		file->f_path.dentry->d_name.name,
- 		count, (long long) pos);
+ 	dfprintk(FILE, "NFS: direct write(%pD2, %zd@%Ld)\n",
+ 		file, count, (long long) pos);
  
  	retval = generic_write_checks(file, &pos, &count, 0);
  	if (retval)
diff --cc fs/nfs/file.c
index 19ac4fd,e2fcacf..cb66d5f
--- a/fs/nfs/file.c
+++ b/fs/nfs/file.c
@@@ -174,18 -165,18 +165,17 @@@ nfs_file_flush(struct file *file, fl_ow
  EXPORT_SYMBOL_GPL(nfs_file_flush);
  
  ssize_t
 -nfs_file_read(struct kiocb *iocb, const struct iovec *iov,
 -		unsigned long nr_segs, loff_t pos)
 +nfs_file_read_iter(struct kiocb *iocb, struct iov_iter *iter, loff_t pos)
  {
- 	struct dentry * dentry = iocb->ki_filp->f_path.dentry;
- 	struct inode * inode = dentry->d_inode;
+ 	struct inode *inode = file_inode(iocb->ki_filp);
  	ssize_t result;
  
  	if (iocb->ki_filp->f_flags & O_DIRECT)
 -		return nfs_file_direct_read(iocb, iov, nr_segs, pos, true);
 +		return nfs_file_direct_read(iocb, iter, pos);
  
- 	dprintk("NFS: read_iter(%s/%s, %lu@%lu)\n",
- 		dentry->d_parent->d_name.name, dentry->d_name.name,
- 		(unsigned long) iov_iter_count(iter), (unsigned long) pos);
 -	dprintk("NFS: read(%pD2, %lu@%lu)\n",
++	dprintk("NFS: read_iter(%pD2, %lu@%lu)\n",
+ 		iocb->ki_filp,
+ 		(unsigned long) iov_length(iov, nr_segs), (unsigned long) pos);
  
  	result = nfs_revalidate_mapping(inode, iocb->ki_filp->f_mapping);
  	if (!result) {
@@@ -655,25 -634,24 +633,24 @@@ static int nfs_need_sync_write(struct f
  	return 0;
  }
  
 -ssize_t nfs_file_write(struct kiocb *iocb, const struct iovec *iov,
 -		       unsigned long nr_segs, loff_t pos)
 +ssize_t nfs_file_write_iter(struct kiocb *iocb, struct iov_iter *iter,
 +			    loff_t pos)
  {
- 	struct dentry * dentry = iocb->ki_filp->f_path.dentry;
- 	struct inode * inode = dentry->d_inode;
+ 	struct file *file = iocb->ki_filp;
+ 	struct inode *inode = file_inode(file);
  	unsigned long written = 0;
  	ssize_t result;
 -	size_t count = iov_length(iov, nr_segs);
 +	size_t count = iov_iter_count(iter);
  
- 	result = nfs_key_timeout_notify(iocb->ki_filp, inode);
+ 	result = nfs_key_timeout_notify(file, inode);
  	if (result)
  		return result;
  
- 	if (iocb->ki_filp->f_flags & O_DIRECT)
+ 	if (file->f_flags & O_DIRECT)
 -		return nfs_file_direct_write(iocb, iov, nr_segs, pos, true);
 +		return nfs_file_direct_write(iocb, iter, pos);
  
- 	dprintk("NFS: write_iter(%s/%s, %lu@%lld)\n",
- 		dentry->d_parent->d_name.name, dentry->d_name.name,
- 		(unsigned long) count, (long long) pos);
 -	dprintk("NFS: write(%pD2, %lu@%Ld)\n",
++	dprintk("NFS: write_iter(%pD2, %lu@%Ld)\n",
+ 		file, (unsigned long) count, (long long) pos);
  
  	result = -EBUSY;
  	if (IS_SWAPFILE(inode))

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the wireless-next tree
  2013-09-30 11:26 linux-next: manual merge of the bcon tree Thierry Reding
                   ` (8 preceding siblings ...)
  2013-09-30 11:26 ` linux-next: manual merge of the vfs tree Thierry Reding
@ 2013-09-30 11:26 ` Thierry Reding
  2013-09-30 14:26   ` Larry Finger
  9 siblings, 1 reply; 46+ messages in thread
From: Thierry Reding @ 2013-09-30 11:26 UTC (permalink / raw)
  To: John W. Linville; +Cc: linux-wireless, linux-next, linux-kernel

Today's linux-next merge of the wireless-next tree got conflicts in

	drivers/net/wireless/rtlwifi/rtl8192ce/phy.h

I fixed it up (see below). Please check if the resolution looks correct.

Thanks,
Thierry
---
diff --cc drivers/net/wireless/rtlwifi/rtl8192ce/phy.h
index f8973e5,80a0893..bb319b0
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.h
@@@ -217,10 -222,10 +215,9 @@@ void _rtl92ce_phy_lc_calibrate(struct i
  void rtl92c_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain);
  bool rtl92c_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
  					  enum radio_path rfpath);
 -bool rtl8192_phy_check_is_legal_rfpath(struct ieee80211_hw *hw,
 -					      u32 rfpath);
 +bool rtl8192_phy_check_is_legal_rfpath(struct ieee80211_hw *hw, u32 rfpath);
- bool rtl92c_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype);
  bool rtl92ce_phy_set_rf_power_state(struct ieee80211_hw *hw,
 -					  enum rf_pwrstate rfpwr_state);
 +				    enum rf_pwrstate rfpwr_state);
  void rtl92ce_phy_set_rf_on(struct ieee80211_hw *hw);
  bool rtl92c_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype);
  void rtl92c_phy_set_io(struct ieee80211_hw *hw);

^ permalink raw reply	[flat|nested] 46+ messages in thread

* Re: linux-next: manual merge of the drm-intel tree
  2013-09-30 11:26 ` linux-next: manual merge of the drm-intel tree Thierry Reding
@ 2013-09-30 11:32   ` Daniel Vetter
  0 siblings, 0 replies; 46+ messages in thread
From: Daniel Vetter @ 2013-09-30 11:32 UTC (permalink / raw)
  To: Thierry Reding
  Cc: intel-gfx, linux-next, Linux Kernel Mailing List, dri-devel

On Mon, Sep 30, 2013 at 1:26 PM, Thierry Reding
<thierry.reding@gmail.com> wrote:
> Today's linux-next merge of the drm-intel tree got conflicts in
>
>         drivers/gpu/drm/i915/intel_display.c
>
> I fixed it up (see below). Please check if the resolution looks correct.

Looks good.
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch

^ permalink raw reply	[flat|nested] 46+ messages in thread

* Re: linux-next: manual merge of the wireless-next tree
  2013-09-30 11:26 ` linux-next: manual merge of the wireless-next tree Thierry Reding
@ 2013-09-30 14:26   ` Larry Finger
  0 siblings, 0 replies; 46+ messages in thread
From: Larry Finger @ 2013-09-30 14:26 UTC (permalink / raw)
  To: Thierry Reding; +Cc: John W. Linville, linux-wireless, linux-next, linux-kernel

On 09/30/2013 06:26 AM, Thierry Reding wrote:
> Today's linux-next merge of the wireless-next tree got conflicts in
>
> 	drivers/net/wireless/rtlwifi/rtl8192ce/phy.h
>
> I fixed it up (see below). Please check if the resolution looks correct.
>
> Thanks,
> Thierry
> ---
> diff --cc drivers/net/wireless/rtlwifi/rtl8192ce/phy.h
> index f8973e5,80a0893..bb319b0
> --- a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.h
> +++ b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.h
> @@@ -217,10 -222,10 +215,9 @@@ void _rtl92ce_phy_lc_calibrate(struct i
>    void rtl92c_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain);
>    bool rtl92c_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
>    					  enum radio_path rfpath);
>   -bool rtl8192_phy_check_is_legal_rfpath(struct ieee80211_hw *hw,
>   -					      u32 rfpath);
>   +bool rtl8192_phy_check_is_legal_rfpath(struct ieee80211_hw *hw, u32 rfpath);
> - bool rtl92c_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype);
>    bool rtl92ce_phy_set_rf_power_state(struct ieee80211_hw *hw,
>   -					  enum rf_pwrstate rfpwr_state);
>   +				    enum rf_pwrstate rfpwr_state);
>    void rtl92ce_phy_set_rf_on(struct ieee80211_hw *hw);
>    bool rtl92c_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype);
>    void rtl92c_phy_set_io(struct ieee80211_hw *hw);

Thierry,

Yes, your fix is correct.

Larry

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the block tree
  2013-10-25 15:03 linux-next: Tree for Oct 25 Thierry Reding
@ 2013-10-25 15:03 ` Thierry Reding
  0 siblings, 0 replies; 46+ messages in thread
From: Thierry Reding @ 2013-10-25 15:03 UTC (permalink / raw)
  To: Dave Kleikamp, Jens Axboe; +Cc: linux-next, linux-kernel

Today's linux-next tree of the block tree got conflicts in

	include/linux/blk_types.h

caused by commits 1063cee (nfs: simplify swap) and 8382f11 (block: make
rq->cmd_flags be 64-bit).

I fixed them up (see below). Please verify that the resolution looks good.

Thanks,
Thierry
---
diff --cc include/linux/blk_types.h
index 1bea25f,238ef0e..2c1c8c9
--- a/include/linux/blk_types.h
+++ b/include/linux/blk_types.h
@@@ -176,7 -176,9 +176,8 @@@ enum rq_flag_bits 
  	__REQ_FLUSH_SEQ,	/* request for flush sequence */
  	__REQ_IO_STAT,		/* account I/O stat */
  	__REQ_MIXED_MERGE,	/* merge of different types, fail separately */
 -	__REQ_KERNEL, 		/* direct IO to kernel pages */
  	__REQ_PM,		/* runtime pm request */
+ 	__REQ_END,		/* last of chain of requests */
  	__REQ_NR_BITS,		/* stops here */
  };
  
@@@ -205,27 -207,29 +206,28 @@@
  #define REQ_NOMERGE_FLAGS \
  	(REQ_NOMERGE | REQ_STARTED | REQ_SOFTBARRIER | REQ_FLUSH | REQ_FUA)
  
- #define REQ_RAHEAD		(1 << __REQ_RAHEAD)
- #define REQ_THROTTLED		(1 << __REQ_THROTTLED)
- 
- #define REQ_SORTED		(1 << __REQ_SORTED)
- #define REQ_SOFTBARRIER		(1 << __REQ_SOFTBARRIER)
- #define REQ_FUA			(1 << __REQ_FUA)
- #define REQ_NOMERGE		(1 << __REQ_NOMERGE)
- #define REQ_STARTED		(1 << __REQ_STARTED)
- #define REQ_DONTPREP		(1 << __REQ_DONTPREP)
- #define REQ_QUEUED		(1 << __REQ_QUEUED)
- #define REQ_ELVPRIV		(1 << __REQ_ELVPRIV)
- #define REQ_FAILED		(1 << __REQ_FAILED)
- #define REQ_QUIET		(1 << __REQ_QUIET)
- #define REQ_PREEMPT		(1 << __REQ_PREEMPT)
- #define REQ_ALLOCED		(1 << __REQ_ALLOCED)
- #define REQ_COPY_USER		(1 << __REQ_COPY_USER)
- #define REQ_FLUSH		(1 << __REQ_FLUSH)
- #define REQ_FLUSH_SEQ		(1 << __REQ_FLUSH_SEQ)
- #define REQ_IO_STAT		(1 << __REQ_IO_STAT)
- #define REQ_MIXED_MERGE		(1 << __REQ_MIXED_MERGE)
- #define REQ_SECURE		(1 << __REQ_SECURE)
- #define REQ_PM			(1 << __REQ_PM)
+ #define REQ_RAHEAD		(1ULL << __REQ_RAHEAD)
+ #define REQ_THROTTLED		(1ULL << __REQ_THROTTLED)
+ 
+ #define REQ_SORTED		(1ULL << __REQ_SORTED)
+ #define REQ_SOFTBARRIER		(1ULL << __REQ_SOFTBARRIER)
+ #define REQ_FUA			(1ULL << __REQ_FUA)
+ #define REQ_NOMERGE		(1ULL << __REQ_NOMERGE)
+ #define REQ_STARTED		(1ULL << __REQ_STARTED)
+ #define REQ_DONTPREP		(1ULL << __REQ_DONTPREP)
+ #define REQ_QUEUED		(1ULL << __REQ_QUEUED)
+ #define REQ_ELVPRIV		(1ULL << __REQ_ELVPRIV)
+ #define REQ_FAILED		(1ULL << __REQ_FAILED)
+ #define REQ_QUIET		(1ULL << __REQ_QUIET)
+ #define REQ_PREEMPT		(1ULL << __REQ_PREEMPT)
+ #define REQ_ALLOCED		(1ULL << __REQ_ALLOCED)
+ #define REQ_COPY_USER		(1ULL << __REQ_COPY_USER)
+ #define REQ_FLUSH		(1ULL << __REQ_FLUSH)
+ #define REQ_FLUSH_SEQ		(1ULL << __REQ_FLUSH_SEQ)
+ #define REQ_IO_STAT		(1ULL << __REQ_IO_STAT)
+ #define REQ_MIXED_MERGE		(1ULL << __REQ_MIXED_MERGE)
+ #define REQ_SECURE		(1ULL << __REQ_SECURE)
 -#define REQ_KERNEL		(1ULL << __REQ_KERNEL)
+ #define REQ_PM			(1ULL << __REQ_PM)
+ #define REQ_END			(1ULL << __REQ_END)
  
  #endif /* __LINUX_BLK_TYPES_H */

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the block tree
  2013-10-14 14:48 linux-next: Tree for Oct 14 Thierry Reding
@ 2013-10-14 14:48 ` Thierry Reding
  0 siblings, 0 replies; 46+ messages in thread
From: Thierry Reding @ 2013-10-14 14:48 UTC (permalink / raw)
  To: Kent Overstreet, Jens Axboe; +Cc: linux-next, linux-kernel

Today's linux-next merge of the block tree got conflicts in

	drivers/md/bcache/bcache.h
	drivers/md/bcache/bset.c
	drivers/md/bcache/journal.c
	drivers/md/bcache/request.c
	drivers/md/bcache/writeback.c

I've fixed them up (see below). Please verify that the resolution looks
good.

Thanks,
Thierry
---
diff --cc drivers/md/bcache/btree.c
index f42fc7e,117a12a..1ccb702
--- a/drivers/md/bcache/btree.c
+++ b/drivers/md/bcache/btree.c
@@@ -633,10 -712,10 +707,10 @@@ static unsigned long bch_mca_scan(struc
  			break;
  
  		if (++i > 3 &&
- 		    !mca_reap(b, NULL, 0)) {
+ 		    !mca_reap(b, 0, false)) {
  			mca_data_free(b);
  			rw_unlock(true, b);
 -			--nr;
 +			freed++;
  		}
  	}
  
diff --cc drivers/md/bcache/request.c
index b6a74bc,231b108..9e1ff8e
--- a/drivers/md/bcache/request.c
+++ b/drivers/md/bcache/request.c
@@@ -979,67 -1059,52 +1059,54 @@@ static void cached_dev_write(struct cac
  
  	if (should_writeback(dc, s->orig_bio,
  			     cache_mode(dc, bio),
- 			     s->op.skip)) {
- 		s->op.skip = false;
- 		s->writeback = true;
+ 			     s->iop.bypass)) {
+ 		s->iop.bypass = false;
+ 		s->iop.writeback = true;
  	}
  
- 	if (s->op.skip)
- 		goto skip;
- 
- 	trace_bcache_write(s->orig_bio, s->writeback, s->op.skip);
+ 	if (s->iop.bypass) {
+ 		s->iop.bio = s->orig_bio;
+ 		bio_get(s->iop.bio);
  
- 	if (!s->writeback) {
- 		s->op.cache_bio = bio_clone_bioset(bio, GFP_NOIO,
- 						   dc->disk.bio_split);
- 
- 		closure_bio_submit(bio, cl, s->d);
- 	} else {
+ 		if (!(bio->bi_rw & REQ_DISCARD) ||
+ 		    blk_queue_discard(bdev_get_queue(dc->bdev)))
+ 			closure_bio_submit(bio, cl, s->d);
+ 	} else if (s->iop.writeback) {
  		bch_writeback_add(dc);
 +		s->op.cache_bio = bio;
  
 -		if (s->iop.flush_journal) {
 +		if (bio->bi_rw & REQ_FLUSH) {
  			/* Also need to send a flush to the backing device */
 -			s->iop.bio = bio_clone_bioset(bio, GFP_NOIO,
 -						      dc->disk.bio_split);
 +			struct bio *flush = bio_alloc_bioset(0, GFP_NOIO,
 +							     dc->disk.bio_split);
  
 -			bio->bi_size = 0;
 -			bio->bi_vcnt = 0;
 -			closure_bio_submit(bio, cl, s->d);
 -		} else {
 -			s->iop.bio = bio;
 +			flush->bi_rw	= WRITE_FLUSH;
 +			flush->bi_bdev	= bio->bi_bdev;
 +			flush->bi_end_io = request_endio;
 +			flush->bi_private = cl;
 +
 +			closure_bio_submit(flush, cl, s->d);
  		}
- 	}
- out:
- 	closure_call(&s->op.cl, bch_insert_data, NULL, cl);
- 	continue_at(cl, cached_dev_write_complete, NULL);
- skip:
- 	s->op.skip = true;
- 	s->op.cache_bio = s->orig_bio;
- 	bio_get(s->op.cache_bio);
+ 	} else {
+ 		s->iop.bio = bio_clone_bioset(bio, GFP_NOIO,
+ 					      dc->disk.bio_split);
  
- 	if ((bio->bi_rw & REQ_DISCARD) &&
- 	    !blk_queue_discard(bdev_get_queue(dc->bdev)))
- 		goto out;
+ 		closure_bio_submit(bio, cl, s->d);
+ 	}
  
- 	closure_bio_submit(bio, cl, s->d);
- 	goto out;
+ 	closure_call(&s->iop.cl, bch_data_insert, NULL, cl);
+ 	continue_at(cl, cached_dev_write_complete, NULL);
  }
  
- static void request_nodata(struct cached_dev *dc, struct search *s)
+ static void cached_dev_nodata(struct closure *cl)
  {
- 	struct closure *cl = &s->cl;
+ 	struct search *s = container_of(cl, struct search, cl);
  	struct bio *bio = &s->bio.bio;
  
- 	if (bio->bi_rw & REQ_DISCARD) {
- 		request_write(dc, s);
- 		return;
- 	}
- 
- 	if (s->op.flush_journal)
- 		bch_journal_meta(s->op.c, cl);
+ 	if (s->iop.flush_journal)
+ 		bch_journal_meta(s->iop.c, cl);
  
+ 	/* If it's a flush, we send the flush to the backing device too */
  	closure_bio_submit(bio, cl, s->d);
  
  	continue_at(cl, cached_dev_bio_complete, NULL);

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the block tree
@ 2013-10-11 19:04 Mark Brown
  0 siblings, 0 replies; 46+ messages in thread
From: Mark Brown @ 2013-10-11 19:04 UTC (permalink / raw)
  To: Jens Axboe, Kent Overstreet; +Cc: linux-next, linux-kernel, Thierry Reding

[-- Attachment #1: Type: text/plain, Size: 3306 bytes --]

Today's linux-next merge of the block tree got additional conflicts due to
interaction between dd879364 (bcache: Break up struct search) and
c0f04d88 (bcache: Fix flushes in writeback mode) in Linus' tree.

I fixed it up (see below) and can carry as required. Please check if the
resolution looks correct.

diff --cc drivers/md/bcache/request.c
index b6a74bc,231b108..0000000
--- a/drivers/md/bcache/request.c
+++ b/drivers/md/bcache/request.c
@@@ -979,67 -1059,52 +1059,53 @@@ static void cached_dev_write(struct cac
  
  	if (should_writeback(dc, s->orig_bio,
  			     cache_mode(dc, bio),
- 			     s->op.skip)) {
- 		s->op.skip = false;
- 		s->writeback = true;
+ 			     s->iop.bypass)) {
+ 		s->iop.bypass = false;
+ 		s->iop.writeback = true;
  	}
  
- 	if (s->op.skip)
- 		goto skip;
- 
- 	trace_bcache_write(s->orig_bio, s->writeback, s->op.skip);
+ 	if (s->iop.bypass) {
+ 		s->iop.bio = s->orig_bio;
+ 		bio_get(s->iop.bio);
  
- 	if (!s->writeback) {
- 		s->op.cache_bio = bio_clone_bioset(bio, GFP_NOIO,
- 						   dc->disk.bio_split);
- 
- 		closure_bio_submit(bio, cl, s->d);
- 	} else {
+ 		if (!(bio->bi_rw & REQ_DISCARD) ||
+ 		    blk_queue_discard(bdev_get_queue(dc->bdev)))
+ 			closure_bio_submit(bio, cl, s->d);
+ 	} else if (s->iop.writeback) {
  		bch_writeback_add(dc);
- 		s->op.cache_bio = bio;
  
 -		if (s->iop.flush_journal) {
 +		if (bio->bi_rw & REQ_FLUSH) {
  			/* Also need to send a flush to the backing device */
 -			s->iop.bio = bio_clone_bioset(bio, GFP_NOIO,
 -						      dc->disk.bio_split);
 +			struct bio *flush = bio_alloc_bioset(0, GFP_NOIO,
 +							     dc->disk.bio_split);
  
 -			bio->bi_size = 0;
 -			bio->bi_vcnt = 0;
 -			closure_bio_submit(bio, cl, s->d);
 -		} else {
 -			s->iop.bio = bio;
 +			flush->bi_rw	= WRITE_FLUSH;
 +			flush->bi_bdev	= bio->bi_bdev;
 +			flush->bi_end_io = request_endio;
 +			flush->bi_private = cl;
 +
 +			closure_bio_submit(flush, cl, s->d);
  		}
- 	}
- out:
- 	closure_call(&s->op.cl, bch_insert_data, NULL, cl);
- 	continue_at(cl, cached_dev_write_complete, NULL);
- skip:
- 	s->op.skip = true;
- 	s->op.cache_bio = s->orig_bio;
- 	bio_get(s->op.cache_bio);
+ 	} else {
+ 		s->iop.bio = bio_clone_bioset(bio, GFP_NOIO,
+ 					      dc->disk.bio_split);
  
- 	if ((bio->bi_rw & REQ_DISCARD) &&
- 	    !blk_queue_discard(bdev_get_queue(dc->bdev)))
- 		goto out;
+ 		closure_bio_submit(bio, cl, s->d);
+ 	}
  
- 	closure_bio_submit(bio, cl, s->d);
- 	goto out;
+ 	closure_call(&s->iop.cl, bch_data_insert, NULL, cl);
+ 	continue_at(cl, cached_dev_write_complete, NULL);
  }
  
- static void request_nodata(struct cached_dev *dc, struct search *s)
+ static void cached_dev_nodata(struct closure *cl)
  {
- 	struct closure *cl = &s->cl;
+ 	struct search *s = container_of(cl, struct search, cl);
  	struct bio *bio = &s->bio.bio;
  
- 	if (bio->bi_rw & REQ_DISCARD) {
- 		request_write(dc, s);
- 		return;
- 	}
- 
- 	if (s->op.flush_journal)
- 		bch_journal_meta(s->op.c, cl);
+ 	if (s->iop.flush_journal)
+ 		bch_journal_meta(s->iop.c, cl);
  
+ 	/* If it's a flush, we send the flush to the backing device too */
  	closure_bio_submit(bio, cl, s->d);
  
  	continue_at(cl, cached_dev_bio_complete, NULL);

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the block tree
  2013-10-01 11:03 linux-next: Tree for Oct 1 Thierry Reding
@ 2013-10-01 11:07 ` Thierry Reding
  0 siblings, 0 replies; 46+ messages in thread
From: Thierry Reding @ 2013-10-01 11:07 UTC (permalink / raw)
  To: Jens Axboe, Kent Overstreet; +Cc: linux-next, linux-kernel

Today's linux-next merge of the block tree got conflicts in:

	drivers/md/bcache/bcache.h
	drivers/md/bcache/bset.c
	drivers/md/bcache/journal.c
	drivers/md/bcache/request.c
	drivers/md/bcache/writeback.c

I fixed it up (see below). Please check if the resolution looks correct.

Thanks,
Thierry
---
diff --cc drivers/md/bcache/btree.c
index f42fc7e,117a12a..1ccb702
--- a/drivers/md/bcache/btree.c
+++ b/drivers/md/bcache/btree.c
@@@ -633,10 -712,10 +707,10 @@@ static unsigned long bch_mca_scan(struc
  			break;
  
  		if (++i > 3 &&
- 		    !mca_reap(b, NULL, 0)) {
+ 		    !mca_reap(b, 0, false)) {
  			mca_data_free(b);
  			rw_unlock(true, b);
 -			--nr;
 +			freed++;
  		}
  	}
  
diff --cc drivers/md/bcache/request.c
index 71eb233,231b108..49ee1cf
--- a/drivers/md/bcache/request.c
+++ b/drivers/md/bcache/request.c
@@@ -979,68 -1059,52 +1059,55 @@@ static void cached_dev_write(struct cac
  
  	if (should_writeback(dc, s->orig_bio,
  			     cache_mode(dc, bio),
- 			     s->op.skip)) {
- 		s->op.skip = false;
- 		s->writeback = true;
+ 			     s->iop.bypass)) {
+ 		s->iop.bypass = false;
+ 		s->iop.writeback = true;
  	}
  
- 	if (s->op.skip)
- 		goto skip;
- 
- 	trace_bcache_write(s->orig_bio, s->writeback, s->op.skip);
+ 	if (s->iop.bypass) {
+ 		s->iop.bio = s->orig_bio;
+ 		bio_get(s->iop.bio);
  
- 	if (!s->writeback) {
- 		s->op.cache_bio = bio_clone_bioset(bio, GFP_NOIO,
- 						   dc->disk.bio_split);
- 
- 		closure_bio_submit(bio, cl, s->d);
- 	} else {
+ 		if (!(bio->bi_rw & REQ_DISCARD) ||
+ 		    blk_queue_discard(bdev_get_queue(dc->bdev)))
+ 			closure_bio_submit(bio, cl, s->d);
+ 	} else if (s->iop.writeback) {
  		bch_writeback_add(dc);
  
 -		if (s->iop.flush_journal) {
 +		if (bio->bi_rw & REQ_FLUSH) {
  			/* Also need to send a flush to the backing device */
 -			s->iop.bio = bio_clone_bioset(bio, GFP_NOIO,
 -						      dc->disk.bio_split);
 +			struct bio *flush = bio_alloc_bioset(0, GFP_NOIO,
 +							     dc->disk.bio_split);
  
 -			bio->bi_size = 0;
 -			bio->bi_vcnt = 0;
 -			closure_bio_submit(bio, cl, s->d);
 +			flush->bi_rw	= WRITE_FLUSH;
 +			flush->bi_bdev	= bio->bi_bdev;
 +			flush->bi_end_io = request_endio;
 +			flush->bi_private = cl;
 +
 +			closure_bio_submit(flush, cl, s->d);
  		} else {
- 			s->op.cache_bio = bio;
+ 			s->iop.bio = bio;
  		}
- 	}
- out:
- 	closure_call(&s->op.cl, bch_insert_data, NULL, cl);
- 	continue_at(cl, cached_dev_write_complete, NULL);
- skip:
- 	s->op.skip = true;
- 	s->op.cache_bio = s->orig_bio;
- 	bio_get(s->op.cache_bio);
+ 	} else {
+ 		s->iop.bio = bio_clone_bioset(bio, GFP_NOIO,
+ 					      dc->disk.bio_split);
  
- 	if ((bio->bi_rw & REQ_DISCARD) &&
- 	    !blk_queue_discard(bdev_get_queue(dc->bdev)))
- 		goto out;
+ 		closure_bio_submit(bio, cl, s->d);
+ 	}
  
- 	closure_bio_submit(bio, cl, s->d);
- 	goto out;
+ 	closure_call(&s->iop.cl, bch_data_insert, NULL, cl);
+ 	continue_at(cl, cached_dev_write_complete, NULL);
  }
  
- static void request_nodata(struct cached_dev *dc, struct search *s)
+ static void cached_dev_nodata(struct closure *cl)
  {
- 	struct closure *cl = &s->cl;
+ 	struct search *s = container_of(cl, struct search, cl);
  	struct bio *bio = &s->bio.bio;
  
- 	if (bio->bi_rw & REQ_DISCARD) {
- 		request_write(dc, s);
- 		return;
- 	}
- 
- 	if (s->op.flush_journal)
- 		bch_journal_meta(s->op.c, cl);
+ 	if (s->iop.flush_journal)
+ 		bch_journal_meta(s->iop.c, cl);
  
+ 	/* If it's a flush, we send the flush to the backing device too */
  	closure_bio_submit(bio, cl, s->d);
  
  	continue_at(cl, cached_dev_bio_complete, NULL);

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the block tree
@ 2008-12-15  7:08 Stephen Rothwell
  0 siblings, 0 replies; 46+ messages in thread
From: Stephen Rothwell @ 2008-12-15  7:08 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-next, Ingo Molnar

Hi Jens,

Today's linux-next merge of the block tree got a conflict in fs/bio.c
between commit 0bfc24559d7945506184d86739fe365a181f06b7 ("blktrace: port
to tracepoints, update") from the ftrace tree and commit
18e08407d87bed3a9c4205e53bb16fe36088a521 ("bio: allow individual slabs in
the bio_set") from the block tree.

Just an overlapping addition/removal.  I fixed it up (see below) and can
carry the fix as necessary.
-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

diff --cc fs/bio.c
index df99c88,3bd633d..0000000
--- a/fs/bio.c
+++ b/fs/bio.c
@@@ -26,12 -26,13 +26,16 @@@
  #include <linux/mempool.h>
  #include <linux/workqueue.h>
  #include <linux/blktrace_api.h>
 +#include <trace/block.h>
  #include <scsi/sg.h>		/* for struct sg_iovec */
  
 +DEFINE_TRACE(block_split);
 +
- static struct kmem_cache *bio_slab __read_mostly;
+ /*
+  * Test patch to inline a certain number of bi_io_vec's inside the bio
+  * itself, to shrink a bio data allocation from two mempool calls to one
+  */
+ #define BIO_INLINE_VECS		4
  
  static mempool_t *bio_split_pool __read_mostly;
  

^ permalink raw reply	[flat|nested] 46+ messages in thread

* Re: linux-next: manual merge of the block tree
  2008-11-19  9:14 ` Jens Axboe
@ 2008-11-19  9:32   ` Stephen Rothwell
  0 siblings, 0 replies; 46+ messages in thread
From: Stephen Rothwell @ 2008-11-19  9:32 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-next, Zhaolei, Fernando Luis Vázquez Cao

[-- Attachment #1: Type: text/plain, Size: 276 bytes --]

Hi Jens,

On Wed, 19 Nov 2008 10:14:48 +0100 Jens Axboe <jens.axboe@oracle.com> wrote:
>
> Just noticed that myself as well, will update for-next now.

Thanks.

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 46+ messages in thread

* Re: linux-next: manual merge of the block tree
  2008-11-19  3:21 Stephen Rothwell
@ 2008-11-19  9:14 ` Jens Axboe
  2008-11-19  9:32   ` Stephen Rothwell
  0 siblings, 1 reply; 46+ messages in thread
From: Jens Axboe @ 2008-11-19  9:14 UTC (permalink / raw)
  To: Stephen Rothwell; +Cc: linux-next, Zhaolei, Fernando Luis Vázquez Cao

On Wed, Nov 19 2008, Stephen Rothwell wrote:
> Hi Jens,
> 
> Today's linux-next merge of the block tree got a conflict in
> drivers/block/xen-blkfront.c between commit
> 68aee07f9bad2c830a898cf6d6bfc11ea24efc40 ("Release old elevator on change
> elevator") from Linus' tree and commit
> f7ed11048c85660828fa2017ea2e3da27235f76a ("xen-blkfront: set queue
> paravirt flag") from the block tree.
> 
> I used the version from the block tree and will carry this fix for a
> while but assume that you will fix the conflict in the block tree soon.

Just noticed that myself as well, will update for-next now.

-- 
Jens Axboe

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the block tree
@ 2008-11-19  3:21 Stephen Rothwell
  2008-11-19  9:14 ` Jens Axboe
  0 siblings, 1 reply; 46+ messages in thread
From: Stephen Rothwell @ 2008-11-19  3:21 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-next, Zhaolei, Fernando Luis Vázquez Cao

[-- Attachment #1: Type: text/plain, Size: 592 bytes --]

Hi Jens,

Today's linux-next merge of the block tree got a conflict in
drivers/block/xen-blkfront.c between commit
68aee07f9bad2c830a898cf6d6bfc11ea24efc40 ("Release old elevator on change
elevator") from Linus' tree and commit
f7ed11048c85660828fa2017ea2e3da27235f76a ("xen-blkfront: set queue
paravirt flag") from the block tree.

I used the version from the block tree and will carry this fix for a
while but assume that you will fix the conflict in the block tree soon.
-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 46+ messages in thread

* Re: linux-next: manual merge of the block tree
  2008-11-07  9:50 ` Jens Axboe
@ 2008-11-07 10:07   ` Stephen Rothwell
  0 siblings, 0 replies; 46+ messages in thread
From: Stephen Rothwell @ 2008-11-07 10:07 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-next, Tejun Heo, Arnaldo Carvalho de Melo

[-- Attachment #1: Type: text/plain, Size: 360 bytes --]

Hi Jens,

On Fri, 7 Nov 2008 10:50:08 +0100 Jens Axboe <jens.axboe@oracle.com> wrote:
>
> Both of these merge errors will go away very shortly, since I'll rebase
> for-next on master again due to the recent merge.

Thanks, I expected as much.

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 46+ messages in thread

* Re: linux-next: manual merge of the block tree
  2008-11-07  6:10 Stephen Rothwell
@ 2008-11-07  9:50 ` Jens Axboe
  2008-11-07 10:07   ` Stephen Rothwell
  0 siblings, 1 reply; 46+ messages in thread
From: Jens Axboe @ 2008-11-07  9:50 UTC (permalink / raw)
  To: Stephen Rothwell; +Cc: linux-next, Tejun Heo, Arnaldo Carvalho de Melo

On Fri, Nov 07 2008, Stephen Rothwell wrote:
> Hi Jens,
> 
> Today's linux-next merge of the block tree got a conflict in
> block/elevator.c between commit 2920ebbd65f3e80c318adf5191ac0987142bda80
> ("block: add timer on blkdev_dequeue_request() not elv_next_request()")
> from Linus' tree and commit 8b3806453dd25d15a7ca7d537124af14ba8546bc
> ("blktrace: port to tracepoints") from the block tree.
> 
> Just a context change.  I fixed it up (see below) and assume it will be
> fixed in your tree soon.

Both of these merge errors will go away very shortly, since I'll rebase
for-next on master again due to the recent merge.

-- 
Jens Axboe

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the block tree
@ 2008-11-07  6:14 Stephen Rothwell
  0 siblings, 0 replies; 46+ messages in thread
From: Stephen Rothwell @ 2008-11-07  6:14 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-next, Alan Stern

Hi Jens,

Today's linux-next merge of the block tree got a conflict in
block/blk-timeout.c between commit
7838c15b8dd18e78a523513749e5b54bda07b0cb ("Block: use round_jiffies_up
()") from Linus' tree and commit 514054ea03191f529c6783bc0048e173e5194a27
("block: optimizations in blk_rq_timed_out_timer()") from the block tree.

Just a context change.  I fixed it up (see below) and assume it will be
fixed in your tree shortly.

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

diff --cc block/blk-timeout.c
index 69185ea,151790e..0000000
--- a/block/blk-timeout.c
+++ b/block/blk-timeout.c
@@@ -126,16 -133,19 +126,19 @@@ void blk_rq_timed_out_timer(unsigned lo
  			if (blk_mark_rq_complete(rq))
  				continue;
  			blk_rq_timed_out(rq);
+ 		} else {
+ 			if (!next || time_after(next, rq->deadline))
+ 				next = rq->deadline;
  		}
- 		if (!next_set) {
- 			next = rq->deadline;
- 			next_set = 1;
- 		} else if (time_after(next, rq->deadline))
- 			next = rq->deadline;
  	}
  
- 	if (next_set && !list_empty(&q->timeout_list))
+ 	/*
+ 	 * next can never be 0 here with the list non-empty, since we always
+ 	 * bump ->deadline to 1 so we can detect if the timer was ever added or not.
+ 	 * See comment in blk_add_timer()
+ 	 */
+ 	if (next)
 -		mod_timer(&q->timeout, round_jiffies(next));
 +		mod_timer(&q->timeout, round_jiffies_up(next));
  
  	spin_unlock_irqrestore(q->queue_lock, flags);
  }

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the block tree
@ 2008-11-07  6:10 Stephen Rothwell
  2008-11-07  9:50 ` Jens Axboe
  0 siblings, 1 reply; 46+ messages in thread
From: Stephen Rothwell @ 2008-11-07  6:10 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-next, Tejun Heo, Arnaldo Carvalho de Melo

Hi Jens,

Today's linux-next merge of the block tree got a conflict in
block/elevator.c between commit 2920ebbd65f3e80c318adf5191ac0987142bda80
("block: add timer on blkdev_dequeue_request() not elv_next_request()")
from Linus' tree and commit 8b3806453dd25d15a7ca7d537124af14ba8546bc
("blktrace: port to tracepoints") from the block tree.

Just a context change.  I fixed it up (see below) and assume it will be
fixed in your tree soon.

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

diff --cc block/elevator.c
index 9ac82dd,e09183b..0000000
--- a/block/elevator.c
+++ b/block/elevator.c
@@@ -772,7 -787,13 +787,7 @@@ struct request *elv_next_request(struc
  			 * not be passed by new incoming requests
  			 */
  			rq->cmd_flags |= REQ_STARTED;
- 			blk_add_trace_rq(q, rq, BLK_TA_ISSUE);
+ 			trace_block_rq_issue(q, rq);
 -
 -			/*
 -			 * We are now handing the request to the hardware,
 -			 * add the timeout handler
 -			 */
 -			blk_add_timer(rq);
  		}
  
  		if (!q->boundary_rq || q->boundary_rq == rq) {

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the block tree
@ 2008-10-15  7:40 Stephen Rothwell
  0 siblings, 0 replies; 46+ messages in thread
From: Stephen Rothwell @ 2008-10-15  7:40 UTC (permalink / raw)
  To: Jens Axboe
  Cc: linux-next, Alexey Dobriyan, David S. Miller, Ingo Molnar, Andrew Morton

[-- Attachment #1: Type: text/plain, Size: 579 bytes --]

Hi Jens,

Today's linux-next merge of the block tree got conflicts in
include/linux/interrupt.h and kernel/softirq.c between commit
978b0116cd225682a29e3d1d5010319bf2de32c2 ("softirq: allocate less
vectors") from the tip-core tree and commit
c065c007d92de6ed071c9939bd1982d3a35ebd0f ("softirq: Define and use
NR_SOFTIRQ") from the block tree.

These two commits seem to do the same thing.  I have used the latter as
other things in the block tree depend on it.
-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 46+ messages in thread

* Re: linux-next: manual merge of the block tree
  2008-09-05  6:22 ` Jens Axboe
@ 2008-09-05 13:58   ` James Bottomley
  0 siblings, 0 replies; 46+ messages in thread
From: James Bottomley @ 2008-09-05 13:58 UTC (permalink / raw)
  To: Jens Axboe; +Cc: Stephen Rothwell, linux-next, David Woodhouse, Mike Christie

On Fri, 2008-09-05 at 08:22 +0200, Jens Axboe wrote:
> On Fri, Sep 05 2008, Stephen Rothwell wrote:
> > Hi Jens,
> > 
> > Today's linux-next merge of the block tree got a conflict in
> > include/linux/bio.h and include/linux/blkdev.h between commit
> > 81449f3f2013d92ec3bcb9d2c1877ce3140d2271 ("[SCSI] block: separate
> > failfast into multiple bits") from the scsi tree and commit
> > 5d112a624058caabe5b570d2c9827bce82c18be1 ("Add 'discard' request
> > handling") from the block tree.
> > 
> > Overlapping changes/additions to some bit definitions.  I have fixed it
> > up as best I can (see below) and can carry the fix.
> 
> James, would it not have been a lot better to carry the block bits in
> the block tree instead??

They're only a tiny piece of all of this ... and without them, my SCSI
tree won't compile.  I'll separate them into a post merge tree again to
resolve the conflicts.

However, this time, I really need linux-next to work out how it handles
post merge trees ... this will be the third time I've asked.

James

^ permalink raw reply	[flat|nested] 46+ messages in thread

* Re: linux-next: manual merge of the block tree
  2008-09-05  6:12 Stephen Rothwell
@ 2008-09-05  6:22 ` Jens Axboe
  2008-09-05 13:58   ` James Bottomley
  0 siblings, 1 reply; 46+ messages in thread
From: Jens Axboe @ 2008-09-05  6:22 UTC (permalink / raw)
  To: Stephen Rothwell
  Cc: linux-next, David Woodhouse, Mike Christie, James Bottomley

On Fri, Sep 05 2008, Stephen Rothwell wrote:
> Hi Jens,
> 
> Today's linux-next merge of the block tree got a conflict in
> include/linux/bio.h and include/linux/blkdev.h between commit
> 81449f3f2013d92ec3bcb9d2c1877ce3140d2271 ("[SCSI] block: separate
> failfast into multiple bits") from the scsi tree and commit
> 5d112a624058caabe5b570d2c9827bce82c18be1 ("Add 'discard' request
> handling") from the block tree.
> 
> Overlapping changes/additions to some bit definitions.  I have fixed it
> up as best I can (see below) and can carry the fix.

James, would it not have been a lot better to carry the block bits in
the block tree instead??

-- 
Jens Axboe

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the block tree
@ 2008-09-05  6:12 Stephen Rothwell
  2008-09-05  6:22 ` Jens Axboe
  0 siblings, 1 reply; 46+ messages in thread
From: Stephen Rothwell @ 2008-09-05  6:12 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-next, David Woodhouse, Mike Christie, James Bottomley

Hi Jens,

Today's linux-next merge of the block tree got a conflict in
include/linux/bio.h and include/linux/blkdev.h between commit
81449f3f2013d92ec3bcb9d2c1877ce3140d2271 ("[SCSI] block: separate
failfast into multiple bits") from the scsi tree and commit
5d112a624058caabe5b570d2c9827bce82c18be1 ("Add 'discard' request
handling") from the block tree.

Overlapping changes/additions to some bit definitions.  I have fixed it
up as best I can (see below) and can carry the fix.
-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

diff --cc include/linux/bio.h
index 425a4ec,7af373f..0000000
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@@ -147,20 -125,18 +125,22 @@@ struct bio 
   * bit 0 -- read (not set) or write (set)
   * bit 1 -- rw-ahead when set
   * bit 2 -- barrier
 - * bit 3 -- fail fast, don't want low level driver retries
 - * bit 4 -- synchronous I/O hint: the block layer will unplug immediately
 - * bit 5 -- metadata request
 - * bit 6 -- discard sectors
 + * bit 3 -- synchronous I/O hint: the block layer will unplug immediately
 + * bit 4 -- meta data
 + * bit 5 -- fail fast device errors
 + * bit 6 -- fail fast transport errors
 + * bit 7 -- fail fast driver errors
++ * bit 8 -- discard sectors
   */
- #define BIO_RW				0
- #define BIO_RW_AHEAD			1
 -#define BIO_RW		0	/* Must match RW in req flags (blkdev.h) */
 -#define BIO_RW_AHEAD	1	/* Must match FAILFAST in req flags */
 -#define BIO_RW_BARRIER	2
 -#define BIO_RW_FAILFAST	3
 -#define BIO_RW_SYNC	4
 -#define BIO_RW_META	5
 -#define BIO_RW_DISCARD	6
++#define BIO_RW				0	/* Must match RW in req flags (blkdev.h) */
++#define BIO_RW_AHEAD			1	/* Must match FAILFAST in req flags */
 +#define BIO_RW_BARRIER			2
 +#define BIO_RW_SYNC			3
 +#define BIO_RW_META			4
 +#define BIO_RW_FAILFAST_DEV		5
 +#define BIO_RW_FAILFAST_TRANSPORT	6
 +#define BIO_RW_FAILFAST_DRIVER		7
++#define BIO_RW_DISCARD			8
  
  /*
   * upper 16 bits of bi_rw define the io priority of this bio
@@@ -187,13 -163,11 +167,14 @@@
  #define bio_sectors(bio)	((bio)->bi_size >> 9)
  #define bio_barrier(bio)	((bio)->bi_rw & (1 << BIO_RW_BARRIER))
  #define bio_sync(bio)		((bio)->bi_rw & (1 << BIO_RW_SYNC))
 -#define bio_failfast(bio)	((bio)->bi_rw & (1 << BIO_RW_FAILFAST))
 +#define bio_failfast_dev(bio)	((bio)->bi_rw &	(1 << BIO_RW_FAILFAST_DEV))
 +#define bio_failfast_transport(bio)	\
 +	((bio)->bi_rw & (1 << BIO_RW_FAILFAST_TRANSPORT))
 +#define bio_failfast_driver(bio) ((bio)->bi_rw & (1 << BIO_RW_FAILFAST_DRIVER))
  #define bio_rw_ahead(bio)	((bio)->bi_rw & (1 << BIO_RW_AHEAD))
  #define bio_rw_meta(bio)	((bio)->bi_rw & (1 << BIO_RW_META))
- #define bio_empty_barrier(bio)	(bio_barrier(bio) && !(bio)->bi_size)
+ #define bio_discard(bio)	((bio)->bi_rw & (1 << BIO_RW_DISCARD))
+ #define bio_empty_barrier(bio)	(bio_barrier(bio) && !bio_has_data(bio) && !bio_discard(bio))
  
  static inline unsigned int bio_cur_sectors(struct bio *bio)
  {
diff --cc include/linux/blkdev.h
index 2d8d90c,4cd8caa..0000000
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@@ -88,9 -86,8 +86,10 @@@ enum 
   */
  enum rq_flag_bits {
  	__REQ_RW,		/* not set, read. set, write */
 -	__REQ_FAILFAST,		/* no low level driver retries */
 +	__REQ_FAILFAST_DEV,	/* no driver retries of device errors */
 +	__REQ_FAILFAST_TRANSPORT, /* no driver retries of transport errors */
 +	__REQ_FAILFAST_DRIVER,	/* no driver retries of driver errors */
+ 	__REQ_DISCARD,		/* request to discard sectors */
  	__REQ_SORTED,		/* elevator knows about this request */
  	__REQ_SOFTBARRIER,	/* may not be passed by ioscheduler */
  	__REQ_HARDBARRIER,	/* may not be passed by drive either */
@@@ -113,9 -110,8 +112,10 @@@
  };
  
  #define REQ_RW		(1 << __REQ_RW)
 +#define REQ_FAILFAST_DEV	(1 << __REQ_FAILFAST_DEV)
 +#define REQ_FAILFAST_TRANSPORT	(1 << __REQ_FAILFAST_TRANSPORT)
 +#define REQ_FAILFAST_DRIVER	(1 << __REQ_FAILFAST_DRIVER)
+ #define REQ_DISCARD	(1 << __REQ_DISCARD)
 -#define REQ_FAILFAST	(1 << __REQ_FAILFAST)
  #define REQ_SORTED	(1 << __REQ_SORTED)
  #define REQ_SOFTBARRIER	(1 << __REQ_SOFTBARRIER)
  #define REQ_HARDBARRIER	(1 << __REQ_HARDBARRIER)
@@@ -537,15 -535,10 +539,15 @@@ enum 
  #define blk_special_request(rq)	((rq)->cmd_type == REQ_TYPE_SPECIAL)
  #define blk_sense_request(rq)	((rq)->cmd_type == REQ_TYPE_SENSE)
  
 -#define blk_noretry_request(rq)	((rq)->cmd_flags & REQ_FAILFAST)
 +#define blk_failfast_dev(rq)	((rq)->cmd_flags & REQ_FAILFAST_DEV)
 +#define blk_failfast_transport(rq) ((rq)->cmd_flags & REQ_FAILFAST_TRANSPORT)
 +#define blk_failfast_driver(rq)	((rq)->cmd_flags & REQ_FAILFAST_DRIVER)
 +#define blk_noretry_request(rq)	(blk_failfast_dev(rq) ||	\
 +				 blk_failfast_transport(rq) ||	\
 +				 blk_failfast_driver(rq))
  #define blk_rq_started(rq)	((rq)->cmd_flags & REQ_STARTED)
  
- #define blk_account_rq(rq)	(blk_rq_started(rq) && blk_fs_request(rq))
+ #define blk_account_rq(rq)	(blk_rq_started(rq) && (blk_fs_request(rq) || blk_discard_rq(rq))) 
  
  #define blk_pm_suspend_request(rq)	((rq)->cmd_type == REQ_TYPE_PM_SUSPEND)
  #define blk_pm_resume_request(rq)	((rq)->cmd_type == REQ_TYPE_PM_RESUME)

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the block tree
@ 2008-09-03  5:58 Stephen Rothwell
  0 siblings, 0 replies; 46+ messages in thread
From: Stephen Rothwell @ 2008-09-03  5:58 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-next, FUJITA Tomonori, Tejun Heo

Hi Jens,

Today's linux-next merge of the block tree got a conflict in
block/cmd-filter.c between commit
bb23b431db7405f6d79f989ad0236bf6428ba1cb ("remove blk_register_filter and
blk_unregister_filter in gendisk") from Linus' tree and commit
d68103f74be7c93f36705651a2115da177308751 ("block: move holder_dir from
disk to part0") from the block tree.

Just a trivial add/removal clash.  I fixed it up (see below) and can
carry the fix while necessary.
-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

diff --cc block/cmd-filter.c
index 228b644,df450d6..0000000
--- a/block/cmd-filter.c
+++ b/block/cmd-filter.c
@@@ -230,6 -225,4 +226,5 @@@ void blk_unregister_filter(struct gendi
  	struct blk_cmd_filter *filter = &disk->queue->cmd_filter;
  
  	kobject_put(&filter->kobj);
- 	kobject_put(disk->holder_dir->parent);
  }
 +EXPORT_SYMBOL(blk_unregister_filter);

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the block tree
@ 2008-09-03  5:55 Stephen Rothwell
  0 siblings, 0 replies; 46+ messages in thread
From: Stephen Rothwell @ 2008-09-03  5:55 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-next, Tejun Heo, FUJITA Tomonori

Hi Jens,

Today's linux-next merge of the block tree got a conflicts in
block/genhd.c between commits bb23b431db7405f6d79f989ad0236bf6428ba1cb
("remove blk_register_filter and blk_unregister_filter in gendisk") and
ddef43a843f620c6742a06633739887a901ec06b ("block: restore original
behavior of /proc/partition when there's no partition") from Linus' tree
and commits 8d5ceff5828d044eeb93656093f50e6f522f9d71 ("block: implement
and use {disk|part}_to_dev()") and
f21bb156d79de8404a0e04eb311141a01b459c92 ("block: use class_dev_iterator
instead of class_for_each_device()") from the block tree.

I fixed them up (see below) and can carry the fixes while needed.
-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

diff --cc block/genhd.c
index c114a43,9c27e15..0000000
--- a/block/genhd.c
+++ b/block/genhd.c
@@@ -183,17 -484,41 +484,40 @@@ static int exact_lock(dev_t devt, void 
  void add_disk(struct gendisk *disk)
  {
  	struct backing_dev_info *bdi;
+ 	dev_t devt;
  	int retval;
  
+ 	/* minors == 0 indicates to use ext devt from part0 and should
+ 	 * be accompanied with EXT_DEVT flag.  Make sure all
+ 	 * parameters make sense.
+ 	 */
+ 	WARN_ON(disk->minors && !(disk->major || disk->first_minor));
+ 	WARN_ON(!disk->minors && !(disk->flags & GENHD_FL_EXT_DEVT));
+ 
  	disk->flags |= GENHD_FL_UP;
- 	blk_register_region(MKDEV(disk->major, disk->first_minor),
- 			    disk->minors, NULL, exact_match, exact_lock, disk);
+ 
+ 	retval = blk_alloc_devt(&disk->part0, &devt);
+ 	if (retval) {
+ 		WARN_ON(1);
+ 		return;
+ 	}
+ 	disk_to_dev(disk)->devt = devt;
+ 
+ 	/* ->major and ->first_minor aren't supposed to be
+ 	 * dereferenced from here on, but set them just in case.
+ 	 */
+ 	disk->major = MAJOR(devt);
+ 	disk->first_minor = MINOR(devt);
+ 
+ 	blk_register_region(disk_devt(disk), disk->minors, NULL,
+ 			    exact_match, exact_lock, disk);
  	register_disk(disk);
  	blk_register_queue(disk);
 -	blk_register_filter(disk);
  
  	bdi = &disk->queue->backing_dev_info;
- 	bdi_register_dev(bdi, MKDEV(disk->major, disk->first_minor));
- 	retval = sysfs_create_link(&disk->dev.kobj, &bdi->dev->kobj, "bdi");
+ 	bdi_register_dev(bdi, disk_devt(disk));
+ 	retval = sysfs_create_link(&disk_to_dev(disk)->kobj, &bdi->dev->kobj,
+ 				   "bdi");
  	WARN_ON(retval);
  }
  
@@@ -202,11 -527,11 +526,10 @@@ EXPORT_SYMBOL(del_gendisk);	/* in parti
  
  void unlink_gendisk(struct gendisk *disk)
  {
- 	sysfs_remove_link(&disk->dev.kobj, "bdi");
 -	blk_unregister_filter(disk);
+ 	sysfs_remove_link(&disk_to_dev(disk)->kobj, "bdi");
  	bdi_unregister(&disk->queue->backing_dev_info);
  	blk_unregister_queue(disk);
- 	blk_unregister_region(MKDEV(disk->major, disk->first_minor),
- 			      disk->minors);
+ 	blk_unregister_region(disk_devt(disk), disk->minors);
  }
  
  /**
@@@ -319,51 -683,37 +681,48 @@@ static void *disk_seqf_next(struct seq_
  	return NULL;
  }
  
- static int find_next(struct device *dev, void *data)
+ static void disk_seqf_stop(struct seq_file *seqf, void *v)
  {
- 	if (dev->type == &disk_type)
- 		return 1;
- 	return 0;
- }
+ 	struct class_dev_iter *iter = seqf->private;
  
- static void *part_next(struct seq_file *part, void *v, loff_t *pos)
- {
- 	struct gendisk *gp = v;
- 	struct device *dev;
- 	++*pos;
- 	dev = class_find_device(&block_class, &gp->dev, NULL, find_next);
- 	if (dev) {
- 		put_device(dev);
- 		return dev_to_disk(dev);
+ 	/* stop is called even after start failed :-( */
+ 	if (iter) {
+ 		class_dev_iter_exit(iter);
+ 		kfree(iter);
  	}
- 	return NULL;
  }
  
- static void part_stop(struct seq_file *part, void *v)
+ static void *show_partition_start(struct seq_file *seqf, loff_t *pos)
  {
- 	mutex_unlock(&block_class_lock);
+ 	static void *p;
+ 
+ 	p = disk_seqf_start(seqf, pos);
+ 	if (!IS_ERR(p) && p)
+ 		seq_puts(seqf, "major   minor   #blocks  name\n\n");
+ 	return p;
  }
  
- static int show_partition(struct seq_file *part, void *v)
+ static int show_partition(struct seq_file *seqf, void *v)
  {
  	struct gendisk *sgp = v;
- 	int n;
+ 	struct disk_part_iter piter;
+ 	struct hd_struct *part;
  	char buf[BDEVNAME_SIZE];
  
 +	/*
 +	 * Print header if start told us to do.  This is to preserve
 +	 * the original behavior of not printing header if no
 +	 * partition exists.  This hackery will be removed later with
 +	 * class iteration clean up.
 +	 */
 +	if (part->private) {
 +		seq_puts(part, "major minor  #blocks  name\n\n");
 +		part->private = NULL;
 +	}
 +
  	/* Don't show non-partitionable removeable devices or empty devices */
- 	if (!get_capacity(sgp) ||
- 			(sgp->minors == 1 && (sgp->flags & GENHD_FL_REMOVABLE)))
+ 	if (!get_capacity(sgp) || (!disk_partitionable(sgp) &&
+ 				   (sgp->flags & GENHD_FL_REMOVABLE)))
  		return 0;
  	if (sgp->flags & GENHD_FL_SUPPRESS_PARTITION_INFO)
  		return 0;

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the block tree
@ 2008-09-02  6:06 Stephen Rothwell
  0 siblings, 0 replies; 46+ messages in thread
From: Stephen Rothwell @ 2008-09-02  6:06 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-next, Ananth N Mavinakayanahalli, Tejun Heo

Hi Jens,

Today's linux-next merge of the block tree got a conflict in
lib/Kconfig.debug between commits
94a97a3018e55a27d1c29e011b3c38fee01a967f ("Move backtrace selftests to
tests/") and 0f6add4bafdbff7a822e37dec0436e2392864d9a ("Move lkdtm to
tests/") from the tests tree and the three commits dealing with
CONFIG_DEBUG_BLOCK_EXT_DEVT from the block tree.

Just overlapping adds/removes.  I fixed it up (see below) and can carry
the fix.
-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

diff --cc lib/Kconfig.debug
index f62c706,2a50e95..0000000
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@@ -572,6 -624,44 +572,28 @@@ config RCU_CPU_STAL
  
  	  Say N if you are unsure.
  
+ config DEBUG_BLOCK_EXT_DEVT
+         bool "Force extended block device numbers and spread them"
+ 	depends on DEBUG_KERNEL
+ 	depends on BLOCK
+ 	default n
+ 	help
+ 	  Conventionally, block device numbers are allocated from
+ 	  predetermined contiguous area.  However, extended block area
+ 	  may introduce non-contiguous block device numbers.  This
+ 	  option forces most block device numbers to be allocated from
+ 	  the extended space and spreads them to discover kernel or
+ 	  userland code paths which assume predetermined contiguous
+ 	  device number allocation.
+ 
+ 	  Note that turning on this debug option shuffles all the
+ 	  device numbers for all IDE and SCSI devices including libata
+ 	  ones, so root partition specified using device number
+ 	  directly (via rdev or root=MAJ:MIN) won't work anymore.
+ 	  Textual device names (root=/dev/sdXn) will continue to work.
+ 
+ 	  Say N if you are unsure.
+ 
 -config LKDTM
 -	tristate "Linux Kernel Dump Test Tool Module"
 -	depends on DEBUG_KERNEL
 -	depends on KPROBES
 -	depends on BLOCK
 -	default n
 -	help
 -	This module enables testing of the different dumping mechanisms by
 -	inducing system failures at predefined crash points.
 -	If you don't need it: say N
 -	Choose M here to compile this code as a module. The module will be
 -	called lkdtm.
 -
 -	Documentation on how to use the module can be found in
 -	drivers/misc/lkdtm.c
 -
  config FAULT_INJECTION
  	bool "Fault-injection framework"
  	depends on DEBUG_KERNEL

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the block tree
@ 2008-09-02  5:59 Stephen Rothwell
  0 siblings, 0 replies; 46+ messages in thread
From: Stephen Rothwell @ 2008-09-02  5:59 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-next, Mike Anderson, Kiyoshi Ueda, Alasdair G Kergon

Hi Jens,

Today's linux-next merge of the block tree got a conflict in
drivers/md/dm-mpath.c between commit
a51365f80fbb8b5152d1655581f93704dd989f86
("dm-mpath-remove-is_active-from-struct-dm_path") from the device-mapper
tree and commit 5ee80e583691a8d2012384d380afdff15dd28c8a ("dm: Call
blk_abort_queue on failed paths") from the block tree.

Just changes in context.  I fixed it up (see below) and can carry the
patch.
-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

diff --cc drivers/md/dm-mpath.c
index 1a62196,2e16ea9..0000000
--- a/drivers/md/dm-mpath.c
+++ b/drivers/md/dm-mpath.c
@@@ -122,8 -123,10 +124,10 @@@ static struct pgpath *alloc_pgpath(void
  {
  	struct pgpath *pgpath = kzalloc(sizeof(*pgpath), GFP_KERNEL);
  
- 	if (pgpath)
+ 	if (pgpath) {
 -		pgpath->path.is_active = 1;
 +		pgpath->is_active = 1;
+ 		INIT_WORK(&pgpath->deactivate_path, deactivate_path);
+ 	}
  
  	return pgpath;
  }

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the block tree
@ 2008-08-28  5:30 Stephen Rothwell
  0 siblings, 0 replies; 46+ messages in thread
From: Stephen Rothwell @ 2008-08-28  5:30 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-next, Tejun Heo, FUJITA Tomonori

Hi Jens,

Today's linux-next merge of the block tree got a conflict in
include/linux/genhd.h between commit
abf5439370491dd6fbb4fe1a7939680d2a9bc9d4 ("block: move cmdfilter from
gendisk to request_queue") from Linus' tree (which also exists in the
block tree) and commit 53b83963cc042f14b9773a1cee5a831799f6fd1a ("block:
make partition array dynamic") from the block tree.

It looks as though the latter patch has readded some bits that were
moved to include/linux/blkdev.h by the former patch.  I fixed it up (see
below).
-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

diff --cc include/linux/genhd.h
index be4f5e5,206cdf9..0000000
--- a/include/linux/genhd.h
+++ b/include/linux/genhd.h
@@@ -108,9 -115,27 +115,18 @@@ struct hd_struct 
  #define GENHD_FL_CD				8
  #define GENHD_FL_UP				16
  #define GENHD_FL_SUPPRESS_PARTITION_INFO	32
- #define GENHD_FL_FAIL				64
+ #define GENHD_FL_EXT_DEVT			64 /* allow extended devt */
+ 
 -#define BLK_SCSI_MAX_CMDS	(256)
 -#define BLK_SCSI_CMD_PER_LONG	(BLK_SCSI_MAX_CMDS / (sizeof(long) * 8))
 -
 -struct blk_scsi_cmd_filter {
 -	unsigned long read_ok[BLK_SCSI_CMD_PER_LONG];
 -	unsigned long write_ok[BLK_SCSI_CMD_PER_LONG];
 -	struct kobject kobj;
 -};
 -
+ struct disk_part_tbl {
+ 	struct rcu_head rcu_head;
+ 	int len;
+ 	struct hd_struct *part[];
+ };
  
  struct gendisk {
+ 	/* major, first_minor and minors are input parameters only,
+ 	 * don't use directly.  Use disk_devt() and disk_max_parts().
+ 	 */
  	int major;			/* major number of driver */
  	int first_minor;
  	int minors;                     /* maximum number of minors, =1 for

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the block tree
@ 2008-08-27  5:48 Stephen Rothwell
  0 siblings, 0 replies; 46+ messages in thread
From: Stephen Rothwell @ 2008-08-27  5:48 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-next, Tejun Heo, Bartlomiej Zolnierkiewicz

Hi Jens,

Today's linux-next merge of the block tree got a conflict in
drivers/ide/ide-disk.c between commits
be86ba965ac551f6a0e22ba0867b706a52c0c4e7 ("ide-disk: move /proc handling
to ide-disk_proc.c"), 71f28011298d2aee36ab3340572bb6b1fa9868a0
("ide-disk: move all ioctl handling to ide-disk_ioctl.c") and
2c01090494d8c4d3bc02c4a578005d44df55000c ("ide: add device flags") from
the ide tree and several commits from the block tree.

I fixed it up as best I could (see below) and will carry the fix.
-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

diff --cc drivers/ide/ide-disk.c
index 8e9191f,e6776c4..0000000
--- a/drivers/ide/ide-disk.c
+++ b/drivers/ide/ide-disk.c
@@@ -39,8 -41,20 +39,14 @@@
  #include <asm/io.h>
  #include <asm/div64.h>
  
 +#include "ide-disk.h"
 +
+ #if !defined(CONFIG_DEBUG_BLOCK_EXT_DEVT)
+ #define IDE_DISK_MINORS		(1 << PARTN_BITS)
+ #else
+ #define IDE_DISK_MINORS		0
+ #endif
+ 
 -struct ide_disk_obj {
 -	ide_drive_t	*drive;
 -	ide_driver_t	*driver;
 -	struct gendisk	*disk;
 -	struct kref	kref;
 -	unsigned int	openers;	/* protected by BKL for now */
 -};
 -
  static DEFINE_MUTEX(idedisk_ref_mutex);
  
  #define to_ide_disk(obj) container_of(obj, struct ide_disk_obj, kref)
@@@ -950,19 -1190,19 +955,20 @@@ static int ide_disk_probe(ide_drive_t *
  	drive->driver_data = idkp;
  
  	idedisk_setup(drive);
 -	if ((!drive->head || drive->head > 16) && !drive->select.b.lba) {
 +	if ((drive->dev_flags & IDE_DFLAG_LBA) == 0 &&
 +	    (drive->head == 0 || drive->head > 16)) {
  		printk(KERN_ERR "%s: INVALID GEOMETRY: %d PHYSICAL HEADS?\n",
  			drive->name, drive->head);
 -		drive->attach = 0;
 +		drive->dev_flags &= ~IDE_DFLAG_ATTACH;
  	} else
 -		drive->attach = 1;
 +		drive->dev_flags |= IDE_DFLAG_ATTACH;
  
- 	g->minors = 1 << PARTN_BITS;
+ 	g->minors = IDE_DISK_MINORS;
  	g->driverfs_dev = &drive->gendev;
+ 	g->flags |= GENHD_FL_EXT_DEVT;
 -	if (drive->removable)
 +	if (drive->dev_flags & IDE_DFLAG_REMOVABLE)
- 		g->flags = GENHD_FL_REMOVABLE;
+ 		g->flags |= GENHD_FL_REMOVABLE;
 -	set_capacity(g, idedisk_capacity(drive));
 +	set_capacity(g, ide_disk_capacity(drive));
  	g->fops = &idedisk_ops;
  	add_disk(g);
  	return 0;

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the block tree
@ 2008-08-27  5:47 Stephen Rothwell
  0 siblings, 0 replies; 46+ messages in thread
From: Stephen Rothwell @ 2008-08-27  5:47 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-next, Ananth N Mavinakayanahalli

Hi Jens,

Today's linux-next merge of the block tree got a conflict in
lib/Kconfig.debug between commits
0f6add4bafdbff7a822e37dec0436e2392864d9a ("Move lkdtm to tests/") and 94a97a3018e55a27d1c29e011b3c38fee01a967f ("Move backtrace selftests to
tests/") from the test tree and commit
3e5ba59bbab878f60b8b87004ac55a464bddc819 ("block: implement
CONFIG_DEBUG_BLOCK_EXT_DEVT") from the block tree.

Just overlapping add/removes.  I fixed it up (see below) and can carry
the fix.
-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

diff --cc lib/Kconfig.debug
index f62c706,1bc3c07..0000000
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@@ -572,6 -624,38 +572,22 @@@ config RCU_CPU_STAL
  
  	  Say N if you are unsure.
  
+ config DEBUG_BLOCK_EXT_DEVT
+         bool "Force extended block device numbers and spread them"
+ 	depends on DEBUG_KERNEL
+ 	depends on BLOCK
+ 	default y
+ 	help
+ 	  Conventionally, block device numbers are allocated from
+ 	  predetermined contiguous area.  However, extended block area
+ 	  may introduce non-contiguous block device numbers.  This
+ 	  option forces most block device numbers to be allocated from
+ 	  the extended space and spreads them to discover kernel or
+ 	  userland code paths which assume predetermined contiguous
+ 	  device number allocation.
+ 
+ 	  Say N if you are unsure.
+ 
 -config LKDTM
 -	tristate "Linux Kernel Dump Test Tool Module"
 -	depends on DEBUG_KERNEL
 -	depends on KPROBES
 -	depends on BLOCK
 -	default n
 -	help
 -	This module enables testing of the different dumping mechanisms by
 -	inducing system failures at predefined crash points.
 -	If you don't need it: say N
 -	Choose M here to compile this code as a module. The module will be
 -	called lkdtm.
 -
 -	Documentation on how to use the module can be found in
 -	drivers/misc/lkdtm.c
 -
  config FAULT_INJECTION
  	bool "Fault-injection framework"
  	depends on DEBUG_KERNEL

^ permalink raw reply	[flat|nested] 46+ messages in thread

* Re: linux-next: manual merge of the block tree
  2008-06-27 10:11         ` Ingo Molnar
@ 2008-06-27 11:21           ` Jens Axboe
  0 siblings, 0 replies; 46+ messages in thread
From: Jens Axboe @ 2008-06-27 11:21 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Stephen Rothwell, linux-next, Thomas Gleixner, H. Peter Anvin,
	the arch/x86 maintainers

On Fri, Jun 27 2008, Ingo Molnar wrote:
> 
> > Jens, i've started testing this in -tip - there are three small build 
> > fixlets in the tip/generic-ipi branch so far.
> > 
> > If you dont have these fixes already then you can pull them from:
> > 
> >  git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git generic-ipi
> 
> this config is causing trouble too:
> 
>   http://redhat.com/~mingo/misc/config-Fri_Jun_27_12_03_13_CEST_2008.bad
> 
> it gives:
> 
>   include/asm-x86/mach-default/entry_arch.h: Assembler messages:
>   include/asm-x86/mach-default/entry_arch.h:16: Error: undefined symbol `CALL_FUNCTION_SINGLE_VECTOR' in operation
> 
> the irq vector definitions got moved around in include/asm-x86, it's 
> probably an integration effect of that. Stephen will likely see such 
> problems in linux-next too.
> 
> My suggestion would be: lets work on finishing the integration in 
> tip/auto-generic-ipi-next and then offer it to Stephen once that looks 
> good in testing?

Yep agreed, that's the best way forward.

-- 
Jens Axboe

^ permalink raw reply	[flat|nested] 46+ messages in thread

* Re: linux-next: manual merge of the block tree
  2008-06-27  9:57       ` Ingo Molnar
  2008-06-27 10:11         ` Ingo Molnar
@ 2008-06-27 11:21         ` Jens Axboe
  1 sibling, 0 replies; 46+ messages in thread
From: Jens Axboe @ 2008-06-27 11:21 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Stephen Rothwell, linux-next, Thomas Gleixner, H. Peter Anvin,
	the arch/x86 maintainers

On Fri, Jun 27 2008, Ingo Molnar wrote:
> 
> * Ingo Molnar <mingo@elte.hu> wrote:
> 
> > i'll put this into tip/generic-ipi and wont put into the x86 topics 
> > towards linux-next - i just want to see the effects in practice.
> > 
> > This is the 102th -tip topic, there's space for all :-)
> 
> Jens, i've started testing this in -tip - there are three small build 
> fixlets in the tip/generic-ipi branch so far.
> 
> If you dont have these fixes already then you can pull them from:
> 
>  git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git generic-ipi

Fallout from since last I checked the entire tree I guess, thanks Ingo!

I'll just let them sit in your tree and only commit other changes to
mine, then I'll disable the ipi stuff from what Stephen pulls from my
git tree. OK?

-- 
Jens Axboe

^ permalink raw reply	[flat|nested] 46+ messages in thread

* Re: linux-next: manual merge of the block tree
  2008-06-27  9:26     ` Ingo Molnar
  2008-06-27  9:57       ` Ingo Molnar
@ 2008-06-27 11:18       ` Jens Axboe
  1 sibling, 0 replies; 46+ messages in thread
From: Jens Axboe @ 2008-06-27 11:18 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Stephen Rothwell, linux-next, Thomas Gleixner, H. Peter Anvin,
	the arch/x86 maintainers

On Fri, Jun 27 2008, Ingo Molnar wrote:
> 
> * Jens Axboe <jens.axboe@oracle.com> wrote:
> 
> > > That way we could pull it into tip/x86 and give it some testing on 
> > > the x86 side, and resolve its integration effects. Would that be 
> > > possible?
> > 
> > Currently I have two branches for this - one is generic-ipi, which 
> > contains the generic bits and all the arch conversions. The other is 
> > smp_call_function, which kills the unused argument to 
> > smp_call_function() (and friends) and on_each_cpu(). If I separate out 
> > the non-x86 archs, I'll have trouble getting it all in for 2.6.27 as 
> > I'll be on vacation as of july 5th.
> > 
> > So it's not tied in with any block bits, but it does have all archs. 
> > Even if it's a bit of a weird thing to put the whole thing into the 
> > x86 tree, I don't mind if we do that. Heck, it's in the block repo to 
> > begin with :-)
> 
> i'll put this into tip/generic-ipi and wont put into the x86 topics 
> towards linux-next - i just want to see the effects in practice.
> 
> This is the 102th -tip topic, there's space for all :-)
> 
> > So if you could pull:
> > 
> > git://git.kernel.dk/linux-2.6-block.git generic-ipi
> > 
> > and
> > 
> > git://git.kernel.dk/linux-2.6-block.git smp_call_function
> > 
> > and merge them with the x86 changes, that would be fine. It's also the 
> > place where we currently have conflicts due to 32-bit and 64-bit stuff 
> > being merged, so it would help Stephen as well.
> 
> i have an even better, brilliant plan :-)
> 
> what we could do is that we could offer an auto-generic-ipi-next 
> integration branch that to Stephen that is tip/auto-x86-next plus 
> tip/generic-ipi.
> 
> in fact i've just implemented this. You can pull the resulting 
> tip/auto-generic-ipi-next tree from:
> 
>   git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git auto-generic-ipi-next
> 
> [ note: just first raw merge and conflict resolution, not tested yet. ]
> 
> note that it embedds your tree in a Git way and we can update the 
> tip/generic-ipi branch in an append-only manner and it can go towards 
> Linus in whatever way you prefer. (as long as you do not rebase the 
> tree)
> 
> If you agree with this setup then this tree could be put after all these 
> -next branches:
> 
>   auto-core-next
>   auto-cpus4096-next
>   auto-ftrace-next
>   auto-genirq-next
>   auto-safe-poison-pointers-next
>   auto-sched-next
>   auto-stackprotector-next
>   auto-test
>   auto-test-fixes
>   auto-timers-next
>   auto-x86-next
> 
> and then it will merge without conflicts. It's auto-updated to all these 
> branches - i.e. when these branches are iterated then 
> auto-generic-ipi-next will be iterated as well.
> 
> how does this sound to you? Nothing changes to your work flow (just keep 
> those branches updated and let me know when i should pull from them), 
> but conflicts are auto-eliminated from Stephen's flow and the conflict 
> resolution workload and burden is put on those who generate them (the 
> x86 folks and you).

Sounds good to me :-)

-- 
Jens Axboe

^ permalink raw reply	[flat|nested] 46+ messages in thread

* Re: linux-next: manual merge of the block tree
  2008-06-27  9:57       ` Ingo Molnar
@ 2008-06-27 10:11         ` Ingo Molnar
  2008-06-27 11:21           ` Jens Axboe
  2008-06-27 11:21         ` Jens Axboe
  1 sibling, 1 reply; 46+ messages in thread
From: Ingo Molnar @ 2008-06-27 10:11 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Stephen Rothwell, linux-next, Thomas Gleixner, H. Peter Anvin,
	the arch/x86 maintainers


> Jens, i've started testing this in -tip - there are three small build 
> fixlets in the tip/generic-ipi branch so far.
> 
> If you dont have these fixes already then you can pull them from:
> 
>  git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git generic-ipi

this config is causing trouble too:

  http://redhat.com/~mingo/misc/config-Fri_Jun_27_12_03_13_CEST_2008.bad

it gives:

  include/asm-x86/mach-default/entry_arch.h: Assembler messages:
  include/asm-x86/mach-default/entry_arch.h:16: Error: undefined symbol `CALL_FUNCTION_SINGLE_VECTOR' in operation

the irq vector definitions got moved around in include/asm-x86, it's 
probably an integration effect of that. Stephen will likely see such 
problems in linux-next too.

My suggestion would be: lets work on finishing the integration in 
tip/auto-generic-ipi-next and then offer it to Stephen once that looks 
good in testing?

	Ingo

^ permalink raw reply	[flat|nested] 46+ messages in thread

* Re: linux-next: manual merge of the block tree
  2008-06-27  9:26     ` Ingo Molnar
@ 2008-06-27  9:57       ` Ingo Molnar
  2008-06-27 10:11         ` Ingo Molnar
  2008-06-27 11:21         ` Jens Axboe
  2008-06-27 11:18       ` Jens Axboe
  1 sibling, 2 replies; 46+ messages in thread
From: Ingo Molnar @ 2008-06-27  9:57 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Stephen Rothwell, linux-next, Thomas Gleixner, H. Peter Anvin,
	the arch/x86 maintainers


* Ingo Molnar <mingo@elte.hu> wrote:

> i'll put this into tip/generic-ipi and wont put into the x86 topics 
> towards linux-next - i just want to see the effects in practice.
> 
> This is the 102th -tip topic, there's space for all :-)

Jens, i've started testing this in -tip - there are three small build 
fixlets in the tip/generic-ipi branch so far.

If you dont have these fixes already then you can pull them from:

 git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git generic-ipi

	Ingo

------------->
commit 8b604d520799a995946437d041f46bae7d5bcc8c
Author: Ingo Molnar <mingo@elte.hu>
Date:   Fri Jun 27 11:52:45 2008 +0200

    fix: "smp_call_function: get rid of the unused nonatomic/retry argument"
    
    drivers/char/sysrq.c: In function 'sysrq_showregs_othercpus':
    drivers/char/sysrq.c:218: error: too many arguments to function 'smp_call_function'
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/drivers/char/sysrq.c b/drivers/char/sysrq.c
index dbce126..8fdfe9c 100644
--- a/drivers/char/sysrq.c
+++ b/drivers/char/sysrq.c
@@ -215,7 +215,7 @@ static void showacpu(void *dummy)
 
 static void sysrq_showregs_othercpus(struct work_struct *dummy)
 {
-	smp_call_function(showacpu, NULL, 0, 0);
+	smp_call_function(showacpu, NULL, 0);
 }
 
 static DECLARE_WORK(sysrq_showallcpus, sysrq_showregs_othercpus);

commit ce0d1b6f73870878aae622b72e85fe8f7a16b51c
Author: Ingo Molnar <mingo@elte.hu>
Date:   Fri Jun 27 11:50:32 2008 +0200

    fix: "smp_call_function: get rid of the unused nonatomic/retry argument"
    
    fix:
    
    kernel/smp.c: In function 'smp_call_function_mask':
    kernel/smp.c:303: error: too many arguments to function 'smp_call_function_single'
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/kernel/smp.c b/kernel/smp.c
index 7e0432a..4f582b2 100644
--- a/kernel/smp.c
+++ b/kernel/smp.c
@@ -300,7 +300,7 @@ int smp_call_function_mask(cpumask_t mask, void (*func)(void *), void *info,
 		return 0;
 	else if (num_cpus == 1) {
 		cpu = first_cpu(mask);
-		return smp_call_function_single(cpu, func, info, 0, wait);
+		return smp_call_function_single(cpu, func, info, wait);
 	}
 
 	if (!wait) {

commit 127a237a1ff49fa5b8e00af91e841598aeea3513
Author: Ingo Molnar <mingo@elte.hu>
Date:   Fri Jun 27 11:48:22 2008 +0200

    fix "smp_call_function: get rid of the unused nonatomic/retry argument"
    
    fix:
    
    arch/x86/kernel/process.c: In function 'cpu_idle_wait':
    arch/x86/kernel/process.c:64: error: too many arguments to function 'smp_call_function'
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c
index ba370dc..2dad8fe 100644
--- a/arch/x86/kernel/process.c
+++ b/arch/x86/kernel/process.c
@@ -61,7 +61,7 @@ void cpu_idle_wait(void)
 {
 	smp_mb();
 	/* kick all the CPUs so that they exit out of pm_idle */
-	smp_call_function(do_nothing, NULL, 0, 1);
+	smp_call_function(do_nothing, NULL, 1);
 }
 EXPORT_SYMBOL_GPL(cpu_idle_wait);
 

^ permalink raw reply related	[flat|nested] 46+ messages in thread

* Re: linux-next: manual merge of the block tree
  2008-06-27  8:47   ` Jens Axboe
@ 2008-06-27  9:26     ` Ingo Molnar
  2008-06-27  9:57       ` Ingo Molnar
  2008-06-27 11:18       ` Jens Axboe
  0 siblings, 2 replies; 46+ messages in thread
From: Ingo Molnar @ 2008-06-27  9:26 UTC (permalink / raw)
  To: Jens Axboe
  Cc: Stephen Rothwell, linux-next, Thomas Gleixner, H. Peter Anvin,
	the arch/x86 maintainers


* Jens Axboe <jens.axboe@oracle.com> wrote:

> > That way we could pull it into tip/x86 and give it some testing on 
> > the x86 side, and resolve its integration effects. Would that be 
> > possible?
> 
> Currently I have two branches for this - one is generic-ipi, which 
> contains the generic bits and all the arch conversions. The other is 
> smp_call_function, which kills the unused argument to 
> smp_call_function() (and friends) and on_each_cpu(). If I separate out 
> the non-x86 archs, I'll have trouble getting it all in for 2.6.27 as 
> I'll be on vacation as of july 5th.
> 
> So it's not tied in with any block bits, but it does have all archs. 
> Even if it's a bit of a weird thing to put the whole thing into the 
> x86 tree, I don't mind if we do that. Heck, it's in the block repo to 
> begin with :-)

i'll put this into tip/generic-ipi and wont put into the x86 topics 
towards linux-next - i just want to see the effects in practice.

This is the 102th -tip topic, there's space for all :-)

> So if you could pull:
> 
> git://git.kernel.dk/linux-2.6-block.git generic-ipi
> 
> and
> 
> git://git.kernel.dk/linux-2.6-block.git smp_call_function
> 
> and merge them with the x86 changes, that would be fine. It's also the 
> place where we currently have conflicts due to 32-bit and 64-bit stuff 
> being merged, so it would help Stephen as well.

i have an even better, brilliant plan :-)

what we could do is that we could offer an auto-generic-ipi-next 
integration branch that to Stephen that is tip/auto-x86-next plus 
tip/generic-ipi.

in fact i've just implemented this. You can pull the resulting 
tip/auto-generic-ipi-next tree from:

  git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git auto-generic-ipi-next

[ note: just first raw merge and conflict resolution, not tested yet. ]

note that it embedds your tree in a Git way and we can update the 
tip/generic-ipi branch in an append-only manner and it can go towards 
Linus in whatever way you prefer. (as long as you do not rebase the 
tree)

If you agree with this setup then this tree could be put after all these 
-next branches:

  auto-core-next
  auto-cpus4096-next
  auto-ftrace-next
  auto-genirq-next
  auto-safe-poison-pointers-next
  auto-sched-next
  auto-stackprotector-next
  auto-test
  auto-test-fixes
  auto-timers-next
  auto-x86-next

and then it will merge without conflicts. It's auto-updated to all these 
branches - i.e. when these branches are iterated then 
auto-generic-ipi-next will be iterated as well.

how does this sound to you? Nothing changes to your work flow (just keep 
those branches updated and let me know when i should pull from them), 
but conflicts are auto-eliminated from Stephen's flow and the conflict 
resolution workload and burden is put on those who generate them (the 
x86 folks and you).

	Ingo

^ permalink raw reply	[flat|nested] 46+ messages in thread

* Re: linux-next: manual merge of the block tree
  2008-06-27  8:30 ` Ingo Molnar
@ 2008-06-27  8:47   ` Jens Axboe
  2008-06-27  9:26     ` Ingo Molnar
  0 siblings, 1 reply; 46+ messages in thread
From: Jens Axboe @ 2008-06-27  8:47 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Stephen Rothwell, linux-next, Thomas Gleixner, H. Peter Anvin,
	the arch/x86 maintainers

On Fri, Jun 27 2008, Ingo Molnar wrote:
> 
> * Stephen Rothwell <sfr@canb.auug.org.au> wrote:
> 
> > Hi Jens,
> > 
> > Today's linux-next merge of the block tree got a trivial conflict in 
> > include/asm-x86/smp.h between commit 
> > a4c81cf684350797939416c99effb9d3ae46bca6 ("x86: extend e820 ealy_res 
> > support 32bit") from the x86 tree and commit 
> > 3b16cf874861436725c43ba0b68bdd799297be7c ("x86: convert to generic 
> > helpers for IPI function calls") from the block tree.
> > 
> > A case of contextually close deletions.
> 
> Jens, would it be possible for you to prepare a pullable branch for us 
> for the x86 and generic bits of the SMP generic helpers thing - 
> independent of any block tree bits? (it can touch generic code but it 
> should not break the build on other architectures)
> 
> That way we could pull it into tip/x86 and give it some testing on the 
> x86 side, and resolve its integration effects. Would that be possible?

Currently I have two branches for this - one is generic-ipi, which
contains the generic bits and all the arch conversions. The other is
smp_call_function, which kills the unused argument to
smp_call_function() (and friends) and on_each_cpu(). If I separate out
the non-x86 archs, I'll have trouble getting it all in for 2.6.27 as
I'll be on vacation as of july 5th.

So it's not tied in with any block bits, but it does have all archs.
Even if it's a bit of a weird thing to put the whole thing into the x86
tree, I don't mind if we do that. Heck, it's in the block repo to begin
with :-)

So if you could pull:

git://git.kernel.dk/linux-2.6-block.git generic-ipi

and

git://git.kernel.dk/linux-2.6-block.git smp_call_function

and merge them with the x86 changes, that would be fine. It's also the
place where we currently have conflicts due to 32-bit and 64-bit stuff
being merged, so it would help Stephen as well.

-- 
Jens Axboe

^ permalink raw reply	[flat|nested] 46+ messages in thread

* Re: linux-next: manual merge of the block tree
  2008-06-27  6:13 Stephen Rothwell
@ 2008-06-27  8:30 ` Ingo Molnar
  2008-06-27  8:47   ` Jens Axboe
  0 siblings, 1 reply; 46+ messages in thread
From: Ingo Molnar @ 2008-06-27  8:30 UTC (permalink / raw)
  To: Stephen Rothwell
  Cc: Jens Axboe, linux-next, Thomas Gleixner, H. Peter Anvin,
	the arch/x86 maintainers


* Stephen Rothwell <sfr@canb.auug.org.au> wrote:

> Hi Jens,
> 
> Today's linux-next merge of the block tree got a trivial conflict in 
> include/asm-x86/smp.h between commit 
> a4c81cf684350797939416c99effb9d3ae46bca6 ("x86: extend e820 ealy_res 
> support 32bit") from the x86 tree and commit 
> 3b16cf874861436725c43ba0b68bdd799297be7c ("x86: convert to generic 
> helpers for IPI function calls") from the block tree.
> 
> A case of contextually close deletions.

Jens, would it be possible for you to prepare a pullable branch for us 
for the x86 and generic bits of the SMP generic helpers thing - 
independent of any block tree bits? (it can touch generic code but it 
should not break the build on other architectures)

That way we could pull it into tip/x86 and give it some testing on the 
x86 side, and resolve its integration effects. Would that be possible?

	Ingo

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the block tree
@ 2008-06-27  6:13 Stephen Rothwell
  2008-06-27  8:30 ` Ingo Molnar
  0 siblings, 1 reply; 46+ messages in thread
From: Stephen Rothwell @ 2008-06-27  6:13 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-next, Thomas Gleixner, Ingo Molnar, H. Peter Anvin

[-- Attachment #1: Type: text/plain, Size: 511 bytes --]

Hi Jens,

Today's linux-next merge of the block tree got a trivial conflict in
include/asm-x86/smp.h between commit
a4c81cf684350797939416c99effb9d3ae46bca6 ("x86: extend e820 ealy_res
support 32bit") from the x86 tree and commit
3b16cf874861436725c43ba0b68bdd799297be7c ("x86: convert to generic
helpers for IPI function calls") from the block tree.

A case of contextually close deletions.

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 46+ messages in thread

* linux-next: manual merge of the block tree
@ 2008-06-27  6:09 Stephen Rothwell
  0 siblings, 0 replies; 46+ messages in thread
From: Stephen Rothwell @ 2008-06-27  6:09 UTC (permalink / raw)
  To: Jens Axboe
  Cc: linux-next, Thomas Gleixner, Ingo Molnar, H. Peter Anvin, Glauber Costa

[-- Attachment #1: Type: text/plain, Size: 532 bytes --]

Hi Jens,

Today's linux-next merge of the block tree got a conflict in
arch/x86/kernel/smpboot.c between commit
b9bcb3696f0c121bb0bdbb5cbdde059ee6f95d51 ("x86: change __setup_vector_irq
with setup_vector_irq") from the x86 tree and commit
3b16cf874861436725c43ba0b68bdd799297be7c ("x86: convert to generic
helpers for IPI function calls") from the block tree.

It is merely contextual, and I can carry the fixup.

-- 
Cheers,
Stephen Rothwell                    sfr@canb.auug.org.au
http://www.canb.auug.org.au/~sfr/

[-- Attachment #2: Type: application/pgp-signature, Size: 197 bytes --]

^ permalink raw reply	[flat|nested] 46+ messages in thread

end of thread, other threads:[~2013-10-25 15:03 UTC | newest]

Thread overview: 46+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-09-30 11:26 linux-next: manual merge of the bcon tree Thierry Reding
2013-09-30 11:26 ` linux-next: manual merge of the block tree Thierry Reding
     [not found] ` <1380540373-25352-1-git-send-email-treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2013-09-30 11:26   ` linux-next: manual merge of the cgroup tree Thierry Reding
2013-09-30 11:26 ` linux-next: manual merge of the drm-intel tree Thierry Reding
2013-09-30 11:32   ` Daniel Vetter
2013-09-30 11:26 ` linux-next: manual merge of the ipsec-next tree Thierry Reding
2013-09-30 11:26 ` linux-next: manual merge of the net-next tree Thierry Reding
2013-09-30 11:26 ` linux-next: manual merge of the random tree Thierry Reding
2013-09-30 11:26 ` linux-next: manual merge of the sh tree Thierry Reding
2013-09-30 11:26 ` linux-next: manual merge of the tip tree Thierry Reding
2013-09-30 11:26 ` linux-next: manual merge of the vfs tree Thierry Reding
2013-09-30 11:26 ` linux-next: manual merge of the wireless-next tree Thierry Reding
2013-09-30 14:26   ` Larry Finger
  -- strict thread matches above, loose matches on Subject: below --
2013-10-25 15:03 linux-next: Tree for Oct 25 Thierry Reding
2013-10-25 15:03 ` linux-next: manual merge of the block tree Thierry Reding
2013-10-14 14:48 linux-next: Tree for Oct 14 Thierry Reding
2013-10-14 14:48 ` linux-next: manual merge of the block tree Thierry Reding
2013-10-11 19:04 Mark Brown
2013-10-01 11:03 linux-next: Tree for Oct 1 Thierry Reding
2013-10-01 11:07 ` linux-next: manual merge of the block tree Thierry Reding
2008-12-15  7:08 Stephen Rothwell
2008-11-19  3:21 Stephen Rothwell
2008-11-19  9:14 ` Jens Axboe
2008-11-19  9:32   ` Stephen Rothwell
2008-11-07  6:14 Stephen Rothwell
2008-11-07  6:10 Stephen Rothwell
2008-11-07  9:50 ` Jens Axboe
2008-11-07 10:07   ` Stephen Rothwell
2008-10-15  7:40 Stephen Rothwell
2008-09-05  6:12 Stephen Rothwell
2008-09-05  6:22 ` Jens Axboe
2008-09-05 13:58   ` James Bottomley
2008-09-03  5:58 Stephen Rothwell
2008-09-03  5:55 Stephen Rothwell
2008-09-02  6:06 Stephen Rothwell
2008-09-02  5:59 Stephen Rothwell
2008-08-28  5:30 Stephen Rothwell
2008-08-27  5:48 Stephen Rothwell
2008-08-27  5:47 Stephen Rothwell
2008-06-27  6:13 Stephen Rothwell
2008-06-27  8:30 ` Ingo Molnar
2008-06-27  8:47   ` Jens Axboe
2008-06-27  9:26     ` Ingo Molnar
2008-06-27  9:57       ` Ingo Molnar
2008-06-27 10:11         ` Ingo Molnar
2008-06-27 11:21           ` Jens Axboe
2008-06-27 11:21         ` Jens Axboe
2008-06-27 11:18       ` Jens Axboe
2008-06-27  6:09 Stephen Rothwell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).