r2444 - in trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian: . patches patches/series
Joshua Kwan
joshk@costa.debian.org
Sun, 06 Feb 2005 01:35:04 +0100
Author: joshk
Date: 2005-02-06 01:35:03 +0100 (Sun, 06 Feb 2005)
New Revision: 2444
Added:
trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/series/2.4.29-1
Removed:
trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/008_DAC960_alpha_fw.diff
trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/025_proc_tty_security.diff
trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/077_isofs_ignore_volseqno.diff
trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/093_tty_lockup.diff
trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/114-binfmt_aout-CAN-2004-1074.diff
trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/series/2.4.28-1
Modified:
trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/changelog
trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/900_changelog.diff
Log:
theoretically works, but missing IPsec
Modified: trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/changelog
===================================================================
--- trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/changelog 2005-02-06 00:18:46 UTC (rev 2443)
+++ trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/changelog 2005-02-06 00:35:03 UTC (rev 2444)
@@ -1,8 +1,14 @@
kernel-source-2.4.29 (2.4.29-1) UNRELEASED; urgency=low
* New upstream release.
+ * Patches removed
+ - 008_DAC960_alpha_fw.diff (merged)
+ - 025_proc_tty_security.diff (backport)
+ - 077_isofs_ignore_volseqno.diff (irrelevant)
+ - 093_tty_lockup.diff (backport)
+ - 114-binfmt_aout-CAN-2004-1074.diff (backport)
- -- Joshua Kwan <joshk@triplehelix.org> Sat, 5 Feb 2005 16:05:39 -0800
+ -- Joshua Kwan <joshk@triplehelix.org> Sat, 5 Feb 2005 16:28:05 -0800
kernel-source-2.4.28 (2.4.28-1) unstable; urgency=low
Deleted: trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/008_DAC960_alpha_fw.diff
===================================================================
--- trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/008_DAC960_alpha_fw.diff 2005-02-06 00:18:46 UTC (rev 2443)
+++ trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/008_DAC960_alpha_fw.diff 2005-02-06 00:35:03 UTC (rev 2444)
@@ -1,46 +0,0 @@
-# origin: Debian, #244585
-# cset: n/a
-# inclusion: not submitted
-# description: Require firmware 2.70 on Alpha for DAC960
-# revision date: 2004-09-04
-
-diff -urN kernel-source-2.4.26-1/drivers/block/DAC960.c kernel-source-2.4.26-2/drivers/block/DAC960.c
---- kernel-source-2.4.26-1/drivers/block/DAC960.c 2002-11-30 15:49:38.000000000 +1100
-+++ kernel-source-2.4.26-2/drivers/block/DAC960.c 2004-04-20 09:14:09.000000000 +1000
-@@ -1133,6 +1133,26 @@
- DAC960PU/PD/PL 3.51 and above
- DAC960PU/PD/PL/P 2.73 and above
- */
-+#if defined(CONFIG_ALPHA)
-+ /*
-+ DEC Alpha machines were often equipped with DAC960 cards that were
-+ OEMed from Mylex, and had their own custom firmware. Version 2.70,
-+ the last custom FW revision to be released by DEC for these older
-+ controllers, appears to work quite well with this driver.
-+
-+ Cards tested successfully were several versions each of the PD and
-+ PU, called by DEC the KZPSC and KZPAC, respectively, and having
-+ the Manufacturer Numbers (from Mylex), usually on a sticker on the
-+ back of the board, of:
-+
-+ KZPSC: D040347 (1-channel) or D040348 (2-channel) or D040349 (3-channel)
-+ KZPAC: D040395 (1-channel) or D040396 (2-channel) or D040397 (3-channel)
-+ */
-+# define FIRMWARE_27X "2.70"
-+#else
-+# define FIRMWARE_27X "2.73"
-+#endif
-+
- if (Enquiry2.FirmwareID.MajorVersion == 0)
- {
- Enquiry2.FirmwareID.MajorVersion =
-@@ -1152,7 +1172,7 @@
- (Controller->FirmwareVersion[0] == '3' &&
- strcmp(Controller->FirmwareVersion, "3.51") >= 0) ||
- (Controller->FirmwareVersion[0] == '2' &&
-- strcmp(Controller->FirmwareVersion, "2.73") >= 0)))
-+ strcmp(Controller->FirmwareVersion, FIRMWARE_27X) >= 0)))
- {
- DAC960_Failure(Controller, "FIRMWARE VERSION VERIFICATION");
- DAC960_Error("Firmware Version = '%s'\n", Controller,
-
Deleted: trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/025_proc_tty_security.diff
===================================================================
--- trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/025_proc_tty_security.diff 2005-02-06 00:18:46 UTC (rev 2443)
+++ trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/025_proc_tty_security.diff 2005-02-06 00:35:03 UTC (rev 2444)
@@ -1,64 +0,0 @@
-# origin: CAN-2003-0461
-# cset: n/a
-# inclusion: ?
-# description: make /proc/tty/driver root-only
-# revision date: 2004-09-04
-
---- kernel-source-2.4.26/fs/proc/generic.c 2003-11-29 05:26:21.000000000 +1100
-+++ kernel-source-2.4.26-1/fs/proc/generic.c 2003-11-29 20:53:47.000000000 +1100
-@@ -486,12 +486,12 @@
- return ent;
- }
-
--struct proc_dir_entry *proc_mkdir(const char *name, struct proc_dir_entry *parent)
-+struct proc_dir_entry *proc_mkdir_mode(const char *name, mode_t mode,
-+ struct proc_dir_entry *parent)
- {
- struct proc_dir_entry *ent;
-
-- ent = proc_create(&parent,name,
-- (S_IFDIR | S_IRUGO | S_IXUGO),2);
-+ ent = proc_create(&parent, name, S_IFDIR | mode, 2);
- if (ent) {
- ent->proc_fops = &proc_dir_operations;
- ent->proc_iops = &proc_dir_inode_operations;
-@@ -504,6 +504,12 @@
- return ent;
- }
-
-+struct proc_dir_entry *proc_mkdir(const char *name,
-+ struct proc_dir_entry *parent)
-+{
-+ return proc_mkdir_mode(name, S_IRUGO | S_IXUGO, parent);
-+}
-+
- struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,
- struct proc_dir_entry *parent)
- {
---- kernel-source-2.4.26/fs/proc/proc_tty.c 2000-04-22 08:17:57.000000000 +1000
-+++ kernel-source-2.4.26-1/fs/proc/proc_tty.c 2003-07-23 21:12:10.000000000 +1000
-@@ -174,7 +174,13 @@
- if (!proc_mkdir("tty", 0))
- return;
- proc_tty_ldisc = proc_mkdir("tty/ldisc", 0);
-- proc_tty_driver = proc_mkdir("tty/driver", 0);
-+ /*
-+ * /proc/tty/driver/serial reveals the exact character counts for
-+ * serial links which is just too easy to abuse for inferring
-+ * password lengths and inter-keystroke timings during password
-+ * entry.
-+ */
-+ proc_tty_driver = proc_mkdir_mode("tty/driver", S_IRUSR | S_IXUSR, 0);
-
- create_proc_read_entry("tty/ldiscs", 0, 0, tty_ldiscs_read_proc,NULL);
- create_proc_read_entry("tty/drivers", 0, 0, tty_drivers_read_proc,NULL);
---- kernel-source-2.4.26/include/linux/proc_fs.h 2003-11-29 05:26:21.000000000 +1100
-+++ kernel-source-2.4.26-1/include/linux/proc_fs.h 2003-11-29 20:53:51.000000000 +1100
-@@ -142,6 +142,7 @@
- struct proc_dir_entry *, const char *);
- extern struct proc_dir_entry *proc_mknod(const char *,mode_t,
- struct proc_dir_entry *,kdev_t);
-+extern struct proc_dir_entry *proc_mkdir_mode(const char *,mode_t,struct proc_dir_entry *);
- extern struct proc_dir_entry *proc_mkdir(const char *,struct proc_dir_entry *);
-
- static inline struct proc_dir_entry *create_proc_read_entry(const char *name,
Deleted: trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/077_isofs_ignore_volseqno.diff
===================================================================
--- trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/077_isofs_ignore_volseqno.diff 2005-02-06 00:18:46 UTC (rev 2443)
+++ trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/077_isofs_ignore_volseqno.diff 2005-02-06 00:35:03 UTC (rev 2444)
@@ -1,42 +0,0 @@
-# origin: Debian (herbert)
-# cset: n/a
-# inclusion: not submitted
-# description: do not get seqno if we will not use it
-# revision date: 2004-09-04
-
-diff -urN kernel-source-2.4.26/fs/isofs/inode.c kernel-source-2.4.26-1/fs/isofs/inode.c
---- kernel-source-2.4.26/fs/isofs/inode.c 2002-11-29 10:53:15.000000000 +1100
-+++ kernel-source-2.4.26-1/fs/isofs/inode.c 2002-11-30 15:49:27.000000000 +1100
-@@ -1148,7 +1148,10 @@
- struct iso_directory_record * tmpde = NULL;
- unsigned int de_len;
- unsigned long offset;
-- int volume_seq_no, i;
-+ int i;
-+#ifndef IGNORE_WRONG_MULTI_VOLUME_SPECS
-+ int volume_seq_no;
-+#endif
-
- bh = sb_bread(inode->i_sb, block);
- if (!bh)
-@@ -1280,9 +1275,6 @@
- test_and_set_gid(&inode->i_gid, inode->i_sb->u.isofs_sb.s_gid);
- }
-
-- /* get the volume sequence number */
-- volume_seq_no = isonum_723 (de->volume_sequence_number) ;
--
- /*
- * Multi volume means tagging a group of CDs with info in their headers.
- * All CDs of a group must share the same vol set name and vol set size
-@@ -1292,6 +1284,9 @@
- * of ftp://ftp.ecma.ch/ecma-st/Ecma-119.pdf (ECMA 119 2nd Ed = ISO 9660)
- */
- #ifndef IGNORE_WRONG_MULTI_VOLUME_SPECS
-+ /* get the volume sequence number */
-+ volume_seq_no = isonum_723 (de->volume_sequence_number) ;
-+
- /*
- * Disable checking if we see any volume number other than 0 or 1.
- * We could use the cruft option, but that has multiple purposes, one
-
Deleted: trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/093_tty_lockup.diff
===================================================================
--- trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/093_tty_lockup.diff 2005-02-06 00:18:46 UTC (rev 2443)
+++ trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/093_tty_lockup.diff 2005-02-06 00:35:03 UTC (rev 2444)
@@ -1,2777 +0,0 @@
-# origin: Jason Baron
-# cset: n/a
-# inclusion: unknown, presumably will be included
-# revision date: 2004-09-23
-# description: Security: fix race conditions in linux terminal subsystem
-# [CAN-2004-081]
---- linux-2.4.27/fs/proc/proc_tty.c.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/fs/proc/proc_tty.c Thu Sep 23 17:24:33 2004
-@@ -15,8 +15,6 @@
- #include <asm/bitops.h>
-
- extern struct tty_driver *tty_drivers; /* linked list of tty drivers */
--extern struct tty_ldisc ldiscs[];
--
-
- static int tty_drivers_read_proc(char *page, char **start, off_t off,
- int count, int *eof, void *data);
-@@ -106,12 +104,15 @@ static int tty_ldiscs_read_proc(char *pa
- int i;
- int len = 0;
- off_t begin = 0;
--
-+ struct tty_ldisc *ld;
-+
- for (i=0; i < NR_LDISCS; i++) {
-- if (!(ldiscs[i].flags & LDISC_FLAG_DEFINED))
-+ ld = tty_ldisc_get(i);
-+ if (ld == NULL)
- continue;
- len += sprintf(page+len, "%-10s %2d\n",
-- ldiscs[i].name ? ldiscs[i].name : "???", i);
-+ ld->name ? ld->name : "???", i);
-+ tty_ldisc_put(i);
- if (len+begin > off+count)
- break;
- if (len+begin < off) {
---- linux-2.4.27/include/linux/tty.h.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/include/linux/tty.h Fri Sep 24 10:28:53 2004
-@@ -322,26 +322,28 @@ struct tty_struct {
- * tty->write. Thus, you must use the inline functions set_bit() and
- * clear_bit() to make things atomic.
- */
--#define TTY_THROTTLED 0
--#define TTY_IO_ERROR 1
--#define TTY_OTHER_CLOSED 2
--#define TTY_EXCLUSIVE 3
--#define TTY_DEBUG 4
--#define TTY_DO_WRITE_WAKEUP 5
--#define TTY_PUSH 6
--#define TTY_CLOSING 7
--#define TTY_DONT_FLIP 8
--#define TTY_HW_COOK_OUT 14
--#define TTY_HW_COOK_IN 15
--#define TTY_PTY_LOCK 16
--#define TTY_NO_WRITE_SPLIT 17
-+#define TTY_THROTTLED 0 /* Call unthrottle() at threshold min */
-+#define TTY_IO_ERROR 1 /* Canse an I/O error (may be no ldisc too) */
-+#define TTY_OTHER_CLOSED 2 /* Other side (if any) has closed */
-+#define TTY_EXCLUSIVE 3 /* Exclusive open mode */
-+#define TTY_DEBUG 4 /* Debugging */
-+#define TTY_DO_WRITE_WAKEUP 5 /* Call write_wakeup after queuing new */
-+#define TTY_PUSH 6 /* n_tty private */
-+#define TTY_CLOSING 7 /* ->close() in progress */
-+#define TTY_DONT_FLIP 8 /* Defer buffer flip */
-+#define TTY_LDISC 9 /* Line discipline attached */
-+#define TTY_HW_COOK_OUT 14 /* Hardware can do output cooking */
-+#define TTY_HW_COOK_IN 15 /* Hardware can do input cooking */
-+#define TTY_PTY_LOCK 16 /* pty private */
-+#define TTY_NO_WRITE_SPLIT 17 /* Preserve write boundaries to driver */
-+#define TTY_HUPPED 18 /* Post driver->hangup() */
-
- #define TTY_WRITE_FLUSH(tty) tty_write_flush((tty))
-
- extern void tty_write_flush(struct tty_struct *);
-
- extern struct termios tty_std_termios;
--extern struct tty_ldisc ldiscs[];
-+extern struct tty_ldisc tty_ldiscs[];
- extern int fg_console, last_console, want_console;
-
- extern int kmsg_redirect;
-@@ -396,6 +398,16 @@ extern void disassociate_ctty(int priv);
- extern void tty_flip_buffer_push(struct tty_struct *tty);
- extern int tty_get_baud_rate(struct tty_struct *tty);
-
-+extern struct tty_ldisc *tty_ldisc_ref(struct tty_struct *);
-+extern void tty_ldisc_deref(struct tty_ldisc *);
-+extern struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *);
-+
-+extern struct tty_ldisc *tty_ldisc_get(int);
-+extern void tty_ldisc_put(int);
-+
-+extern void tty_wakeup(struct tty_struct *tty);
-+
-+
- /* n_tty.c */
- extern struct tty_ldisc tty_ldisc_N_TTY;
-
---- linux-2.4.27/include/linux/tty_ldisc.h.bak Thu Sep 23 17:43:51 2004
-+++ linux-2.4.27/include/linux/tty_ldisc.h Thu Sep 23 17:44:24 2004
-@@ -129,6 +129,7 @@ struct tty_ldisc {
- char *fp, int count);
- int (*receive_room)(struct tty_struct *);
- void (*write_wakeup)(struct tty_struct *);
-+ int refcount;
- };
-
- #define TTY_LDISC_MAGIC 0x5403
---- linux-2.4.27/drivers/net/ppp_async.c.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/drivers/net/ppp_async.c Thu Sep 23 17:24:33 2004
-@@ -117,6 +117,9 @@ static struct ppp_channel_ops async_ops
- * frees the memory that ppp_asynctty_receive is using. The best
- * way to fix this is to use a rwlock in the tty struct, but for now
- * we use a single global rwlock for all ttys in ppp line discipline.
-+ *
-+ * FIXME: this is no longer true. The _close path for the ldisc is
-+ * now guaranteed to be sane.
- */
- static rwlock_t disc_data_lock = RW_LOCK_UNLOCKED;
-
-@@ -139,7 +142,8 @@ static void ap_put(struct asyncppp *ap)
- }
-
- /*
-- * Called when a tty is put into PPP line discipline.
-+ * Called when a tty is put into PPP line discipline. Called in process
-+ * context.
- */
- static int
- ppp_asynctty_open(struct tty_struct *tty)
-@@ -248,6 +252,11 @@ ppp_asynctty_write(struct tty_struct *tt
- return -EAGAIN;
- }
-
-+/*
-+ * Called in process context only. May be re-entered by multiple
-+ * ioctl calling threads.
-+ */
-+
- static int
- ppp_asynctty_ioctl(struct tty_struct *tty, struct file *file,
- unsigned int cmd, unsigned long arg)
-@@ -714,7 +723,8 @@ flush:
-
- /*
- * Flush output from our internal buffers.
-- * Called for the TCFLSH ioctl.
-+ * Called for the TCFLSH ioctl. Can be entered in parallel
-+ * but this is covered by the xmit_lock.
- */
- static void
- ppp_async_flush_output(struct asyncppp *ap)
-@@ -819,7 +829,9 @@ input_error(struct asyncppp *ap, int cod
- ppp_input_error(&ap->chan, code);
- }
-
--/* called when the tty driver has data for us. */
-+/* Called when the tty driver has data for us. Runs parallel with the
-+ other ldisc functions but will not be re-entered */
-+
- static void
- ppp_async_input(struct asyncppp *ap, const unsigned char *buf,
- char *flags, int count)
---- linux-2.4.27/drivers/net/ppp_synctty.c.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/drivers/net/ppp_synctty.c Thu Sep 23 17:24:33 2004
-@@ -172,6 +172,8 @@ ppp_print_buffer (const char *name, cons
- * frees the memory that ppp_synctty_receive is using. The best
- * way to fix this is to use a rwlock in the tty struct, but for now
- * we use a single global rwlock for all ttys in ppp line discipline.
-+ *
-+ * FIXME: Fixed in tty_io nowdays.
- */
- static rwlock_t disc_data_lock = RW_LOCK_UNLOCKED;
-
---- linux-2.4.27/drivers/net/slip.c.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/drivers/net/slip.c Thu Sep 23 17:24:33 2004
-@@ -670,7 +670,9 @@ static int slip_receive_room(struct tty_
- * Handle the 'receiver data ready' interrupt.
- * This function is called by the 'tty_io' module in the kernel when
- * a block of SLIP data has been received, which can now be decapsulated
-- * and sent on to some IP layer for further processing.
-+ * and sent on to some IP layer for further processing. This will not
-+ * be re-entered while running but other ldisc functions may be called
-+ * in parallel
- */
-
- static void slip_receive_buf(struct tty_struct *tty, const unsigned char *cp, char *fp, int count)
-@@ -826,9 +828,11 @@ sl_alloc(kdev_t line)
- * SLIP line discipline is called for. Because we are
- * sure the tty line exists, we only have to link it to
- * a free SLIP channel...
-+ *
-+ * Called in process context serialized from other ldisc calls.
- */
--static int
--slip_open(struct tty_struct *tty)
-+
-+static int slip_open(struct tty_struct *tty)
- {
- struct slip *sl;
- int err;
-@@ -910,6 +914,9 @@ err_exit:
- }
-
- /*
-+
-+ FIXME: 1,2 are fixed 3 was never true anyway.
-+
- Let me to blame a bit.
- 1. TTY module calls this funstion on soft interrupt.
- 2. TTY module calls this function WITH MASKED INTERRUPTS!
-@@ -928,9 +935,8 @@ err_exit:
-
- /*
- * Close down a SLIP channel.
-- * This means flushing out any pending queues, and then restoring the
-- * TTY line discipline to what it was before it got hooked to SLIP
-- * (which usually is TTY again).
-+ * This means flushing out any pending queues, and then returning. This
-+ * call is serialized against other ldisc functions.
- */
- static void
- slip_close(struct tty_struct *tty)
---- linux-2.4.27/drivers/char/pcmcia/synclink_cs.c.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/drivers/char/pcmcia/synclink_cs.c Thu Sep 23 17:24:33 2004
-@@ -553,6 +553,40 @@ static void cs_error(client_handle_t han
- static void* mgslpc_get_text_ptr(void);
- static void* mgslpc_get_text_ptr() {return mgslpc_get_text_ptr;}
-
-+/**
-+ * line discipline callback wrappers
-+ *
-+ * The wrappers maintain line discipline references
-+ * while calling into the line discipline.
-+ *
-+ * ldisc_flush_buffer - flush line discipline receive buffers
-+ * ldisc_receive_buf - pass receive data to line discipline
-+ */
-+
-+static void ldisc_flush_buffer(struct tty_struct *tty)
-+{
-+ struct tty_ldisc *ld = tty_ldisc_ref(tty);
-+ if (ld) {
-+ if (ld->flush_buffer)
-+ ld->flush_buffer(tty);
-+ tty_ldisc_deref(ld);
-+ }
-+}
-+
-+static void ldisc_receive_buf(struct tty_struct *tty,
-+ const __u8 *data, char *flags, int count)
-+{
-+ struct tty_ldisc *ld;
-+ if (!tty)
-+ return;
-+ ld = tty_ldisc_ref(tty);
-+ if (ld) {
-+ if (ld->receive_buf)
-+ ld->receive_buf(tty, data, flags, count);
-+ tty_ldisc_deref(ld);
-+ }
-+}
-+
- static dev_link_t *mgslpc_attach(void)
- {
- MGSLPC_INFO *info;
-@@ -1027,13 +1061,7 @@ void bh_transmit(MGSLPC_INFO *info)
- printk("bh_transmit() entry on %s\n", info->device_name);
-
- if (tty) {
-- if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-- tty->ldisc.write_wakeup) {
-- if ( debug_level >= DEBUG_LEVEL_BH )
-- printk( "%s(%d):calling ldisc.write_wakeup on %s\n",
-- __FILE__,__LINE__,info->device_name);
-- (tty->ldisc.write_wakeup)(tty);
-- }
-+ tty_wakeup(tty);
- wake_up_interruptible(&tty->write_wait);
- }
- }
-@@ -1917,11 +1945,9 @@ static void mgslpc_flush_buffer(struct t
- info->tx_count = info->tx_put = info->tx_get = 0;
- del_timer(&info->tx_timer);
- spin_unlock_irqrestore(&info->lock,flags);
--
-+
- wake_up_interruptible(&tty->write_wait);
-- if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-- tty->ldisc.write_wakeup)
-- (tty->ldisc.write_wakeup)(tty);
-+ tty_wakeup(tty);
- }
-
- /* Send a high-priority XON/XOFF character
-@@ -2685,9 +2711,8 @@ static void mgslpc_close(struct tty_stru
-
- if (tty->driver.flush_buffer)
- tty->driver.flush_buffer(tty);
--
-- if (tty->ldisc.flush_buffer)
-- tty->ldisc.flush_buffer(tty);
-+
-+ ldisc_flush_buffer(tty);
-
- shutdown(info);
-
-@@ -4199,11 +4224,7 @@ int rx_get_frame(MGSLPC_INFO *info)
- }
- else
- #endif
-- {
-- /* Call the line discipline receive callback directly. */
-- if (tty && tty->ldisc.receive_buf)
-- tty->ldisc.receive_buf(tty, buf->data, info->flag_buf, framesize);
-- }
-+ ldisc_receive_buf(tty, buf->data, info->flag_buf, framesize);
- }
- }
-
---- linux-2.4.27/drivers/char/tty_io.c.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/drivers/char/tty_io.c Fri Sep 24 11:49:13 2004
-@@ -118,9 +118,10 @@ extern void disable_early_printk(void);
- #define TTY_PARANOIA_CHECK 1
- #define CHECK_TTY_COUNT 1
-
-+/* Lock for tty_termios changes - private to tty_io/tty_ioctl */
-+spinlock_t tty_termios_lock = SPIN_LOCK_UNLOCKED;
- struct termios tty_std_termios; /* for the benefit of tty drivers */
- struct tty_driver *tty_drivers; /* linked list of tty drivers */
--struct tty_ldisc ldiscs[NR_LDISCS]; /* line disc dispatch table */
-
- #ifdef CONFIG_UNIX98_PTYS
- extern struct tty_driver ptm_driver[]; /* Unix98 pty masters; for /dev/ptmx */
-@@ -260,46 +261,264 @@ static int check_tty_count(struct tty_st
- return 0;
- }
-
-+/*
-+ * This is probably overkill for real world processors but
-+ * they are not on hot paths so a little discipline won't do
-+ * any harm.
-+ */
-+
-+static void tty_set_termios_ldisc(struct tty_struct *tty, int num)
-+{
-+ unsigned long flags;
-+ spin_lock_irqsave(&tty_termios_lock, flags);
-+ tty->termios->c_line = num;
-+ spin_unlock_irqrestore(&tty_termios_lock, flags);
-+}
-+
-+/*
-+ * This guards the refcounted line discipline lists. The lock
-+ * must be taken with irqs off because there are hangup path
-+ * callers who will do ldisc lookups and cannot sleep.
-+ */
-+
-+spinlock_t tty_ldisc_lock = SPIN_LOCK_UNLOCKED;
-+DECLARE_WAIT_QUEUE_HEAD(tty_ldisc_wait);
-+struct tty_ldisc tty_ldiscs[NR_LDISCS]; /* line disc dispatch table */
-+
- int tty_register_ldisc(int disc, struct tty_ldisc *new_ldisc)
- {
-+
-+ unsigned long flags;
-+ int ret = 0;
-+
- if (disc < N_TTY || disc >= NR_LDISCS)
- return -EINVAL;
--
-+
-+ spin_lock_irqsave(&tty_ldisc_lock, flags);
- if (new_ldisc) {
-- ldiscs[disc] = *new_ldisc;
-- ldiscs[disc].flags |= LDISC_FLAG_DEFINED;
-- ldiscs[disc].num = disc;
-- } else
-- memset(&ldiscs[disc], 0, sizeof(struct tty_ldisc));
-+ tty_ldiscs[disc] = *new_ldisc;
-+ tty_ldiscs[disc].num = disc;
-+ tty_ldiscs[disc].flags |= LDISC_FLAG_DEFINED;
-+ tty_ldiscs[disc].refcount = 0;
-+ } else {
-+ if(tty_ldiscs[disc].refcount)
-+ ret = -EBUSY;
-+ else
-+ tty_ldiscs[disc].flags &= ~LDISC_FLAG_DEFINED;
-+ }
-+ spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-
-- return 0;
-+ return ret;
-+
- }
-
-+
- EXPORT_SYMBOL(tty_register_ldisc);
-
--/* Set the discipline of a tty line. */
-+struct tty_ldisc *tty_ldisc_get(int disc)
-+{
-+ unsigned long flags;
-+ struct tty_ldisc *ld;
-+
-+ if (disc < N_TTY || disc >= NR_LDISCS)
-+ return NULL;
-+
-+ spin_lock_irqsave(&tty_ldisc_lock, flags);
-+
-+ ld = &tty_ldiscs[disc];
-+ /* Check the entry is defined */
-+ if(ld->flags & LDISC_FLAG_DEFINED)
-+ ld->refcount++;
-+ else
-+ ld = NULL;
-+ spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-+ return ld;
-+}
-+
-+EXPORT_SYMBOL_GPL(tty_ldisc_get);
-+
-+void tty_ldisc_put(int disc)
-+{
-+ struct tty_ldisc *ld;
-+ unsigned long flags;
-+
-+ if (disc < N_TTY || disc >= NR_LDISCS)
-+ BUG();
-+
-+ spin_lock_irqsave(&tty_ldisc_lock, flags);
-+ ld = &tty_ldiscs[disc];
-+ if(ld->refcount <= 0)
-+ BUG();
-+ ld->refcount--;
-+ spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-+}
-+
-+EXPORT_SYMBOL_GPL(tty_ldisc_put);
-+
-+void tty_ldisc_assign(struct tty_struct *tty, struct tty_ldisc *ld)
-+{
-+ tty->ldisc = *ld;
-+ tty->ldisc.refcount = 0;
-+}
-+
-+/**
-+ * tty_ldisc_try - internal helper
-+ * @tty: the tty
-+ *
-+ * Make a single attempt to grab and bump the refcount on
-+ * the tty ldisc. Return 0 on failure or 1 on success. This is
-+ * used to implement both the waiting and non waiting versions
-+ * of tty_ldisc_ref
-+ */
-+
-+static int tty_ldisc_try(struct tty_struct *tty)
-+{
-+ unsigned long flags;
-+ struct tty_ldisc *ld;
-+ int ret = 0;
-+
-+ spin_lock_irqsave(&tty_ldisc_lock, flags);
-+ ld = &tty->ldisc;
-+ if(test_bit(TTY_LDISC, &tty->flags))
-+ {
-+ ld->refcount++;
-+ ret = 1;
-+ }
-+ spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-+ return ret;
-+}
-+
-+/**
-+ * tty_ldisc_ref_wait - wait for the tty ldisc
-+ * @tty: tty device
-+ *
-+ * Dereference the line discipline for the terminal and take a
-+ * reference to it. If the line discipline is in flux then
-+ * wait patiently until it changes.
-+ *
-+ * Note: Must not be called from an IRQ/timer context. The caller
-+ * must also be careful not to hold other locks that will deadlock
-+ * against a discipline change, such as an existing ldisc reference
-+ * (which we check for)
-+ */
-+
-+struct tty_ldisc *tty_ldisc_ref_wait(struct tty_struct *tty)
-+{
-+ /* wait_event is a macro */
-+ wait_event(tty_ldisc_wait, tty_ldisc_try(tty));
-+ return &tty->ldisc;
-+}
-+
-+EXPORT_SYMBOL_GPL(tty_ldisc_ref_wait);
-+
-+/**
-+ * tty_ldisc_ref - get the tty ldisc
-+ * @tty: tty device
-+ *
-+ * Dereference the line discipline for the terminal and take a
-+ * reference to it. If the line discipline is in flux then
-+ * return NULL. Can be called from IRQ and timer functions.
-+ */
-+
-+struct tty_ldisc *tty_ldisc_ref(struct tty_struct *tty)
-+{
-+ if(tty_ldisc_try(tty))
-+ return &tty->ldisc;
-+ return NULL;
-+}
-+
-+EXPORT_SYMBOL_GPL(tty_ldisc_ref);
-+
-+
-+void tty_ldisc_deref(struct tty_ldisc *ld)
-+{
-+
-+ unsigned long flags;
-+
-+ if(ld == NULL)
-+ BUG();
-+
-+ spin_lock_irqsave(&tty_ldisc_lock, flags);
-+ if(ld->refcount == 0)
-+ printk(KERN_EMERG "tty_ldisc_deref: no references.\n");
-+ else
-+ ld->refcount--;
-+ if(ld->refcount == 0)
-+ wake_up(&tty_ldisc_wait);
-+ spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-+}
-+
-+EXPORT_SYMBOL_GPL(tty_ldisc_deref);
-+
-+/**
-+ * tty_set_ldisc - set line discipline
-+ * @tty: the terminal to set
-+ * @ldisc: the line discipline
-+ *
-+ * Set the discipline of a tty line. Must be called from a process
-+ * context.
-+ */
-+
- static int tty_set_ldisc(struct tty_struct *tty, int ldisc)
- {
- int retval = 0;
- struct tty_ldisc o_ldisc;
- char buf[64];
-+ int work;
-+ unsigned long flags;
-+ struct tty_ldisc *ld;
-
- if ((ldisc < N_TTY) || (ldisc >= NR_LDISCS))
- return -EINVAL;
-+
-+restart:
-+
-+ if (tty->ldisc.num == ldisc)
-+ return 0; /* We are already in the desired discipline */
-+
-+ ld = tty_ldisc_get(ldisc);
- /* Eduardo Blanco <ejbs@cs.cs.com.uy> */
- /* Cyrus Durgin <cider@speakeasy.org> */
-- if (!(ldiscs[ldisc].flags & LDISC_FLAG_DEFINED)) {
-+ if (ld == NULL)
-+ {
- char modname [20];
-- sprintf(modname, "tty-ldisc-%d", ldisc);
-- request_module (modname);
-+ sprintf(modname, "tty-ldisc-%d", ldisc);
-+ request_module (modname);
-+ ld = tty_ldisc_get(ldisc);
- }
-- if (!(ldiscs[ldisc].flags & LDISC_FLAG_DEFINED))
-+
-+ if (ld == NULL)
- return -EINVAL;
-
-- if (tty->ldisc.num == ldisc)
-- return 0; /* We are already in the desired discipline */
-- o_ldisc = tty->ldisc;
-+ /*
-+ * Make sure we don't change while someone holds a
-+ * reference to the line discipline. The TTY_LDISC bit
-+ * prevents anyone taking a reference once it is clear.
-+ * We need the lock to avoid racing reference takers.
-+ */
-+
-+ spin_lock_irqsave(&tty_ldisc_lock, flags);
-+ if(tty->ldisc.refcount)
-+ {
-+ /* Free the new ldisc we grabbed. Must drop the lock
-+ first. */
-+ spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-+ tty_ldisc_put(ldisc);
-+ if(wait_event_interruptible(tty_ldisc_wait, tty->ldisc.refcount == 0) < 0)
-+ return -ERESTARTSYS;
-+ goto restart;
-+ }
-+ clear_bit(TTY_LDISC, &tty->flags);
-+ clear_bit(TTY_DONT_FLIP, &tty->flags);
-+ spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-
-+ /*
-+ * From this point on we know nobody has an ldisc
-+ * usage reference, nor can they obtain one until
-+ * we say so later on.
-+ */
-+
-+ o_ldisc = tty->ldisc;
- tty_wait_until_sent(tty, 0);
-
- /* Shutdown the current discipline. */
-@@ -307,16 +526,20 @@ static int tty_set_ldisc(struct tty_stru
- (tty->ldisc.close)(tty);
-
- /* Now set up the new line discipline. */
-- tty->ldisc = ldiscs[ldisc];
-- tty->termios->c_line = ldisc;
-+ tty_ldisc_assign(tty, ld);
-+ tty_set_termios_ldisc(tty, ldisc);
- if (tty->ldisc.open)
- retval = (tty->ldisc.open)(tty);
- if (retval < 0) {
-- tty->ldisc = o_ldisc;
-- tty->termios->c_line = tty->ldisc.num;
-+ tty_ldisc_put(ldisc);
-+ /* There is an outstanding reference here so this is safe */
-+ tty_ldisc_assign(tty, tty_ldisc_get(o_ldisc.num));
-+ tty_set_termios_ldisc(tty, tty->ldisc.num);
- if (tty->ldisc.open && (tty->ldisc.open(tty) < 0)) {
-- tty->ldisc = ldiscs[N_TTY];
-- tty->termios->c_line = N_TTY;
-+ tty_ldisc_put(o_ldisc.num);
-+ /* This driver is always present */
-+ tty_ldisc_assign(tty, tty_ldisc_get(N_TTY));
-+ tty_set_termios_ldisc(tty, N_TTY);
- if (tty->ldisc.open) {
- int r = tty->ldisc.open(tty);
-
-@@ -327,8 +550,23 @@ static int tty_set_ldisc(struct tty_stru
- }
- }
- }
-+ /* At this point we hold a reference to the new ldisc and a
-+ reference to the old ldisc. If we ended up flipping back
-+ to the existing ldisc we have two references to it */
-+
- if (tty->ldisc.num != o_ldisc.num && tty->driver.set_ldisc)
- tty->driver.set_ldisc(tty);
-+
-+ tty_ldisc_put(o_ldisc.num);
-+
-+ /*
-+ * Allow ldisc referencing to occur as soon as the driver
-+ * ldisc callback completes.
-+ */
-+
-+ set_bit(TTY_LDISC, &tty->flags);
-+ wake_up(&tty_ldisc_wait);
-+
- return retval;
- }
-
-@@ -430,6 +668,27 @@ static struct file_operations hung_up_tt
-
- static spinlock_t redirect_lock = SPIN_LOCK_UNLOCKED;
- static struct file *redirect;
-+
-+/*
-+ * Internal and external helper for wakeups of tty
-+ */
-+
-+void tty_wakeup(struct tty_struct *tty)
-+{
-+ struct tty_ldisc *ld;
-+
-+ if (test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) {
-+ ld = tty_ldisc_ref(tty);
-+ if(ld) {
-+ if(ld->write_wakeup)
-+ ld->write_wakeup(tty);
-+ tty_ldisc_deref(ld);
-+ }
-+ }
-+}
-+
-+EXPORT_SYMBOL_GPL(tty_wakeup);
-+
- /*
- * This can be called by the "eventd" kernel thread. That is process synchronous,
- * but doesn't hold any locks, so we need to make sure we have the appropriate
-@@ -442,6 +701,7 @@ void do_tty_hangup(void *data)
- struct file *f = NULL;
- struct task_struct *p;
- struct list_head *l;
-+ struct tty_ldisc *ld;
- int closecount = 0, n;
-
- if (!tty)
-@@ -475,18 +735,17 @@ void do_tty_hangup(void *data)
- file_list_unlock();
-
- /* FIXME! What are the locking issues here? This may me overdoing things.. */
-+ ld = tty_ldisc_ref(tty);
-+ if(ld != NULL)
- {
-- unsigned long flags;
--
-- save_flags(flags); cli();
-- if (tty->ldisc.flush_buffer)
-- tty->ldisc.flush_buffer(tty);
-+ if (ld->flush_buffer)
-+ ld->flush_buffer(tty);
- if (tty->driver.flush_buffer)
- tty->driver.flush_buffer(tty);
-- if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) &&
-- tty->ldisc.write_wakeup)
-- (tty->ldisc.write_wakeup)(tty);
-- restore_flags(flags);
-+ if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) && ld->write_wakeup)
-+ ld->write_wakeup(tty);
-+ //if (ld->hangup)
-+ // ld->hangup(tty);
- }
-
- wake_up_interruptible(&tty->write_wait);
-@@ -496,21 +755,18 @@ void do_tty_hangup(void *data)
- * Shutdown the current line discipline, and reset it to
- * N_TTY.
- */
-+
- if (tty->driver.flags & TTY_DRIVER_RESET_TERMIOS)
-- *tty->termios = tty->driver.init_termios;
-- if (tty->ldisc.num != ldiscs[N_TTY].num) {
-- if (tty->ldisc.close)
-- (tty->ldisc.close)(tty);
-- tty->ldisc = ldiscs[N_TTY];
-- tty->termios->c_line = N_TTY;
-- if (tty->ldisc.open) {
-- int i = (tty->ldisc.open)(tty);
-- if (i < 0)
-- printk(KERN_ERR "do_tty_hangup: N_TTY open: "
-- "error %d\n", -i);
-- }
-+ {
-+ unsigned long flags;
-+ spin_lock_irqsave(&tty_termios_lock, flags);
-+ *tty->termios = tty->driver.init_termios;
-+ spin_unlock_irqrestore(&tty_termios_lock, flags);
- }
--
-+
-+ /* Defer ldisc switch */
-+ /* tty_deferred_ldisc_switch(N_TTY);
-+
- read_lock(&tasklist_lock);
- for_each_task(p) {
- if ((tty->session > 0) && (p->session == tty->session) &&
-@@ -541,6 +797,15 @@ void do_tty_hangup(void *data)
- tty->driver.close(tty, cons_filp);
- } else if (tty->driver.hangup)
- (tty->driver.hangup)(tty);
-+
-+ /* We don't want to have driver/ldisc interactions beyond
-+ the ones we did here. The driver layer expects no
-+ calls after ->hangup() from the ldisc side. However we
-+ can't yet guarantee all that */
-+
-+ set_bit(TTY_HUPPED, &tty->flags);
-+ if(ld)
-+ tty_ldisc_deref(ld);
- unlock_kernel();
- if (f)
- fput(f);
-@@ -644,9 +909,8 @@ void start_tty(struct tty_struct *tty)
- }
- if (tty->driver.start)
- (tty->driver.start)(tty);
-- if ((test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags)) &&
-- tty->ldisc.write_wakeup)
-- (tty->ldisc.write_wakeup)(tty);
-+ /* If we have a running line discipline it may need kicking */
-+ tty_wakeup(tty);
- wake_up_interruptible(&tty->write_wait);
- }
-
-@@ -656,6 +920,7 @@ static ssize_t tty_read(struct file * fi
- int i;
- struct tty_struct * tty;
- struct inode *inode;
-+ struct tty_ldisc *ld;
-
- /* Can't seek (pread) on ttys. */
- if (ppos != &file->f_pos)
-@@ -684,11 +949,15 @@ static ssize_t tty_read(struct file * fi
- return -ERESTARTSYS;
- }
- #endif
-+ /* We want to wait for the line discipline to sort out in this
-+ situation */
-+ ld = tty_ldisc_ref_wait(tty);
- lock_kernel();
-- if (tty->ldisc.read)
-- i = (tty->ldisc.read)(tty,file,buf,count);
-+ if (ld->read)
-+ i = (ld->read)(tty,file,buf,count);
- else
- i = -EIO;
-+ tty_ldisc_deref(ld);
- unlock_kernel();
- if (i > 0)
- inode->i_atime = CURRENT_TIME;
-@@ -757,6 +1026,8 @@ static ssize_t tty_write(struct file * f
- int is_console;
- struct tty_struct * tty;
- struct inode *inode = file->f_dentry->d_inode;
-+ ssize_t ret;
-+ struct tty_ldisc *ld;
-
- /* Can't seek (pwrite) on ttys. */
- if (ppos != &file->f_pos)
-@@ -803,10 +1074,15 @@ static ssize_t tty_write(struct file * f
- }
- }
- #endif
-- if (!tty->ldisc.write)
-- return -EIO;
-- return do_tty_write(tty->ldisc.write, tty, file,
-- (const unsigned char *)buf, count);
-+
-+ ld = tty_ldisc_ref_wait(tty);
-+ if (!ld->write)
-+ ret = -EIO;
-+ else
-+ ret = do_tty_write(ld->write, tty, file,
-+ (const unsigned char __user *)buf, count);
-+ tty_ldisc_deref(ld);
-+ return ret;
- }
-
- /* Semaphore to protect creating and releasing a tty */
-@@ -971,7 +1247,9 @@ static int init_dev(kdev_t device, struc
- (tty->ldisc.close)(tty);
- goto release_mem_out;
- }
-+ set_bit(TTY_LDISC, &o_tty->flags);
- }
-+ set_bit(TTY_LDISC, &tty->flags);
- goto success;
-
- /*
-@@ -999,7 +1277,9 @@ fast_track:
- }
- tty->count++;
- tty->driver = *driver; /* N.B. why do this every time?? */
--
-+ /* FIXME */
-+ if(!test_bit(TTY_LDISC, &tty->flags))
-+ printk(KERN_ERR "init_dev but no ldisc\n");
- success:
- *ret_tty = tty;
-
-@@ -1080,6 +1360,7 @@ static void release_dev(struct file * fi
- int pty_master, tty_closing, o_tty_closing, do_sleep;
- int idx;
- char buf[64];
-+ unsigned long flags;
-
- tty = (struct tty_struct *)filp->private_data;
- if (tty_paranoia_check(tty, filp->f_dentry->d_inode->i_rdev, "release_dev"))
-@@ -1272,17 +1553,51 @@ static void release_dev(struct file * fi
- #endif
-
- /*
-+ * Prevent flush_to_ldisc() from rescheduling the work for later. Then
-+ * kill any delayed work. As this is the final close it does not
-+ * race with the set_ldisc code path.
-+ */
-+ clear_bit(TTY_LDISC, &tty->flags);
-+ clear_bit(TTY_DONT_FLIP, &tty->flags);
-+
-+ /*
-+ * Wait for any short term users (we know they are just driver
-+ * side waiters as the file is closing so user count on the file
-+ * side is zero.
-+ */
-+
-+ spin_lock_irqsave(&tty_ldisc_lock, flags);
-+ while(tty->ldisc.refcount)
-+ {
-+ spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-+ wait_event(tty_ldisc_wait, tty->ldisc.refcount == 0);
-+ spin_lock_irqsave(&tty_ldisc_lock, flags);
-+ }
-+ spin_unlock_irqrestore(&tty_ldisc_lock, flags);
-+
-+ /*
- * Shutdown the current line discipline, and reset it to N_TTY.
- * N.B. why reset ldisc when we're releasing the memory??
-+ * FIXME: this MUST get fixed for the new reflocking
- */
- if (tty->ldisc.close)
- (tty->ldisc.close)(tty);
-- tty->ldisc = ldiscs[N_TTY];
-- tty->termios->c_line = N_TTY;
-+ tty_ldisc_put(tty->ldisc.num);
-+
-+ /*
-+ * Switch the line discipline back
-+ */
-+ tty_ldisc_assign(tty, tty_ldisc_get(N_TTY));
-+ tty_set_termios_ldisc(tty,N_TTY);
-+
- if (o_tty) {
-+ /* FIXME: could o_tty be in setldisc here ? */
-+ clear_bit(TTY_LDISC, &o_tty->flags);
- if (o_tty->ldisc.close)
- (o_tty->ldisc.close)(o_tty);
-- o_tty->ldisc = ldiscs[N_TTY];
-+ tty_ldisc_put(o_tty->ldisc.num);
-+ tty_ldisc_assign(o_tty, tty_ldisc_get(N_TTY));
-+ tty_set_termios_ldisc(o_tty,N_TTY);
- }
-
- /*
-@@ -1464,14 +1779,18 @@ static int tty_release(struct inode * in
- static unsigned int tty_poll(struct file * filp, poll_table * wait)
- {
- struct tty_struct * tty;
-+ struct tty_ldisc *ld;
-+ int ret = 0;
-
- tty = (struct tty_struct *)filp->private_data;
- if (tty_paranoia_check(tty, filp->f_dentry->d_inode->i_rdev, "tty_poll"))
- return 0;
-
-- if (tty->ldisc.poll)
-- return (tty->ldisc.poll)(tty, filp, wait);
-- return 0;
-+ ld = tty_ldisc_ref_wait(tty);
-+ if (ld->poll)
-+ ret = (ld->poll)(tty, filp, wait);
-+ tty_ldisc_deref(ld);
-+ return ret;
- }
-
- static int tty_fasync(int fd, struct file * filp, int on)
-@@ -1505,12 +1824,15 @@ static int tty_fasync(int fd, struct fil
- static int tiocsti(struct tty_struct *tty, char * arg)
- {
- char ch, mbz = 0;
-+ struct tty_ldisc *ld;
-
- if ((current->tty != tty) && !suser())
- return -EPERM;
- if (get_user(ch, arg))
- return -EFAULT;
-- tty->ldisc.receive_buf(tty, &ch, &mbz, 1);
-+ ld = tty_ldisc_ref_wait(tty);
-+ ld->receive_buf(tty, &ch, &mbz, 1);
-+ tty_ldisc_deref(ld);
- return 0;
- }
-
-@@ -1718,6 +2040,7 @@ int tty_ioctl(struct inode * inode, stru
- {
- struct tty_struct *tty, *real_tty;
- int retval;
-+ struct tty_ldisc *ld;
-
- tty = (struct tty_struct *)file->private_data;
- if (tty_paranoia_check(tty, inode->i_rdev, "tty_ioctl"))
-@@ -1808,6 +2131,7 @@ int tty_ioctl(struct inode * inode, stru
- case TIOCGSID:
- return tiocgsid(tty, real_tty, (pid_t *) arg);
- case TIOCGETD:
-+ /* FIXME: check this is ok */
- return put_user(tty->ldisc.num, (int *) arg);
- case TIOCSETD:
- return tiocsetd(tty, (int *) arg);
-@@ -1841,16 +2165,20 @@ int tty_ioctl(struct inode * inode, stru
- return send_break(tty, arg ? arg*(HZ/10) : HZ/4);
- }
- if (tty->driver.ioctl) {
-- int retval = (tty->driver.ioctl)(tty, file, cmd, arg);
-+ retval = (tty->driver.ioctl)(tty, file, cmd, arg);
- if (retval != -ENOIOCTLCMD)
- return retval;
- }
-- if (tty->ldisc.ioctl) {
-- int retval = (tty->ldisc.ioctl)(tty, file, cmd, arg);
-- if (retval != -ENOIOCTLCMD)
-- return retval;
-+ ld = tty_ldisc_ref_wait(tty);
-+ retval = -EINVAL;
-+ if (ld->ioctl) {
-+ if(likely(test_bit(TTY_LDISC, &tty->flags)))
-+ retval = ld->ioctl(tty, file, cmd, arg);
-+ if (retval == -ENOIOCTLCMD)
-+ retval = -EINVAL;
- }
-- return -EINVAL;
-+ tty_ldisc_deref(ld);
-+ return retval;
- }
-
-
-@@ -1883,14 +2211,20 @@ static void __do_SAK(void *arg)
- int session;
- int i;
- struct file *filp;
-+ struct tty_ldisc *disc;
-
- if (!tty)
- return;
- session = tty->session;
-- if (tty->ldisc.flush_buffer)
-- tty->ldisc.flush_buffer(tty);
-+ /* We don't want an ldisc switch during this */
-+ disc = tty_ldisc_ref(tty);
-+ if (disc && disc->flush_buffer)
-+ disc->flush_buffer(tty);
-+ tty_ldisc_deref(disc);
-+
- if (tty->driver.flush_buffer)
- tty->driver.flush_buffer(tty);
-+
- read_lock(&tasklist_lock);
- for_each_task(p) {
- if ((p->tty == tty) ||
-@@ -1942,11 +2276,16 @@ static void flush_to_ldisc(void *private
- unsigned char *cp;
- char *fp;
- int count;
-- unsigned long flags;
-+ unsigned long flags;
-+ struct tty_ldisc *disc;
-+
-+ disc = tty_ldisc_ref(tty);
-+ if (disc == NULL) /* !TTY_LDISC */
-+ return;
-
- if (test_bit(TTY_DONT_FLIP, &tty->flags)) {
- queue_task(&tty->flip.tqueue, &tq_timer);
-- return;
-+ goto out;
- }
- if (tty->flip.buf_num) {
- cp = tty->flip.char_buf + TTY_FLIPBUF_SIZE;
-@@ -1969,7 +2308,31 @@ static void flush_to_ldisc(void *private
- tty->flip.count = 0;
- restore_flags(flags);
-
-- tty->ldisc.receive_buf(tty, cp, fp, count);
-+ disc->receive_buf(tty, cp, fp, count);
-+out:
-+ tty_ldisc_deref(disc);
-+}
-+
-+/*
-+ * Call the ldisc flush directly from a driver. This function may
-+ * return an error and need retrying by the user.
-+ */
-+
-+int tty_push_data(struct tty_struct *tty, unsigned char *cp, unsigned char *fp, int count)
-+{
-+ int ret = 0;
-+ struct tty_ldisc *disc;
-+
-+ disc = tty_ldisc_ref(tty);
-+ if(test_bit(TTY_DONT_FLIP, &tty->flags))
-+ ret = -EAGAIN;
-+ else if(disc == NULL)
-+ ret = -EIO;
-+ else
-+ disc->receive_buf(tty, cp, fp, count);
-+ tty_ldisc_deref(disc);
-+ return ret;
-+
- }
-
- /*
-@@ -2032,7 +2395,7 @@ static void initialize_tty_struct(struct
- {
- memset(tty, 0, sizeof(struct tty_struct));
- tty->magic = TTY_MAGIC;
-- tty->ldisc = ldiscs[N_TTY];
-+ tty_ldisc_assign(tty, tty_ldisc_get(N_TTY));
- tty->pgrp = -1;
- tty->flip.char_buf_ptr = tty->flip.char_buf;
- tty->flip.flag_buf_ptr = tty->flip.flag_buf;
-@@ -2217,7 +2580,7 @@ int tty_unregister_driver(struct tty_dri
- void __init console_init(void)
- {
- /* Setup the default TTY line discipline. */
-- memset(ldiscs, 0, sizeof(ldiscs));
-+ memset(tty_ldiscs, 0, NR_LDISCS*sizeof(struct tty_ldisc));
- (void) tty_register_ldisc(N_TTY, &tty_ldisc_N_TTY);
-
- /*
---- linux-2.4.27/drivers/char/tty_ioctl.c.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/drivers/char/tty_ioctl.c Thu Sep 23 19:52:27 2004
-@@ -29,6 +29,8 @@
-
- #undef DEBUG
-
-+extern spinlock_t tty_termios_lock;
-+
- /*
- * Internal flag options for termios setting behavior
- */
-@@ -96,8 +98,17 @@ static void change_termios(struct tty_st
- {
- int canon_change;
- struct termios old_termios = *tty->termios;
-+ struct tty_ldisc *ld;
-+ unsigned long flags;
-+
-+ /*
-+ * Perform the actual termios internal changes under lock.
-+ */
-+
-+ /* FIXME: we need to decide on some locking/ordering semantics
-+ for the set_termios notification eventually */
-+ spin_lock_irqsave(&tty_termios_lock, flags);
-
-- cli();
- *tty->termios = *new_termios;
- unset_locked_termios(tty->termios, &old_termios, tty->termios_locked);
- canon_change = (old_termios.c_lflag ^ tty->termios->c_lflag) & ICANON;
-@@ -107,7 +118,6 @@ static void change_termios(struct tty_st
- tty->canon_data = 0;
- tty->erasing = 0;
- }
-- sti();
- if (canon_change && !L_ICANON(tty) && tty->read_cnt)
- /* Get characters left over from canonical mode. */
- wake_up_interruptible(&tty->read_wait);
-@@ -131,16 +141,20 @@ static void change_termios(struct tty_st
- }
- }
-
-- if (tty->driver.set_termios)
-- (*tty->driver.set_termios)(tty, &old_termios);
-+ ld = tty_ldisc_ref(tty);
-+ if (ld != NULL) {
-+ if (ld->set_termios)
-+ (ld->set_termios)(tty, &old_termios);
-+ tty_ldisc_deref(ld);
-+ }
-+ spin_unlock_irqrestore(&tty_termios_lock, flags);
-
-- if (tty->ldisc.set_termios)
-- (*tty->ldisc.set_termios)(tty, &old_termios);
- }
-
- static int set_termios(struct tty_struct * tty, unsigned long arg, int opt)
- {
- struct termios tmp_termios;
-+ struct tty_ldisc *ld;
- int retval = tty_check_change(tty);
-
- if (retval)
-@@ -157,8 +171,13 @@ static int set_termios(struct tty_struct
- return -EFAULT;
- }
-
-- if ((opt & TERMIOS_FLUSH) && tty->ldisc.flush_buffer)
-- tty->ldisc.flush_buffer(tty);
-+ ld = tty_ldisc_ref(tty);
-+
-+ if (ld != NULL) {
-+ if ((opt & TERMIOS_FLUSH) && ld->flush_buffer)
-+ ld->flush_buffer(tty);
-+ tty_ldisc_deref(ld);
-+ }
-
- if (opt & TERMIOS_WAIT) {
- tty_wait_until_sent(tty, 0);
-@@ -223,12 +242,16 @@ static int get_sgflags(struct tty_struct
- static int get_sgttyb(struct tty_struct * tty, struct sgttyb * sgttyb)
- {
- struct sgttyb tmp;
-+ unsigned long flags;
-
-+ spin_lock_irqsave(&tty_termios_lock, flags);
- tmp.sg_ispeed = 0;
- tmp.sg_ospeed = 0;
- tmp.sg_erase = tty->termios->c_cc[VERASE];
- tmp.sg_kill = tty->termios->c_cc[VKILL];
- tmp.sg_flags = get_sgflags(tty);
-+ spin_unlock_irqrestore(&tty_termios_lock, flags);
-+
- return copy_to_user(sgttyb, &tmp, sizeof(tmp)) ? -EFAULT : 0;
- }
-
-@@ -267,12 +290,14 @@ static int set_sgttyb(struct tty_struct
- retval = tty_check_change(tty);
- if (retval)
- return retval;
-- termios = *tty->termios;
- if (copy_from_user(&tmp, sgttyb, sizeof(tmp)))
- return -EFAULT;
-+ spin_lock_irqsave(&tty_termios_lock, flags);
-+ termios = *tty->termios;
- termios.c_cc[VERASE] = tmp.sg_erase;
- termios.c_cc[VKILL] = tmp.sg_kill;
- set_sgflags(&termios, tmp.sg_flags);
-+ spin_unlock_irqrestore(&tty_termios_lock, flags);
- change_termios(tty, &termios);
- return 0;
- }
-@@ -362,6 +387,8 @@ int n_tty_ioctl(struct tty_struct * tty,
- {
- struct tty_struct * real_tty;
- int retval;
-+ struct tty_ldisc *ld;
-+ unsigned long flags;
-
- if (tty->driver.type == TTY_DRIVER_TYPE_PTY &&
- tty->driver.subtype == PTY_TYPE_MASTER)
-@@ -440,22 +467,26 @@ int n_tty_ioctl(struct tty_struct * tty,
- retval = tty_check_change(tty);
- if (retval)
- return retval;
-+
-+ ld = tty_ldisc_ref(tty);
- switch (arg) {
- case TCIFLUSH:
-- if (tty->ldisc.flush_buffer)
-- tty->ldisc.flush_buffer(tty);
-+ if (ld->flush_buffer)
-+ ld->flush_buffer(tty);
- break;
- case TCIOFLUSH:
-- if (tty->ldisc.flush_buffer)
-- tty->ldisc.flush_buffer(tty);
-+ if (ld->flush_buffer)
-+ ld->flush_buffer(tty);
- /* fall through */
- case TCOFLUSH:
- if (tty->driver.flush_buffer)
- tty->driver.flush_buffer(tty);
- break;
- default:
-+ tty_ldisc_deref(ld);
- return -EINVAL;
- }
-+ tty_ldisc_deref(ld);
- return 0;
- case TIOCOUTQ:
- return put_user(tty->driver.chars_in_buffer ?
-@@ -501,9 +532,11 @@ int n_tty_ioctl(struct tty_struct * tty,
- case TIOCSSOFTCAR:
- if (get_user(arg, (unsigned int *) arg))
- return -EFAULT;
-+ spin_lock_irqsave(&tty_termios_lock, flags);
- tty->termios->c_cflag =
- ((tty->termios->c_cflag & ~CLOCAL) |
- (arg ? CLOCAL : 0));
-+ spin_unlock_irqrestore(&tty_termios_lock, flags);
- return 0;
- default:
- return -ENOIOCTLCMD;
---- linux-2.4.27/drivers/char/amiserial.c.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/drivers/char/amiserial.c Thu Sep 23 17:24:33 2004
-@@ -575,9 +575,7 @@ static void do_softint(void *private_)
- return;
-
- if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event)) {
-- if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-- tty->ldisc.write_wakeup)
-- (tty->ldisc.write_wakeup)(tty);
-+ tty_wakeup(tty);
- wake_up_interruptible(&tty->write_wait);
- }
- }
-@@ -1041,9 +1039,7 @@ static void rs_flush_buffer(struct tty_s
- info->xmit.head = info->xmit.tail = 0;
- restore_flags(flags);
- wake_up_interruptible(&tty->write_wait);
-- if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-- tty->ldisc.write_wakeup)
-- (tty->ldisc.write_wakeup)(tty);
-+ tty_wakeup(tty);
- }
-
- /*
-@@ -1526,6 +1522,7 @@ static void rs_close(struct tty_struct *
- struct async_struct * info = (struct async_struct *)tty->driver_data;
- struct serial_state *state;
- unsigned long flags;
-+ struct tty_ldisc *ld;
-
- if (!info || serial_paranoia_check(info, tty->device, "rs_close"))
- return;
-@@ -1608,8 +1605,12 @@ static void rs_close(struct tty_struct *
- shutdown(info);
- if (tty->driver.flush_buffer)
- tty->driver.flush_buffer(tty);
-- if (tty->ldisc.flush_buffer)
-- tty->ldisc.flush_buffer(tty);
-+ ld = tty_ldisc_ref(tty);
-+ if (ld != NULL) {
-+ if (ld->flush_buffer)
-+ ld->flush_buffer(tty);
-+ tty_ldisc_deref(ld);
-+ }
- tty->closing = 0;
- info->event = 0;
- info->tty = 0;
---- linux-2.4.27/drivers/char/cyclades.c.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/drivers/char/cyclades.c Thu Sep 23 17:24:33 2004
-@@ -1000,10 +1000,7 @@ do_softint(void *private_)
- wake_up_interruptible(&info->delta_msr_wait);
- }
- if (test_and_clear_bit(Cy_EVENT_WRITE_WAKEUP, &info->event)) {
-- if((tty->flags & (1<< TTY_DO_WRITE_WAKEUP))
-- && tty->ldisc.write_wakeup){
-- (tty->ldisc.write_wakeup)(tty);
-- }
-+ tty_wakeup(tty);
- wake_up_interruptible(&tty->write_wait);
- }
- #ifdef Z_WAKE
-@@ -2801,6 +2798,7 @@ static void
- cy_close(struct tty_struct *tty, struct file *filp)
- {
- struct cyclades_port *info = (struct cyclades_port *)tty->driver_data;
-+ struct tty_ldisc *ld;
- unsigned long flags;
-
- #ifdef CY_DEBUG_OTHER
-@@ -2918,8 +2916,13 @@ cy_close(struct tty_struct *tty, struct
- shutdown(info);
- if (tty->driver.flush_buffer)
- tty->driver.flush_buffer(tty);
-- if (tty->ldisc.flush_buffer)
-- tty->ldisc.flush_buffer(tty);
-+
-+ ld = tty_ldisc_ref(tty);
-+ if (ld) {
-+ if (ld->flush_buffer)
-+ ld->flush_buffer(tty);
-+ tty_ldisc_deref(ld);
-+ }
- CY_LOCK(info, flags);
-
- tty->closing = 0;
-@@ -4689,10 +4692,8 @@ cy_flush_buffer(struct tty_struct *tty)
- }
- CY_UNLOCK(info, flags);
- }
-+ tty_wakeup(tty);
- wake_up_interruptible(&tty->write_wait);
-- if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP))
-- && tty->ldisc.write_wakeup)
-- (tty->ldisc.write_wakeup)(tty);
- } /* cy_flush_buffer */
-
-
---- linux-2.4.27/drivers/char/epca.c.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/drivers/char/epca.c Thu Sep 23 18:04:17 2004
-@@ -524,6 +524,7 @@ static void pc_close(struct tty_struct *
-
- if ((ch = verifyChannel(tty)) != NULL)
- { /* Begin if ch != NULL */
-+ struct tty_ldisc *ld;
-
- save_flags(flags);
- cli();
-@@ -585,8 +586,12 @@ static void pc_close(struct tty_struct *
- if (tty->driver.flush_buffer)
- tty->driver.flush_buffer(tty);
-
-- if (tty->ldisc.flush_buffer)
-- tty->ldisc.flush_buffer(tty);
-+ ld = tty_ldisc_ref(tty);
-+ if (ld != NULL) {
-+ if(ld->flush_buffer)
-+ ld->flush_buffer(tty);
-+ tty_ldisc_deref(ld);
-+ }
-
- shutdown(ch);
- tty->closing = 0;
-@@ -687,12 +692,20 @@ static void pc_hangup(struct tty_struct
- { /* Begin if ch != NULL */
-
- unsigned long flags;
-+ struct tty_ldisc *ld;
-
- save_flags(flags);
- cli();
- if (tty->driver.flush_buffer)
- tty->driver.flush_buffer(tty);
-
-+ ld = tty_ldisc_ref(tty);
-+ if (ld != NULL) {
-+ if (ld->flush_buffer)
-+ ld->flush_buffer(tty);
-+ tty_ldisc_deref(ld);
-+ }
-+
- if (tty->ldisc.flush_buffer)
- tty->ldisc.flush_buffer(tty);
-
-@@ -1176,8 +1189,7 @@ static void pc_flush_buffer(struct tty_s
- restore_flags(flags);
-
- wake_up_interruptible(&tty->write_wait);
-- if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) && tty->ldisc.write_wakeup)
-- (tty->ldisc.write_wakeup)(tty);
-+ tty_wakeup(tty);
-
- } /* End pc_flush_buffer */
-
-@@ -2383,9 +2395,7 @@ static void doevent(int crd)
- { /* Begin if LOWWAIT */
-
- ch->statusflags &= ~LOWWAIT;
-- if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-- tty->ldisc.write_wakeup)
-- (tty->ldisc.write_wakeup)(tty);
-+ tty_wakeup(tty);
- wake_up_interruptible(&tty->write_wait);
-
- } /* End if LOWWAIT */
-@@ -2402,9 +2412,7 @@ static void doevent(int crd)
- { /* Begin if EMPTYWAIT */
-
- ch->statusflags &= ~EMPTYWAIT;
-- if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-- tty->ldisc.write_wakeup)
-- (tty->ldisc.write_wakeup)(tty);
-+ tty_wakeup(tty);
-
- wake_up_interruptible(&tty->write_wait);
-
-@@ -3255,6 +3263,7 @@ static int pc_ioctl(struct tty_struct *t
- }
- else
- {
-+ /* ldisc lock already held in ioctl */
- if (tty->ldisc.flush_buffer)
- tty->ldisc.flush_buffer(tty);
- }
---- linux-2.4.27/drivers/char/generic_serial.c.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/drivers/char/generic_serial.c Thu Sep 23 18:11:06 2004
-@@ -440,9 +440,7 @@ void gs_flush_buffer(struct tty_struct *
- restore_flags(flags);
-
- wake_up_interruptible(&tty->write_wait);
-- if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-- tty->ldisc.write_wakeup)
-- (tty->ldisc.write_wakeup)(tty);
-+ tty_wakeup(tty);
- func_exit ();
- }
-
-@@ -582,9 +580,7 @@ void gs_do_softint(void *private_)
- if (!tty) return;
-
- if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &port->event)) {
-- if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-- tty->ldisc.write_wakeup)
-- (tty->ldisc.write_wakeup)(tty);
-+ tty_wakeup(tty);
- wake_up_interruptible(&tty->write_wait);
- }
- func_exit ();
-@@ -729,8 +725,9 @@ void gs_close(struct tty_struct * tty, s
- {
- unsigned long flags;
- struct gs_port *port;
--
-- func_enter ();
-+ struct tty_ldisc *ld;
-+
-+ func_enter();
-
- if (!tty) return;
-
-@@ -803,8 +800,12 @@ void gs_close(struct tty_struct * tty, s
-
- if (tty->driver.flush_buffer)
- tty->driver.flush_buffer(tty);
-- if (tty->ldisc.flush_buffer)
-- tty->ldisc.flush_buffer(tty);
-+ ld = tty_ldisc_ref(tty);
-+ if (ld != NULL) {
-+ if (ld->flush_buffer)
-+ ld->flush_buffer(tty);
-+ tty_ldisc_deref(ld);
-+ }
- tty->closing = 0;
-
- port->event = 0;
---- linux-2.4.27/drivers/char/isicom.c.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/drivers/char/isicom.c Thu Sep 23 17:24:34 2004
-@@ -502,10 +502,8 @@ static void isicom_bottomhalf(void * dat
-
- if (!tty)
- return;
--
-- if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-- tty->ldisc.write_wakeup)
-- (tty->ldisc.write_wakeup)(tty);
-+
-+ tty_wakeup(tty);
- wake_up_interruptible(&tty->write_wait);
- }
-
-@@ -1144,6 +1142,7 @@ static void isicom_close(struct tty_stru
- struct isi_port * port = (struct isi_port *) tty->driver_data;
- struct isi_board * card = port->card;
- unsigned long flags;
-+ struct tty_ldisc *ld;
-
- if (!port)
- return;
-@@ -1199,6 +1198,12 @@ static void isicom_close(struct tty_stru
- isicom_shutdown_port(port);
- if (tty->driver.flush_buffer)
- tty->driver.flush_buffer(tty);
-+ ld = tty_ldisc_ref(tty);
-+ if (ld != NULL) {
-+ if (ld->flush_buffer)
-+ ld->flush_buffer(tty);
-+ tty_ldisc_deref(ld);
-+ }
- if (tty->ldisc.flush_buffer)
- tty->ldisc.flush_buffer(tty);
- tty->closing = 0;
-@@ -1671,9 +1676,7 @@ static void isicom_flush_buffer(struct t
- restore_flags(flags);
-
- wake_up_interruptible(&tty->write_wait);
-- if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-- tty->ldisc.write_wakeup)
-- (tty->ldisc.write_wakeup)(tty);
-+ tty_wakeup(tty);
- }
-
-
---- linux-2.4.27/drivers/char/moxa.c.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/drivers/char/moxa.c Thu Sep 23 18:03:44 2004
-@@ -620,6 +620,7 @@ static void moxa_close(struct tty_struct
- {
- struct moxa_str *ch;
- int port;
-+ struct tty_ldisc *ld;
-
- port = PORTNO(tty);
- if (port == MAX_PORTS) {
-@@ -677,8 +678,13 @@ static void moxa_close(struct tty_struct
-
- if (tty->driver.flush_buffer)
- tty->driver.flush_buffer(tty);
-- if (tty->ldisc.flush_buffer)
-- tty->ldisc.flush_buffer(tty);
-+
-+ ld = tty_ldisc_ref(tty);
-+ if (ld != NULL) {
-+ if (ld->flush_buffer)
-+ ld->flush_buffer(tty);
-+ tty_ldisc_deref(ld);
-+ }
- tty->closing = 0;
- ch->event = 0;
- ch->tty = 0;
-@@ -754,9 +760,7 @@ static void moxa_flush_buffer(struct tty
- if (ch == NULL)
- return;
- MoxaPortFlushData(ch->port, 1);
-- if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-- tty->ldisc.write_wakeup)
-- (tty->ldisc.write_wakeup) (tty);
-+ tty_wakeup(tty);
- wake_up_interruptible(&tty->write_wait);
- }
-
-@@ -992,7 +996,6 @@ static void moxa_poll(unsigned long igno
- moxaTimer.function = moxa_poll;
- moxaTimer.expires = jiffies + (HZ / 50);
- moxaTimer_on = 1;
-- add_timer(&moxaTimer);
- return;
- }
- for (card = 0; card < MAX_BOARDS; card++) {
-@@ -1011,9 +1014,7 @@ static void moxa_poll(unsigned long igno
- if (MoxaPortTxQueue(ch->port) <= WAKEUP_CHARS) {
- if (!tp->stopped) {
- ch->statusflags &= ~LOWWAIT;
-- if ((tp->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-- tp->ldisc.write_wakeup)
-- (tp->ldisc.write_wakeup) (tp);
-+ tty_wakeup(tp);
- wake_up_interruptible(&tp->write_wait);
- }
- }
-@@ -1203,9 +1204,7 @@ static void check_xmit_empty(unsigned lo
- if (ch->tty && (ch->statusflags & EMPTYWAIT)) {
- if (MoxaPortTxQueue(ch->port) == 0) {
- ch->statusflags &= ~EMPTYWAIT;
-- if ((ch->tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-- ch->tty->ldisc.write_wakeup)
-- (ch->tty->ldisc.write_wakeup) (ch->tty);
-+ tty_wakeup(ch->tty);
- wake_up_interruptible(&ch->tty->write_wait);
- return;
- }
---- linux-2.4.27/drivers/char/mxser.c.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/drivers/char/mxser.c Thu Sep 23 17:24:34 2004
-@@ -725,9 +725,7 @@ static void mxser_do_softint(void *priva
- tty = info->tty;
- if (tty) {
- if (test_and_clear_bit(MXSER_EVENT_TXLOW, &info->event)) {
-- if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-- tty->ldisc.write_wakeup)
-- (tty->ldisc.write_wakeup) (tty);
-+ tty_wakeup(tty);
- wake_up_interruptible(&tty->write_wait);
- }
- if (test_and_clear_bit(MXSER_EVENT_HANGUP, &info->event)) {
-@@ -810,6 +808,7 @@ static void mxser_close(struct tty_struc
- struct mxser_struct *info = (struct mxser_struct *) tty->driver_data;
- unsigned long flags;
- unsigned long timeout;
-+ struct tty_ldisc *ld;
-
- if (PORTNO(tty) == MXSER_PORTS)
- return;
-@@ -890,6 +889,12 @@ static void mxser_close(struct tty_struc
- mxser_shutdown(info);
- if (tty->driver.flush_buffer)
- tty->driver.flush_buffer(tty);
-+ ld = tty_ldisc_ref(tty);
-+ if (ld) {
-+ if (ld->flush_buffer)
-+ ld->flush_buffer(tty);
-+ tty_ldisc_deref(ld);
-+ }
- if (tty->ldisc.flush_buffer)
- tty->ldisc.flush_buffer(tty);
- tty->closing = 0;
-@@ -1051,9 +1056,7 @@ static void mxser_flush_buffer(struct tt
- info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;
- restore_flags(flags);
- wake_up_interruptible(&tty->write_wait);
-- if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-- tty->ldisc.write_wakeup)
-- (tty->ldisc.write_wakeup) (tty);
-+ tty_wakeup(tty);
- }
-
- static int mxser_ioctl(struct tty_struct *tty, struct file *file,
---- linux-2.4.27/drivers/char/n_tty.c.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/drivers/char/n_tty.c Fri Sep 24 11:34:05 2004
-@@ -112,11 +112,18 @@ static inline void put_tty_queue(unsigne
- spin_unlock_irqrestore(&tty->read_lock, flags);
- }
-
--/*
-- * Check whether to call the driver.unthrottle function.
-- * We test the TTY_THROTTLED bit first so that it always
-- * indicates the current state.
-+/**
-+ * check_unthrottle - allow new receive data
-+ * @tty; tty device
-+ *
-+ * Check whether to call the driver.unthrottle function.
-+ * We test the TTY_THROTTLED bit first so that it always
-+ * indicates the current state. The decision about whether
-+ * it is worth allowing more input has been taken by the caller.
-+ * Can sleep, may be called under the atomic_read semaphore but
-+ * this is not guaranteed.
- */
-+
- static void check_unthrottle(struct tty_struct * tty)
- {
- if (tty->count &&
-@@ -125,10 +132,13 @@ static void check_unthrottle(struct tty_
- tty->driver.unthrottle(tty);
- }
-
--/*
-- * Reset the read buffer counters, clear the flags,
-- * and make sure the driver is unthrottled. Called
-- * from n_tty_open() and n_tty_flush_buffer().
-+/**
-+ * reset_buffer_flags - reset buffer state
-+ * @tty: terminal to reset
-+ *
-+ * Reset the read buffer counters, clear the flags,
-+ * and make sure the driver is unthrottled. Called
-+ * from n_tty_open() and n_tty_flush_buffer().
- */
- static void reset_buffer_flags(struct tty_struct *tty)
- {
-@@ -142,9 +152,19 @@ static void reset_buffer_flags(struct tt
- check_unthrottle(tty);
- }
-
--/*
-- * Flush the input buffer
-+/**
-+ * n_tty_flush_buffer - clean input queue
-+ * @tty: terminal device
-+ *
-+ * Flush the input buffer. Called when the line discipline is
-+ * being closed, when the tty layer wants the buffer flushed (eg
-+ * at hangup) or when the N_TTY line discipline internally has to
-+ * clean the pending queue (for example some signals).
-+ *
-+ * FIXME: tty->ctrl_status is not spinlocked and relies on
-+ * lock_kernel() still.
- */
-+
- void n_tty_flush_buffer(struct tty_struct * tty)
- {
- /* clear everything and unthrottle the driver */
-@@ -159,9 +179,14 @@ void n_tty_flush_buffer(struct tty_struc
- }
- }
-
--/*
-- * Return number of characters buffered to be delivered to user
-+/**
-+ * n_tty_chars_in_buffer - report available bytes
-+ * @tty: tty device
-+ *
-+ * Report the number of characters buffered to be delivered to user
-+ * at this instant in time.
- */
-+
- ssize_t n_tty_chars_in_buffer(struct tty_struct *tty)
- {
- unsigned long flags;
-@@ -242,10 +267,20 @@ static int opost(unsigned char c, struct
- return 0;
- }
-
--/*
-- * opost_block --- to speed up block console writes, among other
-- * things.
-+/**
-+ * opost_block - block postprocess
-+ * @tty: terminal device
-+ * @inbuf: user buffer
-+ * @nr: number of bytes
-+ *
-+ * This path is used to speed up block console writes, among other
-+ * things when processing blocks of output data. It handles only
-+ * the simple cases normally found and helps to generate blocks of
-+ * symbols for the console driver and thus improve performance.
-+ *
-+ * Called from write_chan under the tty layer write lock.
- */
-+
- static ssize_t opost_block(struct tty_struct * tty,
- const unsigned char * inbuf, unsigned int nr)
- {
-@@ -334,6 +369,16 @@ static inline void finish_erasing(struct
- }
- }
-
-+/**
-+ * eraser - handle erase function
-+ * @c: character input
-+ * @tty: terminal device
-+ *
-+ * Perform erase and neccessary output when an erase character is
-+ * present in the stream from the driver layer. Handles the complexities
-+ * of UTF-8 multibyte symbols.
-+ */
-+
- static void eraser(unsigned char c, struct tty_struct *tty)
- {
- enum { ERASE, WERASE, KILL } kill_type;
-@@ -450,6 +495,18 @@ static void eraser(unsigned char c, stru
- finish_erasing(tty);
- }
-
-+/**
-+ * isig - handle the ISIG optio
-+ * @sig: signal
-+ * @tty: terminal
-+ * @flush: force flush
-+ *
-+ * Called when a signal is being sent due to terminal input. This
-+ * may caus terminal flushing to take place according to the termios
-+ * settings and character used. Called from the driver receive_buf
-+ * path so serialized.
-+ */
-+
- static inline void isig(int sig, struct tty_struct *tty, int flush)
- {
- if (tty->pgrp > 0)
-@@ -461,6 +518,16 @@ static inline void isig(int sig, struct
- }
- }
-
-+/**
-+ * n_tty_receive_break - handle break
-+ * @tty: terminal
-+ *
-+ * An RS232 break event has been hit in the incoming bitstream. This
-+ * can cause a variety of events depending upon the termios settings.
-+ *
-+ * Called from the receive_buf path so single threaded.
-+ */
-+
- static inline void n_tty_receive_break(struct tty_struct *tty)
- {
- if (I_IGNBRK(tty))
-@@ -477,19 +544,40 @@ static inline void n_tty_receive_break(s
- wake_up_interruptible(&tty->read_wait);
- }
-
-+/**
-+ * n_tty_receive_overrun - handle overrun reporting
-+ * @tty: terminal
-+ *
-+ * Data arrived faster than we could process it. While the tty
-+ * driver has flagged this the bits that were missed are gone
-+ * forever.
-+ *
-+ * Called from the receive_buf path so single threaded. Does not
-+ * need locking as num_overrun and overrun_time are function
-+ * private.
-+ */
-+
- static inline void n_tty_receive_overrun(struct tty_struct *tty)
- {
- char buf[64];
-
- tty->num_overrun++;
- if (time_before(tty->overrun_time, jiffies - HZ)) {
-- printk("%s: %d input overrun(s)\n", tty_name(tty, buf),
-+ printk(KERN_WARNING "%s: %d input overrun(s)\n", tty_name(tty, buf),
- tty->num_overrun);
- tty->overrun_time = jiffies;
- tty->num_overrun = 0;
- }
- }
-
-+/**
-+ * n_tty_receive_parity_error - error notifier
-+ * @tty: terminal device
-+ * @c: character
-+ *
-+ * Process a parity error and queue the right data to indicate
-+ * the error case if neccessary. Locking as per n_tty_receive_buf.
-+ */
- static inline void n_tty_receive_parity_error(struct tty_struct *tty,
- unsigned char c)
- {
-@@ -507,6 +595,16 @@ static inline void n_tty_receive_parity_
- wake_up_interruptible(&tty->read_wait);
- }
-
-+/**
-+ * n_tty_receive_char - perform processing
-+ * @tty: terminal device
-+ * @c: character
-+ *
-+ * Process an individual character of input received from the driver.
-+ * This is serialized with respect to itself by the rules for the
-+ * driver above.
-+ */
-+
- static inline void n_tty_receive_char(struct tty_struct *tty, unsigned char c)
- {
- unsigned long flags;
-@@ -698,6 +796,16 @@ send_signal:
- put_tty_queue(c, tty);
- }
-
-+/**
-+ * n_tty_receive_room - receive space
-+ * @tty: terminal
-+ *
-+ * Called by the driver to find out how much data it is
-+ * permitted to feed to the line discipline without any being lost
-+ * and thus to manage flow control. Not serialized. Answers for the
-+ * "instant".
-+ */
-+
- static int n_tty_receive_room(struct tty_struct *tty)
- {
- int left = N_TTY_BUF_SIZE - tty->read_cnt - 1;
-@@ -716,10 +824,13 @@ static int n_tty_receive_room(struct tty
- return 0;
- }
-
--/*
-- * Required for the ptys, serial driver etc. since processes
-- * that attach themselves to the master and rely on ASYNC
-- * IO must be woken up
-+/**
-+ * n_tty_write_wakeup - asynchronous I/O notifier
-+ * @tty: tty device
-+ *
-+ * Required for the ptys, serial driver etc. since processes
-+ * that attach themselves to the master and rely on ASYNC
-+ * IO must be woken up
- */
-
- static void n_tty_write_wakeup(struct tty_struct *tty)
-@@ -732,6 +843,19 @@ static void n_tty_write_wakeup(struct tt
- return;
- }
-
-+/**
-+ * n_tty_receive_buf - data receive
-+ * @tty: terminal device
-+ * @cp: buffer
-+ * @fp: flag buffer
-+ * @count: characters
-+ *
-+ * Called by the terminal driver when a block of characters has
-+ * been received. This function must be called from soft contexts
-+ * not from interrupt context. The driver is responsible for making
-+ * calls one at a time and in order (or using queue_ldisc)
-+ */
-+
- static void n_tty_receive_buf(struct tty_struct *tty, const unsigned char *cp,
- char *fp, int count)
- {
-@@ -813,6 +937,18 @@ int is_ignored(int sig)
- current->sig->action[sig-1].sa.sa_handler == SIG_IGN);
- }
-
-+/**
-+ * n_tty_set_termios - termios data changed
-+ * @tty: terminal
-+ * @old: previous data
-+ *
-+ * Called by the tty layer when the user changes termios flags so
-+ * that the line discipline can plan ahead. This function cannot sleep
-+ * and is protected from re-entry by the tty layer. The user is
-+ * guaranteed that this function will not be re-entered or in progress
-+ * when the ldisc is closed.
-+ */
-+
- static void n_tty_set_termios(struct tty_struct *tty, struct termios * old)
- {
- if (!tty)
-@@ -828,7 +964,6 @@ static void n_tty_set_termios(struct tty
- I_ICRNL(tty) || I_INLCR(tty) || L_ICANON(tty) ||
- I_IXON(tty) || L_ISIG(tty) || L_ECHO(tty) ||
- I_PARMRK(tty)) {
-- cli();
- memset(tty->process_char_map, 0, 256/8);
-
- if (I_IGNCR(tty) || I_ICRNL(tty))
-@@ -864,7 +999,6 @@ static void n_tty_set_termios(struct tty
- set_bit(SUSP_CHAR(tty), &tty->process_char_map);
- }
- clear_bit(__DISABLED_CHAR, &tty->process_char_map);
-- sti();
- tty->raw = 0;
- tty->real_raw = 0;
- } else {
-@@ -878,6 +1012,16 @@ static void n_tty_set_termios(struct tty
- }
- }
-
-+/**
-+ * n_tty_close - close the ldisc for this tty
-+ * @tty: device
-+ *
-+ * Called from the terminal layer when this line discipline is
-+ * being shut down, either because of a close or becsuse of a
-+ * discipline change. The function will not be called while other
-+ * ldisc methods are in progress.
-+ */
-+
- static void n_tty_close(struct tty_struct *tty)
- {
- n_tty_flush_buffer(tty);
-@@ -887,11 +1031,22 @@ static void n_tty_close(struct tty_struc
- }
- }
-
-+/**
-+ * n_tty_open - open an ldisc
-+ * @tty: terminal to open
-+ *
-+ * Called when this line discipline is being attached to the
-+ * terminal device. Can sleep. Called serialized so that no
-+ * other events will occur in parallel. No further open will occur
-+ * until a close.
-+ */
-+
- static int n_tty_open(struct tty_struct *tty)
- {
- if (!tty)
- return -EINVAL;
-
-+ /* This one is ugly. Currently a malloc failure here can panic */
- if (!tty->read_buf) {
- tty->read_buf = alloc_buf();
- if (!tty->read_buf)
-@@ -917,14 +1072,23 @@ static inline int input_available_p(stru
- return 0;
- }
-
--/*
-- * Helper function to speed up read_chan. It is only called when
-- * ICANON is off; it copies characters straight from the tty queue to
-- * user space directly. It can be profitably called twice; once to
-- * drain the space from the tail pointer to the (physical) end of the
-- * buffer, and once to drain the space from the (physical) beginning of
-- * the buffer to head pointer.
-+/**
-+ * copy_from_read_buf - copy read data directly
-+ * @tty: terminal device
-+ * @b: user data
-+ * @nr: size of data
-+ *
-+ * Helper function to speed up read_chan. It is only called when
-+ * ICANON is off; it copies characters straight from the tty queue to
-+ * user space directly. It can be profitably called twice; once to
-+ * drain the space from the tail pointer to the (physical) end of the
-+ * buffer, and once to drain the space from the (physical) beginning of
-+ * the buffer to head pointer.
-+ *
-+ * Called under the tty->atomic_read sem and with TTY_DONT_FLIP set
-+ *
- */
-+
- static inline int copy_from_read_buf(struct tty_struct *tty,
- unsigned char **b,
- size_t *nr)
-@@ -952,25 +1116,18 @@ static inline int copy_from_read_buf(str
- return retval;
- }
-
--static ssize_t read_chan(struct tty_struct *tty, struct file *file,
-- unsigned char *buf, size_t nr)
--{
-- unsigned char *b = buf;
-- DECLARE_WAITQUEUE(wait, current);
-- int c;
-- int minimum, time;
-- ssize_t retval = 0;
-- ssize_t size;
-- long timeout;
-- unsigned long flags;
--
--do_it_again:
--
-- if (!tty->read_buf) {
-- printk("n_tty_read_chan: called with read_buf == NULL?!?\n");
-- return -EIO;
-- }
-+/**
-+ * job_control - check job control
-+ * @tty: tty
-+ * @file: file handle
-+ *
-+ * Perform job control management checks on this file/tty descriptor
-+ * and if appropriate send any needed signals and return a negative
-+ * error code if action should be taken.
-+ */
-
-+static int job_control(struct tty_struct *tty, struct file *file)
-+{
- /* Job control check -- must be done at start and after
- every sleep (POSIX.1 7.1.1.4). */
- /* NOTE: not yet done after every sleep pending a thorough
-@@ -989,7 +1146,48 @@ do_it_again:
- return -ERESTARTSYS;
- }
- }
-+ return 0;
-+}
-+
-
-+/**
-+ * read_chan - read function for tty
-+ * @tty: tty device
-+ * @file: file object
-+ * @buf: userspace buffer pointer
-+ * @nr: size of I/O
-+ *
-+ * Perform reads for the line discipline. We are guaranteed that the
-+ * line discipline will not be closed under us but we may get multiple
-+ * parallel readers and must handle this ourselves. We may also get
-+ * a hangup. Always called in user context, may sleep.
-+ *
-+ * This code must be sure never to sleep through a hangup.
-+ */
-+
-+static ssize_t read_chan(struct tty_struct *tty, struct file *file,
-+ unsigned char __user *buf, size_t nr)
-+{
-+ unsigned char __user *b = buf;
-+ DECLARE_WAITQUEUE(wait, current);
-+ int c;
-+ int minimum, time;
-+ ssize_t retval = 0;
-+ ssize_t size;
-+ long timeout;
-+ unsigned long flags;
-+
-+do_it_again:
-+
-+ if (!tty->read_buf) {
-+ printk("n_tty_read_chan: called with read_buf == NULL?!?\n");
-+ return -EIO;
-+ }
-+
-+ c = job_control(tty, file);
-+ if(c < 0)
-+ return c;
-+
- minimum = time = 0;
- timeout = MAX_SCHEDULE_TIMEOUT;
- if (!tty->icanon) {
-@@ -1011,6 +1209,9 @@ do_it_again:
- }
- }
-
-+ /*
-+ * Internal serialization of reads.
-+ */
- if (file->f_flags & O_NONBLOCK) {
- if (down_trylock(&tty->atomic_read))
- return -EAGAIN;
-@@ -1146,6 +1347,21 @@ do_it_again:
- return retval;
- }
-
-+/**
-+ * write_chan - write function for tty
-+ * @tty: tty device
-+ * @file: file object
-+ * @buf: userspace buffer pointer
-+ * @nr: size of I/O
-+ *
-+ * Write function of the terminal device. This is serialized with
-+ * respect to other write callers but not to termios changes, reads
-+ * and other such events. We must be careful with N_TTY as the receive
-+ * code will echo characters, thus calling driver write methods.
-+ *
-+ * This code must be sure never to sleep through a hangup.
-+ */
-+
- static ssize_t write_chan(struct tty_struct * tty, struct file * file,
- const unsigned char * buf, size_t nr)
- {
-@@ -1217,7 +1433,25 @@ break_out:
- return (b - buf) ? b - buf : retval;
- }
-
--/* Called without the kernel lock held - fine */
-+/**
-+ * normal_poll - poll method for N_TTY
-+ * @tty: terminal device
-+ * @file: file accessing it
-+ * @wait: poll table
-+ *
-+ * Called when the line discipline is asked to poll() for data or
-+ * for special events. This code is not serialized with respect to
-+ * other events save open/close.
-+ *
-+ * This code must be sure never to sleep through a hangup.
-+ * Called without the kernel lock held - fine
-+ *
-+ * FIXME: if someone changes the VMIN or discipline settings for the
-+ * terminal while another process is in poll() the poll does not
-+ * recompute the new limits. Possibly set_termios should issue
-+ * a read wakeup to fix this bug.
-+ */
-+
- static unsigned int normal_poll(struct tty_struct * tty, struct file * file, poll_table *wait)
- {
- unsigned int mask = 0;
---- linux-2.4.27/drivers/char/pty.c.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/drivers/char/pty.c Thu Sep 23 17:24:34 2004
-@@ -137,6 +137,10 @@ static void pty_unthrottle(struct tty_st
- * (2) avoid redundant copying for cases where count >> receive_room
- * N.B. Calls from user space may now return an error code instead of
- * a count.
-+ *
-+ * FIXME: Our pty_write method is called with our ldisc lock held but
-+ * not our partners. We can't just take the other one blindly without
-+ * risking deadlocks. There is also the small matter of TTY_DONT_FLIP
- */
- static int pty_write(struct tty_struct * tty, int from_user,
- const unsigned char *buf, int count)
---- linux-2.4.27/drivers/char/riscom8.c.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/drivers/char/riscom8.c Thu Sep 23 17:24:34 2004
-@@ -1133,6 +1133,7 @@ static void rc_close(struct tty_struct *
- struct riscom_board *bp;
- unsigned long flags;
- unsigned long timeout;
-+ struct tty_ldisc *ld;
-
- if (!port || rc_paranoia_check(port, tty->device, "close"))
- return;
-@@ -1200,6 +1201,12 @@ static void rc_close(struct tty_struct *
- rc_shutdown_port(bp, port);
- if (tty->driver.flush_buffer)
- tty->driver.flush_buffer(tty);
-+ ld = tty_ldisc_ref(tty);
-+ if (ld != NULL) {
-+ if(ld->flush_buffer)
-+ ld->flush_buffer(tty);
-+ tty_ldisc_deref(ld);
-+ }
- if (tty->ldisc.flush_buffer)
- tty->ldisc.flush_buffer(tty);
- tty->closing = 0;
-@@ -1375,9 +1382,7 @@ static void rc_flush_buffer(struct tty_s
- restore_flags(flags);
-
- wake_up_interruptible(&tty->write_wait);
-- if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-- tty->ldisc.write_wakeup)
-- (tty->ldisc.write_wakeup)(tty);
-+ tty_wakeup(tty);
- }
-
- static int rc_get_modem_info(struct riscom_port * port, unsigned int *value)
-@@ -1734,9 +1739,7 @@ static void do_softint(void *private_)
- return;
-
- if (test_and_clear_bit(RS_EVENT_WRITE_WAKEUP, &port->event)) {
-- if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-- tty->ldisc.write_wakeup)
-- (tty->ldisc.write_wakeup)(tty);
-+ tty_wakeup(tty);
- wake_up_interruptible(&tty->write_wait);
- }
- }
---- linux-2.4.27/drivers/char/selection.c.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/drivers/char/selection.c Thu Sep 23 17:53:35 2004
-@@ -290,9 +290,11 @@ int paste_selection(struct tty_struct *t
- {
- struct vt_struct *vt = (struct vt_struct *) tty->driver_data;
- int pasted = 0, count;
-+ struct tty_ldisc *ld;
- DECLARE_WAITQUEUE(wait, current);
-
- poke_blanked_console();
-+ ld = tty_ldisc_ref_wait(tty);
- add_wait_queue(&vt->paste_wait, &wait);
- while (sel_buffer && sel_buffer_lth > pasted) {
- set_current_state(TASK_INTERRUPTIBLE);
-@@ -307,6 +309,8 @@ int paste_selection(struct tty_struct *t
- }
- remove_wait_queue(&vt->paste_wait, &wait);
- current->state = TASK_RUNNING;
-+
-+ tty_ldisc_deref(ld);
- return 0;
- }
-
---- linux-2.4.27/drivers/char/synclink.c.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/drivers/char/synclink.c Thu Sep 23 17:24:34 2004
-@@ -1011,6 +1011,40 @@ static inline int mgsl_paranoia_check(st
- return 0;
- }
-
-+/**
-+ * line discipline callback wrappers
-+ *
-+ * The wrappers maintain line discipline references
-+ * while calling into the line discipline.
-+ *
-+ * ldisc_flush_buffer - flush line discipline receive buffers
-+ * ldisc_receive_buf - pass receive data to line discipline
-+ */
-+
-+static void ldisc_flush_buffer(struct tty_struct *tty)
-+{
-+ struct tty_ldisc *ld = tty_ldisc_ref(tty);
-+ if (ld) {
-+ if (ld->flush_buffer)
-+ ld->flush_buffer(tty);
-+ tty_ldisc_deref(ld);
-+ }
-+}
-+
-+static void ldisc_receive_buf(struct tty_struct *tty,
-+ const __u8 *data, char *flags, int count)
-+{
-+ struct tty_ldisc *ld;
-+ if (!tty)
-+ return;
-+ ld = tty_ldisc_ref(tty);
-+ if (ld) {
-+ if (ld->receive_buf)
-+ ld->receive_buf(tty, data, flags, count);
-+ tty_ldisc_deref(ld);
-+ }
-+}
-+
- /* mgsl_stop() throttle (stop) transmitter
- *
- * Arguments: tty pointer to tty info structure
-@@ -1170,13 +1204,7 @@ void mgsl_bh_transmit(struct mgsl_struct
- __FILE__,__LINE__,info->device_name);
-
- if (tty) {
-- if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-- tty->ldisc.write_wakeup) {
-- if ( debug_level >= DEBUG_LEVEL_BH )
-- printk( "%s(%d):calling ldisc.write_wakeup on %s\n",
-- __FILE__,__LINE__,info->device_name);
-- (tty->ldisc.write_wakeup)(tty);
-- }
-+ tty_wakeup(tty);
- wake_up_interruptible(&tty->write_wait);
- }
-
-@@ -2434,11 +2462,8 @@ static void mgsl_flush_buffer(struct tty
- spin_unlock_irqrestore(&info->irq_spinlock,flags);
-
- wake_up_interruptible(&tty->write_wait);
-- if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-- tty->ldisc.write_wakeup)
-- (tty->ldisc.write_wakeup)(tty);
--
--} /* end of mgsl_flush_buffer() */
-+ tty_wakeup(tty);
-+}
-
- /* mgsl_send_xchar()
- *
-@@ -3342,9 +3367,8 @@ static void mgsl_close(struct tty_struct
-
- if (tty->driver.flush_buffer)
- tty->driver.flush_buffer(tty);
--
-- if (tty->ldisc.flush_buffer)
-- tty->ldisc.flush_buffer(tty);
-+
-+ ldisc_flush_buffer(tty);
-
- shutdown(info);
-
-@@ -7007,11 +7031,7 @@ int mgsl_get_rx_frame(struct mgsl_struct
- }
- else
- #endif
-- {
-- /* Call the line discipline receive callback directly. */
-- if ( tty && tty->ldisc.receive_buf )
-- tty->ldisc.receive_buf(tty, info->intermediate_rxbuffer, info->flag_buf, framesize);
-- }
-+ ldisc_receive_buf(tty, info->intermediate_rxbuffer, info->flag_buf, framesize);
- }
- }
- /* Free the buffers used by this frame. */
-@@ -7183,9 +7203,7 @@ int mgsl_get_raw_rx_frame(struct mgsl_st
- memcpy( info->intermediate_rxbuffer, pBufEntry->virt_addr, framesize);
- info->icount.rxok++;
-
-- /* Call the line discipline receive callback directly. */
-- if ( tty && tty->ldisc.receive_buf )
-- tty->ldisc.receive_buf(tty, info->intermediate_rxbuffer, info->flag_buf, framesize);
-+ ldisc_receive_buf(tty, info->intermediate_rxbuffer, info->flag_buf, framesize);
- }
-
- /* Free the buffers used by this frame. */
---- linux-2.4.27/drivers/char/synclinkmp.c.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/drivers/char/synclinkmp.c Thu Sep 23 17:24:34 2004
-@@ -735,6 +735,40 @@ static inline int sanity_check(SLMP_INFO
- return 0;
- }
-
-+/**
-+ * line discipline callback wrappers
-+ *
-+ * The wrappers maintain line discipline references
-+ * while calling into the line discipline.
-+ *
-+ * ldisc_flush_buffer - flush line discipline receive buffers
-+ * ldisc_receive_buf - pass receive data to line discipline
-+ */
-+
-+static void ldisc_flush_buffer(struct tty_struct *tty)
-+{
-+ struct tty_ldisc *ld = tty_ldisc_ref(tty);
-+ if (ld) {
-+ if (ld->flush_buffer)
-+ ld->flush_buffer(tty);
-+ tty_ldisc_deref(ld);
-+ }
-+}
-+
-+static void ldisc_receive_buf(struct tty_struct *tty,
-+ const __u8 *data, char *flags, int count)
-+{
-+ struct tty_ldisc *ld;
-+ if (!tty)
-+ return;
-+ ld = tty_ldisc_ref(tty);
-+ if (ld) {
-+ if (ld->receive_buf)
-+ ld->receive_buf(tty, data, flags, count);
-+ tty_ldisc_deref(ld);
-+ }
-+}
-+
- /* tty callbacks */
-
- /* Called when a port is opened. Init and enable port.
-@@ -906,8 +940,7 @@ static void close(struct tty_struct *tty
- if (tty->driver.flush_buffer)
- tty->driver.flush_buffer(tty);
-
-- if (tty->ldisc.flush_buffer)
-- tty->ldisc.flush_buffer(tty);
-+ ldisc_flush_buffer(tty);
-
- shutdown(info);
-
-@@ -1315,9 +1348,7 @@ static void flush_buffer(struct tty_stru
- spin_unlock_irqrestore(&info->lock,flags);
-
- wake_up_interruptible(&tty->write_wait);
-- if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-- tty->ldisc.write_wakeup)
-- (tty->ldisc.write_wakeup)(tty);
-+ tty_wakeup(tty);
- }
-
- /* throttle (stop) transmitter
-@@ -1983,13 +2014,7 @@ void bh_transmit(SLMP_INFO *info)
- __FILE__,__LINE__,info->device_name);
-
- if (tty) {
-- if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-- tty->ldisc.write_wakeup) {
-- if ( debug_level >= DEBUG_LEVEL_BH )
-- printk( "%s(%d):%s calling ldisc.write_wakeup\n",
-- __FILE__,__LINE__,info->device_name);
-- (tty->ldisc.write_wakeup)(tty);
-- }
-+ tty_wakeup(tty);
- wake_up_interruptible(&tty->write_wait);
- }
- }
-@@ -4989,15 +5014,8 @@ CheckAgain:
- }
- else
- #endif
-- {
-- if ( tty && tty->ldisc.receive_buf ) {
-- /* Call the line discipline receive callback directly. */
-- tty->ldisc.receive_buf(tty,
-- info->tmp_rx_buf,
-- info->flag_buf,
-- framesize);
-- }
-- }
-+ ldisc_receive_buf(tty,info->tmp_rx_buf,
-+ info->flag_buf, framesize);
- }
- }
- /* Free the buffers used by this frame. */
---- linux-2.4.27/drivers/char/dz.c.bak Fri Sep 24 10:32:44 2004
-+++ linux-2.4.27/drivers/char/dz.c Fri Sep 24 10:34:29 2004
-@@ -1112,10 +1112,10 @@ static void dz_close(struct tty_struct *
- info->event = 0;
- info->tty = 0;
-
-- if (tty->ldisc.num != ldiscs[N_TTY].num) {
-+ if (tty->ldisc.num != N_TTY) {
- if (tty->ldisc.close)
- (tty->ldisc.close) (tty);
-- tty->ldisc = ldiscs[N_TTY];
-+ tty->ldisc = *(tty_ldisc_get(N_TTY));
- tty->termios->c_line = N_TTY;
- if (tty->ldisc.open)
- (tty->ldisc.open) (tty);
---- linux-2.4.27/drivers/char/pcxx.c.bak Fri Sep 24 10:34:39 2004
-+++ linux-2.4.27/drivers/char/pcxx.c Fri Sep 24 10:35:13 2004
-@@ -632,10 +632,10 @@ static void pcxe_close(struct tty_struct
- ** please send me a note. brian@ilinx.com
- ** Don't know either what this is supposed to do christoph@lameter.com.
- */
-- if(tty->ldisc.num != ldiscs[N_TTY].num) {
-+ if(tty->ldisc.num != N_TTY) {
- if(tty->ldisc.close)
- (tty->ldisc.close)(tty);
-- tty->ldisc = ldiscs[N_TTY];
-+ tty->ldisc = *(tty_ldisc_get(N_TTY));
- tty->termios->c_line = N_TTY;
- if(tty->ldisc.open)
- (tty->ldisc.open)(tty);
---- linux-2.4.27/drivers/char/serial167.c.bak Fri Sep 24 10:35:23 2004
-+++ linux-2.4.27/drivers/char/serial167.c Fri Sep 24 10:35:56 2004
-@@ -1920,10 +1920,10 @@ cy_close(struct tty_struct * tty, struct
- tty->ldisc.flush_buffer(tty);
- info->event = 0;
- info->tty = 0;
-- if (tty->ldisc.num != ldiscs[N_TTY].num) {
-+ if (tty->ldisc.num != N_TTY) {
- if (tty->ldisc.close)
- (tty->ldisc.close)(tty);
-- tty->ldisc = ldiscs[N_TTY];
-+ tty->ldisc = *(tty_ldisc_get(N_TTY));
- tty->termios->c_line = N_TTY;
- if (tty->ldisc.open)
- (tty->ldisc.open)(tty);
---- linux-2.4.27/drivers/char/sgiserial.c.bak Fri Sep 24 10:36:04 2004
-+++ linux-2.4.27/drivers/char/sgiserial.c Fri Sep 24 10:36:45 2004
-@@ -1498,10 +1498,10 @@ static void rs_close(struct tty_struct *
- tty->closing = 0;
- info->event = 0;
- info->tty = 0;
-- if (tty->ldisc.num != ldiscs[N_TTY].num) {
-+ if (tty->ldisc.num != N_TTY) {
- if (tty->ldisc.close)
- (tty->ldisc.close)(tty);
-- tty->ldisc = ldiscs[N_TTY];
-+ tty->ldisc = *(tty_ldisc_get(N_TTY));
- tty->termios->c_line = N_TTY;
- if (tty->ldisc.open)
- (tty->ldisc.open)(tty);
---- linux-2.4.27/drivers/sbus/char/zs.c.bak Fri Sep 24 10:37:11 2004
-+++ linux-2.4.27/drivers/sbus/char/zs.c Fri Sep 24 10:37:36 2004
-@@ -1605,10 +1605,10 @@ static void zs_close(struct tty_struct *
- tty->closing = 0;
- info->event = 0;
- info->tty = 0;
-- if (tty->ldisc.num != ldiscs[N_TTY].num) {
-+ if (tty->ldisc.num != N_TTY) {
- if (tty->ldisc.close)
- (tty->ldisc.close)(tty);
-- tty->ldisc = ldiscs[N_TTY];
-+ tty->ldisc = *(tty_ldisc_get(N_TTY));
- tty->termios->c_line = N_TTY;
- if (tty->ldisc.open)
- (tty->ldisc.open)(tty);
---- linux-2.4.27/drivers/bluetooth/hci_ldisc.c.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/drivers/bluetooth/hci_ldisc.c Thu Sep 23 17:24:34 2004
-@@ -181,6 +181,7 @@ static int hci_uart_flush(struct hci_dev
- {
- struct hci_uart *hu = (struct hci_uart *) hdev->driver_data;
- struct tty_struct *tty = hu->tty;
-+ struct tty_ldisc *ld = tty_ldisc_ref(tty);
-
- BT_DBG("hdev %p tty %p", hdev, tty);
-
-@@ -188,9 +189,11 @@ static int hci_uart_flush(struct hci_dev
- kfree_skb(hu->tx_skb); hu->tx_skb = NULL;
- }
-
-- /* Flush any pending characters in the driver and discipline. */
-- if (tty->ldisc.flush_buffer)
-- tty->ldisc.flush_buffer(tty);
-+ if (ld) {
-+ if(ld->flush_buffer)
-+ ld->flush_buffer(tty);
-+ tty_ldisc_deref(ld);
-+ }
-
- if (tty->driver.flush_buffer)
- tty->driver.flush_buffer(tty);
-@@ -283,7 +286,9 @@ static int hci_uart_tty_open(struct tty_
-
- spin_lock_init(&hu->rx_lock);
-
-- /* Flush any pending characters in the driver and line discipline */
-+ /* Flush any pending characters in the driver and line discipline. */
-+ /* FIXME: why is this needed. Note don't use ldisc_ref here as the
-+ open path is before the ldisc is referencable */
- if (tty->ldisc.flush_buffer)
- tty->ldisc.flush_buffer(tty);
-
---- linux-2.4.27/Documentation/tty.txt.bak Thu Sep 23 17:24:26 2004
-+++ linux-2.4.27/Documentation/tty.txt Thu Sep 23 17:24:34 2004
-@@ -0,0 +1,194 @@
-+
-+ The Lockronomicon
-+
-+Your guide to the ancient and twisted locking policies of the tty layer and
-+the warped logic behind them. Beware all ye who read on.
-+
-+FIXME: still need to work out the full set of BKL assumptions and document
-+them so they can eventually be killed off.
-+
-+
-+Line Discipline
-+---------------
-+
-+Line disciplines are registered with tty_register_ldisc() passing the
-+discipline number and the ldisc structure. At the point of registration the
-+discipline must be ready to use and it is possible it will get used before
-+the call returns success. If the call returns an error then it won't get
-+called. Do not re-use ldisc numbers as they are part of the userspace ABI
-+and writing over an existing ldisc will cause demons to eat your computer.
-+After the return the ldisc data has been copied so you may free your own
-+copy of the structure. You must not re-register over the top of the line
-+discipline even with the same data or your computer again will be eaten by
-+demons.
-+
-+In order to remove a line discipline call tty_register_ldisc passing NULL.
-+In ancient times this always worked. In modern times the function will
-+return -EBUSY if the ldisc is currently in use. Since the ldisc referencing
-+code manages the module counts this should not usually be a concern.
-+
-+Heed this warning: the reference count field of the registered copies of the
-+tty_ldisc structure in the ldisc table counts the number of lines using this
-+discipline. The reference count of the tty_ldisc structure within a tty
-+counts the number of active users of the ldisc at this instant. In effect it
-+counts the number of threads of execution within an ldisc method (plus those
-+about to enter and exit although this detail matters not).
-+
-+Line Discipline Methods
-+-----------------------
-+
-+TTY side interfaces:
-+
-+close() - This is called on a terminal when the line
-+ discipline is being unplugged. At the point of
-+ execution no further users will enter the
-+ ldisc code for this tty. Can sleep.
-+
-+open() - Called when the line discipline is attached to
-+ the terminal. No other call into the line
-+ discipline for this tty will occur until it
-+ completes successfully. Can sleep.
-+
-+write() - A process is writing data from user space
-+ through the line discipline. Multiple write calls
-+ are serialized by the tty layer for the ldisc. May
-+ sleep.
-+
-+flush_buffer() - May be called at any point between open and close.
-+
-+chars_in_buffer() - Report the number of bytes in the buffer.
-+
-+set_termios() - Called on termios structure changes. The caller
-+ passes the old termios data and the current data
-+ is in the tty. Currently can be parallel entered
-+ and ordering isn't predictable - FIXME
-+
-+read() - Move data from the line discipline to the user.
-+ Multiple read calls may occur in parallel and the
-+ ldisc must deal with serialization issues. May
-+ sleep.
-+
-+poll() - Check the status for the poll/select calls. Multiple
-+ poll calls may occur in parallel. May sleep.
-+
-+ioctl() - Called when an ioctl is handed to the tty layer
-+ that might be for the ldisc. Multiple ioctl calls
-+ may occur in parallel. May sleep.
-+
-+Driver Side Interfaces:
-+
-+receive_buf() - Hand buffers of bytes from the driver to the ldisc
-+ for processing. Semantics currently rather
-+ mysterious 8(
-+
-+receive_room() - Can be called by the driver layer at any time when
-+ the ldisc is opened. The ldisc must be able to
-+ handle the reported amount of data at that instant.
-+ Synchronization between active receive_buf and
-+ receive_room calls is down to the driver not the
-+ ldisc. Must not sleep.
-+
-+write_wakeup() - May be called at any point between open and close.
-+ The TTY_DO_WRITE_WAKEUP flag indicates if a call
-+ is needed but always races versus calls. Thus the
-+ ldisc must be careful about setting order and to
-+ handle unexpected calls. Must not sleep.
-+
-+
-+Locking
-+
-+Callers to the line discipline functions from the tty layer are required to
-+take line discipline locks. The same is true of calls from the driver side
-+but not yet enforced.
-+
-+Three calls are now provided
-+
-+ ldisc = tty_ldisc_ref(tty);
-+
-+takes a handle to the line discipline in the tty and returns it. If no ldisc
-+is currently attached or the ldisc is being closed and re-opened at this
-+point then NULL is returned. While this handle is held the ldisc will not
-+change or go away.
-+
-+ tty_ldisc_deref(ldisc)
-+
-+Returns the ldisc reference and allows the ldisc to be closed. Returning the
-+reference takes away your right to call the ldisc functions until you take
-+a new reference.
-+
-+ ldisc = tty_ldisc_ref_wait(tty);
-+
-+Performs the same function as tty_ldisc_ref except that it will wait for an
-+ldisc change to complete and then return a reference to the new ldisc.
-+
-+While these functions are slightly slower than the old code they should have
-+minimal impact as most receive logic uses the flip buffers and they only
-+need to take a reference when they push bits up through the driver.
-+
-+A caution: The ldisc->open(), ldisc->close() and driver->set_ldisc
-+functions are called with the ldisc unavailable. Thus tty_ldisc_ref will
-+fail in this situation if used within these functions. Ldisc and driver
-+code calling its own functions must be careful in this case.
-+
-+
-+Driver Interface
-+----------------
-+
-+open() - Called when a device is opened. May sleep
-+
-+close() - Called when a device is closed. At the point of
-+ return from this call the driver must make no
-+ further ldisc calls of any kind. May sleep
-+
-+write() - Called to write bytes to the device. May not
-+ sleep. May occur in parallel in special cases.
-+ Because this includes panic paths drivers generally
-+ shouldn't try and do clever locking here.
-+
-+put_char() - Stuff a single character onto the queue. The
-+ driver is guaranteed following up calls to
-+ flush_chars.
-+
-+flush_chars() - Ask the kernel to write put_char queue
-+
-+write_room() - Return the number of characters tht can be stuffed
-+ into the port buffers without overflow (or less).
-+ The ldisc is responsible for being intelligent
-+ about multi-threading of write_room/write calls
-+
-+ioctl() - Called when an ioctl may be for the driver
-+
-+set_termios() - Called on termios change, may get parallel calls,
-+ may block for now (may change that)
-+
-+set_ldisc() - Notifier for discipline change. At the point this
-+ is done the discipline is not yet usable. Can now
-+ sleep (I think)
-+
-+throttle() - Called by the ldisc to ask the driver to do flow
-+ control. Serialization including with unthrottle
-+ is the job of the ldisc layer.
-+
-+unthrottle() - Called by the ldisc to ask the driver to stop flow
-+ control.
-+
-+stop() - Ldisc notifier to the driver to stop output. As with
-+ throttle the serializations with start() are down
-+ to the ldisc layer.
-+
-+start() - Ldisc notifier to the driver to start output.
-+
-+hangup() - Ask the tty driver to cause a hangup initiated
-+ from the host side. [Can sleep ??]
-+
-+break_ctl() - Send RS232 break. Can sleep. Can get called in
-+ parallel, driver must serialize (for now), and
-+ with write calls.
-+
-+wait_until_sent() - Wait for characters to exit the hardware queue
-+ of the driver. Can sleep
-+
-+send_xchar() - Send XON/XOFF and if possible jump the queue with
-+ it in order to get fast flow control responses.
-+ Cannot sleep ??
-+
Deleted: trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/114-binfmt_aout-CAN-2004-1074.diff
===================================================================
--- trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/114-binfmt_aout-CAN-2004-1074.diff 2005-02-06 00:18:46 UTC (rev 2443)
+++ trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/114-binfmt_aout-CAN-2004-1074.diff 2005-02-06 00:35:03 UTC (rev 2444)
@@ -1,71 +0,0 @@
-# origin: backport from 2.6
-# inclusion: not yet in 2.4 bk, but it is expected to be added
-# description: [SECURITY] a.out oops fix
-# revision date: 2004.11.12
-
-- Don't insert overlapping region in setup_arg_pages().
-- Error check on do_brk() when setting up bss in a.out().
-
-===== fs/exec.c 1.35 vs edited =====
---- 1.35/fs/exec.c 2004-04-15 10:44:45 -07:00
-+++ edited/fs/exec.c 2004-11-12 12:02:40 -08:00
-@@ -342,6 +342,7 @@ int setup_arg_pages(struct linux_binprm
-
- down_write(¤t->mm->mmap_sem);
- {
-+ struct vm_area_struct *vma;
- mpnt->vm_mm = current->mm;
- mpnt->vm_start = PAGE_MASK & (unsigned long) bprm->p;
- mpnt->vm_end = STACK_TOP;
-@@ -351,6 +352,12 @@ int setup_arg_pages(struct linux_binprm
- mpnt->vm_pgoff = 0;
- mpnt->vm_file = NULL;
- mpnt->vm_private_data = (void *) 0;
-+ vma = find_vma(current->mm, mpnt->vm_start);
-+ if (vma) {
-+ up_write(¤t->mm->mmap_sem);
-+ kmem_cache_free(vm_area_cachep, mpnt);
-+ return -ENOMEM;
-+ }
- insert_vm_struct(current->mm, mpnt);
- current->mm->total_vm = (mpnt->vm_end - mpnt->vm_start) >> PAGE_SHIFT;
- }
-===== fs/binfmt_aout.c 1.8 vs edited =====
---- 1.8/fs/binfmt_aout.c 2002-02-04 23:54:04 -08:00
-+++ edited/fs/binfmt_aout.c 2004-11-12 11:55:14 -08:00
-@@ -39,13 +39,18 @@ static struct linux_binfmt aout_format =
- NULL, THIS_MODULE, load_aout_binary, load_aout_library, aout_core_dump, PAGE_SIZE
- };
-
--static void set_brk(unsigned long start, unsigned long end)
-+#define BAD_ADDR(x) ((unsigned long)(x) >= TASK_SIZE)
-+
-+static int set_brk(unsigned long start, unsigned long end)
- {
- start = PAGE_ALIGN(start);
- end = PAGE_ALIGN(end);
-- if (end <= start)
-- return;
-- do_brk(start, end - start);
-+ if (end > start) {
-+ unsigned long addr = do_brk(start, end - start);
-+ if (BAD_ADDR(addr))
-+ return addr;
-+ }
-+ return 0;
- }
-
- /*
-@@ -405,7 +410,11 @@ static int load_aout_binary(struct linux
- beyond_if:
- set_binfmt(&aout_format);
-
-- set_brk(current->mm->start_brk, current->mm->brk);
-+ retval = set_brk(current->mm->start_brk, current->mm->brk);
-+ if (retval < 0) {
-+ send_sig(SIGKILL, current, 0);
-+ return retval;
-+ }
-
- retval = setup_arg_pages(bprm);
- if (retval < 0) {
Modified: trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/900_changelog.diff
===================================================================
--- trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/900_changelog.diff 2005-02-06 00:18:46 UTC (rev 2443)
+++ trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/900_changelog.diff 2005-02-06 00:35:03 UTC (rev 2444)
@@ -1,907 +1,585 @@
# origin: Debian (joshk)
# cset: n/a
# inclusion: wtf?
-# revision date: 2004-11-22
+# revision date: 2005-02-05
Just a diff version of the ChangeLog..
---- /dev/null 2004-11-22 02:34:27.000000000 -0800
-+++ a/ChangeLog 2004-11-17 03:56:09.000000000 -0800
-@@ -0,0 +1,897 @@
+--- /dev/null 2005-02-04 00:03:50.000000000 -0800
++++ a/ChangeLog 2005-02-05 16:32:55.000000000 -0800
+@@ -0,0 +1,575 @@
+final:
+
-+- 2.4.28-rc4 was released as 2.4.28 with no changes.
++- 2.4.29-rc4 was released as 2.4.29 with no changes.
+
+
-+Summary of changes from v2.4.28-rc3 to v2.4.28-rc4
++Summary of changes from v2.4.29-rc3 to v2.4.29-rc4
+============================================
+
-+Adrian Bunk:
-+ o [NET]: neigh_for_each must be EXPORT_SYMBOL'ed
-+
-+David S. Miller:
-+ o [AF_UNIX]: Serialize dgram read using semaphore just like stream
-+ o [NET]: Export __neigh_for_each_release to modules
-+ o [TG3]: Update driver version and reldate
-+
-+Jakub Jelínek:
-+ o binfmt_elf: handle p_filesz == 0 on PT_INTERP section
-+
-+Len Brown:
-+ o [ACPI] fix NMI during poweroff http://bugzilla.kernel.org/show_bug.cgi?id=1206
-+
+Marcelo Tosatti:
-+ o Changed EXTRAVERSION to -rc4
++ o Cset exclude: solar@openwall.com|ChangeSet|20041218011100|24870
++ o Changed VERSION to 2.4.29-rc4
++ o Update i386 defconfig
+
-+Michael Chan:
-+ o [TG3]: 5753 support and a bug fix
+
-+Patrick McHardy:
-+ o [SCTP]: Fix inetaddr notifier chain corruption
-+
-+Willy Tarreau:
-+ o aic7xxx aic79xx_osm_pci.c compile fix with -Werror
-+
-+
-+
-+Summary of changes from v2.4.28-rc2 to v2.4.28-rc3
++Summary of changes from v2.4.29-rc2 to v2.4.29-rc3
+============================================
+
-+Aaron Grothe:
-+ o [CRYPTO]: Add Anubis support
++<raivis:mt.lv>:
++ o [NEIGH]: Calculate hash_val after possible table growth, not before
+
-+Chris Wright:
-+ o binfmt_elf: handle partial reads gracefully
++<scott:sonic.net>:
++ o Fix net neighbour hash bug
+
+David S. Miller:
-+ o [TG3]: Use ioremap_nocache()
-+ o [TG3]: Bump driver version and reldate
-+ o Cset exclude: davem@nuts.davemloft.net|ChangeSet|20040831000448|00808
-+ o Cset exclude: pablo@eurodev.net|ChangeSet|20040831000223|00117
-+ o [ATM]: Put back mistakedly removed LEC procfs code
++ o [TG3]: Return 0 when PHY read times out, not all-ones
++ o [TG3]: Fix signedness issues in PHY read/write loops
++ o [TG3]: Update driver version and reldate
++ o [INET_ECN]: Add INET_ECN_* enumeration from 2.6.x
+
-+Herbert Xu:
-+ o [NET]: Fix tbl->entries race
++Hideaki Yoshifuji:
++ o [IPV6]: Fix tunnel list locking in sit.c
+
-+Len Brown:
-+ o [ACPI] fix ASUS boot crash http://bugzilla.kernel.org/show_bug.cgi?id=2755
-+ o [ACPI] fix poweroff regression backport from 2.6 and ACPICA 20040427 http://bugzilla.kernel.org/show_bug.cgi?id=2109
++Jamal Hadi Salim:
++ o [NET]: Add ETH_P_MPLS_* and ARPHRD_INFINIBAND defines from 2.6.x
+
+Marcelo Tosatti:
-+ o Changed EXTRAVERSION to -rc3
++ o Adrian/Arjan/Marcelo: change tty_wakeup/tty_ldisc_flush to non-GPL export for compat reasons and change requirement to modutils 2.4.10
++ o Changed VERSION to 2.4.29-rc3
+
-+Mike Miller:
-+ o cleans up warnings in 32/64-bit conversions
++Olaf Kirch:
++ o [NET]: Fix CMSG32_OK macros
+
-+Mike Waychison:
-+ o [TG3]: Fix fiber hw autoneg bounces
-+
+Patrick McHardy:
-+ o [PKT_SCHED]: Don't try to destroy builtin qdiscs
++ o [NETFILTER]: Associate locally generated ICMP errors with conntrack of original packet
++ o [NETFILTER]: Remove CONFIG_IP_NF_NAT_LOCAL config option
++ o [NETFILTER]: Save a level of indentation in icmp_reply_translation
++ o [NETFILTER]: Apply PRE_ROUTING manips in LOCAL_OUT for locally generated icmp errors
++ o [NETFILTER]: Verify NAT manips have been applied before reversing them in icmp_reply_translation
++ o [NETFILTER]: Release dst_entry in PRE_ROUTING after NAT
++ o [NETFILTER]: Fix stack leakage in iptables/ip6_tables
+
-+Stefan Esser:
-+ o Improved smbfs client overflow fix
++Phil Oester:
++ o [NETFILTER]: revert MASQUERADE optimization for mostly static IPs
+
++Sridhar Samudrala:
++ o [SCTP] Fix potential null pointer dereference in sctp_err_lookup()
++ o [SCTP] Code cleanup: remove unused code and make needlessly global code static
++ o [SCTP] Treat ICMP protocol unreachable errors from non-SCTP capable hosts as ABORTs.
++ o [SCTP] Validate and respond to invalid chunk/parameter lengths
++ o [SCTP] Implementation of SCTP Implementer's Guide Section 2.35
++ o [SCTP] Clean up the T3_rtx timer when deleting a transport
++ o [SCTP] Fix bug in setting ephemeral port in the bind address
++ o [SCTP] Fix misc. issues in SCTP_PEER_ADDR_PARAMS set socket option
++ o [SCTP] Remove sk_xxx macros to be consistent with the rest of networking code and to avoid backporting issues.
++ o [SCTP] Fix sctp_getladdrs() to return valid local addresses on an endpoint that is bound to INADDR_ANY or inaddr6_any.
++
+Thomas Graf:
-+ o [NET]: Fix neighbour/arp build
-+ o [PKT_SCHED]: break is not enough to stop walking
++ o [PKT_SCHED]: dsmark should ignore ECN bits
+
-+Trond Myklebust:
-+ o NFS: Always wake up tasks that are waiting on the sillyrenamed file to complete
-+
+Wensong Zhang:
-+ o [IPVS]: Update version to 1.2.1
++ o [IPVS]: change to run master/backup sync daemon at a time
+
++Yasuyuki Kozakai:
++ o [NETFILTER]: Backport fixes for ip6t_LOG
++ o [NETFILTER]: Backport fixes for ip6t_dst
++ o [NETFILTER]: Fix check for ESP header size in ip6t_esp
++ o [NETFILTER]: Backport fixes for ip6t_eui64
++ o [NETFILTER]: Backport fixes for ip6t_frag
++ o [NETFILTER]: Backport fixes for ip6t_hbh
++ o [NETFILTER]: Backport fixes for ip6t_ipv6header
++ o [NETFILTER]: Backport fixes for ip6t_multiport
++ o [NETFILTER]: Backport fixes for ip6t_rt
++ o [NETFILTER]: Backport fixes for ip6tables
+
-+Summary of changes from v2.4.28-rc1 to v2.4.28-rc2
-+============================================
+
-+<arnouten:bzzt.net>:
-+ o [TCP]: Add /proc/net/tcp{,6} layout documentation
+
-+<lkml:rtr.ca>:
-+ o delkin_cb: new carbus IDE driver
+
-+<ruber:engr.es>:
-+ o [CRYPTO]: Add Tnepres cipher support
++Summary of changes from v2.4.29-rc1 to v2.4.29-rc2
++============================================
+
-+Aaron Grothe:
-+ o [CRYPTO]: Put khazad back into tcrypt table
++Christoph Hellwig:
++ o [XFS] make sure to always reclaim inodes in xfs_finish_reclaim
++ o [XFS] Fix NFS inode data corruption
++ o [XFS] Disable variable sized transfers on loop devices
++ o [XFS] Fix compilations for parisc
+
-+Adrian Bunk:
-+ o add SCSI_SATA_ULI help text
-+ o Adrian Bunk CREDITS entry
++Geert Uytterhoeven:
++ o Kill unused variables in the tty code
++ o Kill unused variables in the net code
+
-+Andrea Arcangeli:
-+ o [NET]: Accept should return ENFILE not EMFILE
++Jan Harkes:
++ o Fix Coda bugs found by Coverity checker
+
-+Chris Wright:
-+ o compile fix for neighbour scalability backport
-+ o compile fix for neighbour scalability backport
-+
-+David S. Miller:
-+ o [PKT_SCHED]: sch_netem.c needs linux/init.h
-+ o [AF_UNIX]: Remove spurious len test in unix_mkname
-+ o [CRYPTO]: Fix typo in Kconfig
-+ o [TG3]: Update driver version and reldate
-+ o [AF_PACKET]: Set VM_IO for mmap areas
-+ o [CRYPTO]: Delete MODULE_ALIAS line
-+
-+Eric Sandeen:
-+ o fix for large direct I/O
-+
-+Greg Banks:
-+ o [NET]: Fix race between neigh-timer_handler and neigh_event_send
-+
-+Harald Welte:
-+ o [NET]: Backport neighbour scalability fixes from 2.6.x
-+ o [NETFILTER]: fix ipt_ULOG bogus error messages
-+
-+Ivan Kokshaysky:
-+ o Alpha: fixes for bootp/bootpz targets
-+
-+James Morris:
-+ o [CRYPTO]: Add __init and __initdata to aes.c
-+
-+Keith Owens:
-+ o Avoid oops in proc_delete_inode
-+
-+Len Brown:
-+ o [ACPI] reserve IOPORTS for ACPI (David Shaohua Li) http://bugzilla.kernel.org/show_bug.cgi?id=2641
-+ o [ACPI] boot option fixes from 2.6 "acpi_serialize" "acpi_wake_gpes_always_on" "acpi_osi=" http://bugzilla.kernel.org/show_bug.cgi?id=2534
-+ o set acpi_gbl_leave_wake_gpes_disabled to FALSE for 2.4 because it would take a backport of big 2.6 changes to make this code work and 2.4 doesn't support suspend/resume anyway.
-+ o [ACPI] Enter ACPI mode earlier Fixes two common boot failures due to buggy SMM BIOS code
-+ o [ACPI] fix build warnings
-+ o [ACPI] build fix
-+ o [ACPI] If BIOS disabled the LAPIC, believe it by default
-+
-+Maciej W. Rozycki:
-+ o [NET]: Fix fddi_statistics for 64-bit
-+ o [IPV4]: Set ARP hw type correctly for BOOTP over FDDI
-+ o [IPV4]: Permit the official ARP hw type in SIOCSARP for FDDI
-+
+Marcelo Tosatti:
-+ o Jakub Bogusz: missing include in farsync WAN driver
-+ o mcp: Fix proc_delete_inode oops bug correction typo
-+ o Urban Widmark: Fix smbfs client overflow
-+ o Changed EXTRAVERSION to -rc2
++ o Update Dave Jones email address in MAINTAINERS file
++ o Linus Torvalds: Warn if mmap_sem is not locked in do_brk
++ o Change do_uselib() fix to match v2.6, rip do_brk_locked()
++ o Brad Spengler: Fix random poolsize sysctl (from 2.6.10-ac)
++ o Alan Cox: Fix moxa serial bound checking issue (from 2.6.10-ac)
++ o Brad Spengler: Fix RLIMIT_MEMLOCK issue
++ o get_user_pages: Change BUG_ON to WARN_ON
++ o Alan Cox: rose_rt_ioctl lack of bounds checking, reported by Coverity (from 2.6.10-ac)
++ o Alan Cox: sdla_xfer lack of bounds checking, reported by Coverity (from 2.6.10-ac)
++ o Makefile
++ o Revert dubious get_user_pages() bug checking
++ o Olaf Kirch: sendmsg compat wrapper fixes
++ o Cset exclude: marcelo@logos.cnet|ChangeSet|20050110190211|08215
++ o Fix expand_stack() SMP race
++ o Add missing Documentation/tty.txt from tty/ldisc locking updates
++ o Completly remove old do_brk() fix
++ o Linus Torvalds: Create helper for mmap_sem write-lock check in do_brk()
++ o Fix mmap.c typo
+
-+Patrick Caulfield:
-+ o [DECNET]: Mark myself as maintainer
++Mikael Pettersson:
++ o sungem UniNorth 2 GMAC support
+
-+Patrick McHardy:
-+ o [PKT_SCHED]: Fix netem qlen accounting
++Nathan Scott:
++ o [XFS] Add sanity checks before use of attr_multi opcount parameter
+
-+Paul Fulghum:
-+ o serial receive lockup fix
-+ o usb serial write fix
-+
+Pete Zaitcev:
-+ o USB: update unusual_devs.h
++ o EHCI race fix
+
-+Randy Dunlap:
-+ o [TG3]: tg3_nvram_read_using_eeprom cannot be __init
+
-+Sridhar Samudrala:
-+ o [SCTP] Adaption layer indication support
-+ o [SCTP] Update cwnd/ssthresh as per the sctpimpguide modifications
-+ o [SCTP] When an address is deleted, update any transports that are caching it as a source adddress.
-+ o [SCTP] Fix HEARTBEAT_ACKs being sent to wrong dest. ip address in a multi-homing scenario after a failback.
++Summary of changes from v2.4.29-pre3 to v2.4.29-rc1
++============================================
+
-+Stephen Hemminger:
-+ o [PKT_SCHED]: netem: Use timer to handle packets not rescheduling
++<a.pugachev:pcs-net.net>:
++ o drivers/net/appletalk/Config.in depends on CONFIG_ATALK
+
-+Thomas Graf:
-+ o [PKT_SCHED]: Remove useless line in cbq_dump_class
-+ o [PKT_SCHED]: Make rate estimator work on all platforms
-+ o [PKT_SCHED]: CBQ; Destroy filters before destroying classes
-+ o [PKT_SCHED]: u32: Remove unused hgenerator field in tc_u_hnode
-+ o [PKT_SCHED]: Avoid duplicated TCA_STATS TLVs for HTB and HFSC
-+ o [PKT_SCHED]: Rename TCQ_F_INGRES to TCQ_F_INGRESS
-+ o filemap.c compile fix
++<albertcc:tw.ibm.com>:
++ o [libata] use PIO mode for request sense
++ o [libata] PIO error handling improvement
++ o [libata] verify ATAPI DMA for a given request is OK
+
-+Wensong Zhang:
-+ o [IPVS]: Fix endian problem on sync message size
++<gortan:tttech.com>:
++ o 8139cp: support for TTTech MC322
+
-+Özkan Sezer:
-+ o 2.6 backport: binfmt_elf memleak fix error handling
-+ o 2.6 backport: tun sign mishandling
++<jason.d.gaston:intel.com>:
++ o SATA support for Intel ICH7
+
++<mbellon:mvista.com>:
++ o 32 bit ltrace oops when tracing 64 bit executable [X86_64]
+
++<mhw:wittsend.com>:
++ o Computone driver update
+
-+Summary of changes from v2.4.28-pre4 to v2.4.28-rc1
-+============================================
++<penguin:muskoka.com>:
++ o 8390 Tx fix for non i386
+
-+<chaus:rz.uni-potsdam.de>:
-+ o Fix bug in PIIX code where DMA could be turned on without proper hw configuration (bugzilla bug #3473)
++<stkn:gentoo.org>:
++ o [libata] add #include (fixes 2.4 alpha build)
+
-+Bartlomiej Zolnierkiewicz:
-+ o libata: PCI IDE legacy mode fix
-+ o [libata] do not memset() SCSI request buf in a get-reference style function
-+ o [libata piix] Fix PATA UDMA masks
++Don Fry:
++ o pcnet32: added pci_disable_device
+
-+Benjamin Herrenschmidt:
-+ o Mikael Pettersson: PowerPC 745x coherency fix
++Ganesh Venkatesan:
++ o e1000: ITR does not default correctly on 2.4.x kernels
++ o e1000: Fix for kernel panic when the interface is brought down while the NAPI enabled driver is under stress
++ o e1000: Fix ethtool diagnostics -- specifically for blade server implementations
++ o e1000: Enabling NETIF_F_SG without checksum offload is illegal
++ o e1000: remove a redundant assignment to a local nr_frags in e1000_xmit_frame
++ o e1000: Synchronizing multicast table setup with transmit path - ak@suse.de
++ o e1000: fix tx resource cleanup logic
++ o e1000: {set, get}_wol is now symmetric for 82545EM adapters
++ o e1000: Sparse cleanup - shemminger@osdl.org
++ o e1000: Added workaround to prevent inadvertent gigabit waveform to be sent out on the wire due to init-time operations on the IGP phy.
++ o e1000: Applied eeprom fix where it was possible to read/write
++ o e1000: Applied smart speed fix where the code was forcing smart speed on all the time. Now it will honor the setting defined in the eeprom.
++ o e1000: Driver version number, white spaces, comments, device id & other changes
++ o e1000: Documentation/networking/e1000.txt update
+
-+Dave Jones:
-+ o davej CREDITS update
++Ian Kent:
++ o autofs4 add missing compat ioctls
+
-+François Romieu:
-+ o sata_nv: enable hotplug event on successfull init only
-+ o sata_nv: wrong failure path and leak
-+ o sata_nv: housekeeping for goto labels
++Jean Delvare:
++ o I2C: Cleanup a couple media/video drivers
+
-+Herbert Xu:
-+ o Fix hiddev devfs oops
-+
-+Hugh Dickins:
-+ o tmpfs: stop negative dentries
-+ o tmpfs: fix shmem_file_write return value
-+
-+Jake Moilanen:
-+ o PPC64 build break
-+
+Jeff Garzik:
-+ o [libata] add hook, and export functions needed for sata2 drivers
-+ o [libata] add sata_uli driver for ULi (formerly ALi) SATA
++ o [libata sata_nv] fix dev detect by removing sata-reset flag
++ o [libata sata_uli] add 5281 support, fix SATA phy setup for others
+
-+Jens Axboe:
-+ o scsi io completion bug
-+
-+Maciej W. Rozycki:
-+ o "console=" parameter ignored
-+
+Marcelo Tosatti:
-+ o Changed EXTRAVERSION to -rc1
++ o Changed VERSION to 2.4.29-rc1
++ o Paul Starzetz: sys_uselib() race vulnerability (CAN-2004-1235)
+
+Margit Schubert-While:
-+ o Add prism54 to MAINTAINERS
++ o prism54 sync with 2.6
++ o prism54 fix resume processing
++ o prism54 sparse fixes
+
-+Paul Fulghum:
-+ o serial send_break duration fix
++Paul Mackerras:
++ o PPC64 signal code cleanup
+
+Pete Zaitcev:
-+ o Crash with cat /proc/bus/usb/devices and disconnect
++ o USB: Add user defined IDs to ftdi
+
-+Özkan Sezer:
-+ o e1000 driver, gcc-3.4 inlining fix
++Ralf Bächle:
++ o MIPS network drivers
++ o NE2000 on Toshiba RBTX4927 fixes
+
++Solar Designer:
++ o Check for zero program header on load_elf_interp()
+
-+Summary of changes from v2.4.28-pre3 to v2.4.28-pre4
-+============================================
+
-+<ajgrothe:yahoo.com>:
-+ o [CRYPTO]: Whirlpool algorithm updates
-+ o [CRYPTO]: Add missing tcrypt part of whirlpool updates
+
-+<ananth:broadcom.com>:
-+ o [libata sata_svw] race condition fix, new device support
+
-+<joshk:triplehelix.org>:
-+ o radeonfb: Fix module unload and red/blue typo
-+ o hotplug: Don't build cpqphp_proc.o if !PROC_FS
++Summary of changes from v2.4.29-pre2 to v2.4.29-pre3
++============================================
+
-+<lesanti:sinectis.com.ar>:
-+ o fix dcache nr_dentry race
++<baris:idealteknoloji.com>:
++ o Remove msleep() definitions from sx8.c and forcedeth.c: it is generic now
+
-+<martin.wilck:fujitsu-siemens.com>:
-+ o [TG3]: Fix pause handling, we had duplicate flags for the same thing
++Andi Kleen:
++ o x86_64: fix signal restart bug
++ o [CAN-2004-1144] Fix int 0x80 hole in 2.4 x86-64 linux kernels
+
-+<michael.waychison:sun.com>:
-+ o [TG3]: Fix thinko in 5704 fibre hw autoneg code
++Andries E. Brouwer:
++ o do not use CONFIG_BLK_STATS
+
-+<peter:pantasys.com>:
-+ o [IPCONFIG]: Verify DHCPACK packets
-+ o [IPV4]: Fix DHCPACK checking in ipconfig.c
++Chris Wright:
++ o a.out: error check on set_brk
++ o Backport of 2.6 fix to insert_vm_struct to make it return an error rather than BUG()
+
-+<tkooda-patch-kernel:devsec.org>:
-+ o [CRYPTO]: xtea_encrypt() should use XTEA_DELTA instead of TEA_DELTA
-+
-+<vda:port.imtp.ilyichevsk.odessa.ua>:
-+ o trivial patch for 2.4: always inline __constant_*
-+
-+Achim Leubner:
-+ o gdth update
-+
+David S. Miller:
-+ o [NET]: Kill SCM_CONNECT, never used and unreferenced
-+ o [TCP]: Just silently ignore ICMP Source Quench messages
-+ o [TG3]: Recognize all onboard Sun variants, not just 5704
-+ o [TG3]: Update driver version and reldate
-+ o [CRYPTO]: Zero out tfm before freeing in crypto_free_tfm()
-+ o [SPARC64]: Do not log streaming byte hole errors
-+ o [PKT_SCHED]: sch_netem.c needs linux/init.h
-+ o [SPARC64]: Disable SBH interrupt properly
++ o [SPARC]: Adjust 32-bit ELF_ET_DYN_BASE
+
-+David Woodhouse:
-+ o [NET]: In compat syscall handling, check socket option types correctly
-+
-+Don Fry:
-+ o pcnet32: discard oversize rx packets
-+ o pcnet32: recover after rx hang
-+ o pcnet32: cleanup IRQ limitation
-+ o pcnet32: Add HomePNA parameter for 79C978
-+ o pcnet32: correctly program bcr32
-+
-+Doug Ledford:
-+ o RAID1 error handling locking fix
-+
-+Ganesh Venkatesan:
-+ o e1000 - ethtool support cleanup
-+ o e1000 - Enable TSO
-+ o e1000 - Replace kmalloc with vmalloc for data structures not shared with h/w
-+ o e1000 - TSO context descriptor setup fixes (in preparation for IPv6 TSO)
-+ o e1000 - Fix to prevent infinite loop trying to re-establish link while actively communicating
-+ o e1000 - Condition that determines when to quit polling mode includes work done in Tx path
-+ o e1000 - Shutdown PHY while bringing the interface down (if WoL not enabled)
-+ o e1000 - add likely/unlikely to assist branch prediction, other cleanups
-+ o e1000 - more DPRINTK messages
-+ o e1000 - suspend/resume fix from alex@zodiac.dasalias.org
-+ o e1000 - white space corrections
-+ o e1000 - remove support for advanced TCO features
-+ o e1000 - Fix MODULE_PARM, module_param and module_param_array usage
-+ o e1000 - Fix VLAN filter setup errors (while running on PPC)
-+ o e1000 - Polarity reversal workaround for 10F/10H links
-+ o e1000 - white space corrections, other cleanups
-+ o e1000 update - reset default ITR value to 8000
-+
+Geert Uytterhoeven:
-+ o m68k MM off-by-one
-+ o Atari ST-RAM setup
-+ o Amiga frame buffer: kill obsolete DMI Resolver code
-+ o fbdev monochrome lines
++ o m68k: fix incorrect config comment in check_bugs()
+
-+Herbert Xu:
-+ o Backport Via IRQ mask fix
++H. J. Lu:
++ o backport v2.6: Fix pty race condition
+
-+Hideaki Yoshifuji:
-+ o [IPV6] Fix routing header handling
-+ o [IPV6] Fix skb allocation size for RST and ACK
-+ o [IPV6]: Missing ip_rt_put() in SIT error path
++Ian Abbott:
++ o serial closing_wait and close_delay used from wrong data structure
+
-+Jack Hammer:
-+ o broken ips update
-+
-+Jean Delvare:
-+ o Update Documentation/i2c/writing-clients
-+
-+Jeff Garzik:
-+ o [TG3]: Kill all on-chip send BD support code
-+ o linux/compiler.h: dummy __iomem macro (an sparse annotation)
-+ o [libata] resync with 2.6.x
-+ o [libata] remove distinction between MMIO/PIO helper functions
-+ o [libata] consolidate legacy/native mode init code into helpers
-+ o [libata] minor comment updates, preparing for iomap merge
-+
-+Jens Axboe:
-+ o irq safe gendisk_lock
-+
-+Linus Torvalds:
-+ o libata: initial PCI memory annotations
-+
+Marcelo Tosatti:
-+ o Cset exclude: Achim_Leubner@adaptec.com|ChangeSet|20040928105422|00490
-+ o Mike Miller: cciss typo fix
-+ o Changed EXTRAVERSION to -pre4
++ o Solar Designer: Fix do_follow_link() comment
++ o Jason Baron: Backport v2.6 tty/ldisc locking fixes
++ o Move msleep() from libata-compat.h to generic headers
++ o Cset exclude: akpm@osdl.org|ChangeSet|20041218001750|00972
++ o Changed EXTRAVERSION to -pre3
++ o Cset exclude: trond.myklebust@fys.uio.no|ChangeSet|20040521160141|29598
++ o Fix NFS hang on unlink problems: cset exclude: trond.myklebust@fys.uio.no|ChangeSet|20041110174036|20706
+
-+Margit Schubert-While:
-+ o prism54 Code cleanup
-+ o prism54 remove module params
-+ o prism54 add WE17 support
-+ o prism54 initial WPA support
-+ o prism54 fix wpa_supplicant frequency parsing
-+ o prism54 remove TRACE
-+ o prism54 Bug in timeout scheduling
-+ o prism54 print firmware version
-+ o prism54 bug initialization/mgt_commit
++Simon Horman:
++ o binfmt_elf force_sig arguments fix
+
-+Maximilian Attems:
-+ o menuconfig fix crash due to infinite recursion
++Solar Designer:
++ o Fix booting off USB CD-ROMs (do_mounts.c)
++ o binfmt_elf fix return error codes and early corrupt binary detection
++ o procfs enhanced error reporting
++ o sysctl: block bogus argument earlier
++ o stronger (paranoic) mremap argument checking
+
-+Mikael Pettersson:
-+ o 53c700 scsi driver gcc-3.4 fixes
-+ o pcmcia mem_op.h gcc-3.4 fixes
-+ o ATM drivers gcc-3.4 fixes
-+ o IBM PCI hotplug controller driver gcc-3.4 fixes
-+ o ISDN drivers gcc-3.4 fixes
-+ o MTD drivers gcc-3.4 fixes
-+ o RIVA driver gcc-3.4 fix
-+ o E100 driver gcc-3.4 fixes
-+ o PPC32 PReP residual data gcc-3.4 fix
-+ o matrox framebuffer driver gcc-3.4 fix
-+
-+Pete Zaitcev:
-+ o USB drivers gcc-3.4 fixes
-+
+Stephen Hemminger:
-+ o [TCP]: Store congestion algorithm per socket
-+ o [TCP]: Add vegas style bandwidth info to 2.4.x tcp diag
-+ o [TCP]: Backport 2.6.x cleanup of westwood code
++ o [TCP]: Missing newline character in printk
++ o [PKT_SCHED]: netem: restart device after inserting packets
+
+Thomas Graf:
-+ o [PKT_SCHED]: Fix slab corruption in cbq_destroy
-+ o [PKT_SCHED] Report qdisc parent to userspace
++ o [PKT_SCHED]: Fix double locking in tcindex destroy path
+
-+Wensong Zhang:
-+ o [IPVS] add the MAINTAINERS entry
+
+
-+
-+
-+Summary of changes from v2.4.28-pre2 to v2.4.28-pre3
++Summary of changes from v2.4.29-pre1 to v2.4.29-pre2
+============================================
+
-+<achew:nvidia.com>:
-+ o sata_nv: fix CK804 support
-+ o i810_audio.c and pci_ids.h: add support for nforce MCP2S,
++<alexn:dsv.su.se>:
++ o Correct /dev/mptctl major number in Configure.help
+
-+<ajgrothe:yahoo.com>:
-+ o [CRYPTO]: Add Whirlpool digest algorithm
++<nboullis:debian.org>:
++ o [SPARC64]: Add SMB_IOC_GETMOUNTUID32 to compat ioctl table
+
-+<apm:brigitte.dna.fi>:
-+ o [NETFILTER]: Fix unaligned access in arp_tables.c
++<tv:lio96.de>:
++ o VM documentation fix: vm_anon_lru default is 0
+
-+<bzolnier:elka.pw.edu.pl>:
-+ o libata: ata_piix.c PIO fix
++Adrian Bunk:
++ o remove bouncing email address of Deanna Bonds
++ o add missing SCSI_SATA_AHCI Configure.help entry
++ o USB_ETH{,_RNDIS} EXPERIMENTAL dependencies
++ o let SCSI_SATA_NV depend on EXPERIMENTAL
++ o Update email address of Philip Blundell
++ o update email address of Andrea Arcangeli
+
-+<davem:davemloft.net>:
-+ o LVM ioctl fix - Trying to vfree() nonexistent vm area
++Cal Peake:
++ o remove obsolete PIIX config help
+
-+<felixb:sgi.com>:
-+ o [XFS] Removed xfs_iflush_all and all usages of vn_purge, except one in clear_inode path.
-+ o [XFS] Restored xfs_iflush_all, which is still used to finish reclaims
++Chris Wright:
++ o proc_tty.c warning fix
++ o [IPV4/IPV6]: IGMP source filter fixes
+
-+<ha505:hszk.bme.hu>:
-+ o [netdrvr fealnx] fix spin_unlock_irqrestore() usage
-+
-+<ileong:nvidia.com>:
-+ o [ac97_codec] add new codec
-+
-+<lcapitulino:conectiva.com.br>:
-+ o drivers/pci/pci.c NULL pointer fix
-+ o Fix missing `return NULL' missing in ext3_get_journal()
-+
-+<mchan:broadcom.com>:
-+ o [TG3]: Check MAC_STATUS_SIGNAL_DET in serdes polling
-+
-+<pablo:eurodev.net>:
-+ o [NETLINK]: Improve sendmsg() behavior of netlink sockets
-+
-+<pjones:redhat.com>:
-+ o [SPARC64]: Support 64-bit initrd addresses
-+
-+<rgooch:safe-mbox.com>:
-+ o drivers/char/ib700wdt.c ibwdt_ping() fix
-+ o Syntax fix drivers/media/video/bttv-driver.c
-+
-+<richm:oldelvet.org.uk>:
-+ o [SPARC64]: Set LVM fields more consistently in ioctl32.c code
-+
-+<tharbaugh:lnxi.com>:
-+ o [netdrvr e1000] disable DITR, which apparently hurts performance
-+
-+Adrian Bunk:
-+ o ibmphp_res.c: fix gcc 3.4 compilation
-+ o lmc_media.c: fix gcc 3.4 compilation
-+ o ircomm_param.c: fix __FUNCTION__ paste error
-+ o irlmp.c: fix gcc 3.4 compilation
-+ o asm-i386/smpboot.h: fix gcc 3.4 compilation
-+ o dscc4.c: fix gcc 3.4 compilation
-+
+Christoph Hellwig:
-+ o [XFS] Rework freeze/unfreeze infrastructure
-+ o [XFS] Move all ioctl definitions into a common place for 32bit ioctl translation.
-+ o [XFS] avoid using pid_t in ioctl ABI
-+ o [XFS] Fix warnings in xfs_bmap.c
-+ o [XFS] Remove a readahead page allocation failure warning, this will happen under normal workloads and does not indicate a problem.
++ o [XFS] handle nfs requesting ino 0 gracefully
++ o [XFS] fix handling of bad inodes
++ o [XFS] remove useless S_ISREG check in ->mmap and ->mprotect
++ o [XFS] split pagebuf_get, use get/read_flags correctly
++ o [XFS] Fix declaration of _pagebuf_find to not be static
++ o [XFS] handle inode creation race
++ o [XFS] call the right function in pagebuf_readahead
+
-+Dave Kleikamp:
-+ o JFS: Trivial: remove dead code
-+ o JFS: fix memory leak in __invalidate_metapages
++David Brownell:
++ o usb gadget updates: core
++ o usb gadget updates: ether/rndis
++ o usb gadget updates: Minor update to handle more hardware
+
+David S. Miller:
-+ o [TIGON3]: Mention that firmware is copyrighted by Broadcom
-+ o [TG3]: Revamp fibre PHY handling
-+ o [SPARC64]: Fix PCI IOMMU invalid iopte handling
-+ o [IPV4]: Fix theoretical loop on SMP in ip_evictor()
-+ o [IPV6]: ip6_evictor() has same problem as ip_evictor()
-+ o [TG3]: Remove autoneg handling from fibre_autoneg() unneeded
-+ o [TG3]: Always set MAC_EVENT_LNKSTATE_CHANGED even when serdes polling
-+ o Cset exclude: davem@nuts.davemloft.net|ChangeSet|20040817010145|64922
-+ o [TG3]: Do tg3_netif_start() under lock
-+ o [TCP]: When fetching srtt from metrics, do not forget to set rtt_seq
-+ o [TG3]: Disable CIOBE split, as per Broadcom's driver
-+ o [TG3]: Add 5750 A3 workaround
-+ o [SPARC64]: Save/restore %asi properly in signal handling
-+ o [SPARC64]: Remove memcpy Ultra3 PCACHE patching trick
-+ o [SPARC64]: Use saner local label names in Ultra3 copies
-+ o [SPARC64]: Revamped memcpy infrastructure
+ o [SPARC64]: Update defconfig
-+ o [SPARC64]: Remove memcpy/bzero symbol usage in sparc64_do_profile
-+ o [SPARC64]: Fix arg passing to copy_in_user()
-+ o [MAINTAINERS]: Update my email address
-+ o [CREDITS]: Update my email and home address
-+ o [TG3]: Add capacitive coupling support
-+ o [TG3]: Fix clock control programming on 5705/5750
-+ o [TG3]: Update driver version and reldate
-+ o [NETLINK]: Two cleanups
++ o [SPARC64]: Fix SMP cpu bringup bug when bigkernel
++ o [IPV4]: Do not leak IP options
++ o [NET]: CMSG compat code needs signedness fixes too
+
+Dean Roehrich:
-+ o [XFS] Fix lock leak in xfs_free_file_space
-+ o [XFS] Change DMAPI dm_punch_hole to punch holes, rather than just truncate files.
++ o [XFS] Need to vn_revalidate after dm_set_fileattr
++ o [XFS] update a copyright notice
+
+Douglas Gilbert:
-+ o scsi_debug update
-+ o scsi_error.c: break out repeatable error retries when eh mode
++ o off-by-1 libata-scsi INQUIRY VPD pages 0x80 and 0x83
+
+Eric Sandeen:
-+ o [XFS] Add filesystem size limit even when XFS_BIG_BLKNOS is in effect; limited by page cache index size (16T on ia32)
-+ o [XFS] Code checks to trap access to fsb zero
++ o [XFS] Wait for all async buffers to complete before tearing down the filesystem at umount time
+
-+Glen Overby:
-+ o [XFS] Permit buffered writes to the real-time subvolume
++Geoffrey Wehrman:
++ o [XFS] Add xfs_rotorstep sysctl for controlling placement of extents for new files by the inode32 allocator.
+
-+Jack Hammer:
-+ o ServeRAID driver (ips) Version 7.10.18
++Herbert Xu:
++ o [NET]: Fix CMSG validation checks wrt. signedness
+
-+Jason Baron:
-+ o ppos cleanups
++Ingo Molnar:
++ o floppy boot-time detection fix
+
++Jakub Bogusz:
++ o don't recursively crash in die() on CHRP/PReP machines
++
+Jeff Garzik:
-+ o [libata] resync with 2.6 (very minor, mostly cosmetic)
++ o [libata docs] add chapter on libata driver API
++ o [libata] only DMA map data for DMA commands (fix >=4GB bug)
+
-+Jeremy Higdon:
-+ o Fix DMA boundary overflow bug
++Jon Krueger:
++ o [XFS] Allow the option of skipping quotacheck processing
+
-+Krzysztof Halasa:
-+ o fix for integer overflow in hd6457[02] driver code
++Len Brown:
++ o [ACPI] acpi=off must disable acpi_early_init()
+
++Luca Tettamanti:
++ o radeonfb: don't try to ioreamp the entire VRAM
++ o Add new PCI id to radeonfb
++
+Marcelo Tosatti:
-+ o Fix mm.h typo introduced by s390 changes
-+ o Changed EXTRAVERSION to -pre3
++ o Cset exclude: vince@arm.linux.org.uk|ChangeSet|20041125151649|65331
++ o backport v2.6 fork/thread file descriptor race fix
++ o p8022 unregister packet type on unload
++ o Make sure VC resizing fits in s16
++ o psnap correctly unregister on module exit
++ o Changed EXTRAVERSION to -pre2
+
-+Margit Schubert-While:
-+ o prism54 Update to 2.6 status
-+ o prism54 Bug - Fix frequency reporting
-+
-+Mikael Pettersson:
-+ o more gcc34 lvalue fixes
-+ o drivers/ide/pci/sc1200.c cast-as-lvalue fix
-+
+Nathan Scott:
-+ o [XFS] Documentation updates
-+ o [XFS] Export sync_buffers routine for filesystems to use
-+ o [XFS] Revert to using a separate inode for metadata buffers once more
-+ o [XFS] Remove unneeded escape from printed string. From Chris Wedgwood
-+ o [XFS] sparse: annotate source for user pointers. From Chris Wedgwood
-+ o [XFS] sparse: annotate quota source for user pointers. From Chris Wedgwood
-+ o [XFS] Fix a possible data loss issue after an unaligned unwritten extent write.
-+ o [XFS] Fix xfs_off_t to be signed, not unsigned; valid warnings emitted after stricter compilation options used by some OSDL folks.
-+ o [XFS] xfs_Gqm_init cannot fail, dont check return value
-+ o [XFS] sparse: fix header include order to get cpp macros defined correctly. From Chris Wedgwood.
-+ o [XFS] sparse: rework previous mods to fix warnings in DMAPI code
-+ o [XFS] sparse: fix uses of NULL in place of zero and vice versa
-+ o [XFS] Fix signed/unsigned issues in xfs_reserve_blocks routine
-+ o [XFS] Fix accidental reverting of sync write preallocations
-+ o [XFS] Fix a blocksize-smaller-than-pagesize hang when writing buffers with a shared page.
-+ o [XFS] Add support for unsetting realtime flag on realtime file which has no extents allocated.
-+ o [XFS] Remove several macros which are no longer used anywhere
-+ o [XFS] Use sparse whitespace approach that Al took to be more consistent
-+ o [XFS] Add a realtime inheritance bit for directory inodes so new files can be automatically created as realtime files.
-+ o [XFS] Support for default quota limits via the zero dquot (ala grace times)
-+ o [XFS] Ensure maxagi not updated early during growfs, conflicts with concurrent inode allocations. Fix from ASANO Masahiro.
++ o [XFS] Fix incorrect use of do_div on realtime device growfs code path
++ o [XFS] Fix some locking oddities in extended attributes code (ilock excl vs shared).
++ o [XFS] Convert to list_for_each_entry_safe form in reclaim list walk
++ o [XFS] Ensure bytes read statistic is not updated when the generic routines fail.
++ o [XFS] Add nosymlinks inode flag for the security folks, reserve projinherit flag.
++ o [XFS] Update XFS quota header - add macros, use standard gpl template
++ o [XFS] Make xfssyncd more generic, hand off out-of-space flushing to it; fixes two deadlocks when near-full and fixes a 4KSTACKS problem in XFS.
++ o [XFS] Remove crufty old cap/mac code - never used, never compiled, gone
++ o [XFS] Fix merge botch affecting xfs_setattr for realtime files
++ o [XFS] Simplify page probe/submit code so buffers bayond eof not dirtied/written.
++ o [XFS] Remove unused function prototypes
+
-+Olaf Kirch:
-+ o [NETFILTER]: Fix pointer deref'ing in ip6t_LOG.c
++Randy Dunlap:
++ o Fix unresolved symbol on x86-64: export swiotlb
+
-+Patrick McHardy:
-+ o [PKT_SCHED]: Use double-linked list for dev->qdisc_list
-+ o [PKT_SCHED]: Fix class leak in CBQ scheduler
-+ o [NETFILTER]: Flush fragment queue on conntrack unload
-+ o [NETFILTER]: Fix confusing naming in NAT-helpers
-+ o [NETFILTER]: Fix deadlock condition in conntrack/nat-helpers
++Solar Designer:
++ o [TCP]: Missing KERN_* in input path printks
+
-+Paul Fulghum:
-+ o synclinkmp transmit eom fix
-+
+Stephen Hemminger:
-+ o [PKT_SCHED]: Sync netem scheduler with 2.6.x
++ o [UDP]: Select handling of bad checksums
+
+Timothy Shimmin:
-+ o [XFS] Fix up handling of SB versionnum when filesystem on disk has newer bit features than the kernel.
-+ o [XFS] Fix up header length miscalculation for version 1 logs
++ o [XFS] xfs reservation issues with xlog_sync roundoff
+
++Wensong Zhang:
++ o [IPVS] add a sysctl variable to expire quiescent template
+
+
-+Summary of changes from v2.4.28-pre1 to v2.4.28-pre2
++Summary of changes from v2.4.28 to v2.4.29-pre1
+============================================
+
-+<achew:nvidia.com>:
-+ o [libata sata_nv] support for hardware, bug fixes
-+ o [libata sata_nv] fix leak on error
++<a.pugachev:pcs-net.net>:
++ o via82cxxx audio procfs code selection fix
+
-+<david.martinez:rediris.es>:
-+ o Update ftape webpage
++<edward_peng:alphanetworks.com>:
++ o dl2k: correct author's email
+
-+<linville:tuxdriver.com>:
-+ o Add IOI Media Bay to SCSI quirk list
++<lnville:tuxdriver.com>:
++ o [VLAN]: change_mtu should return 0 on success
+
-+<mbroemme:plusserver.de>:
-+ o Fix kernel oops in nsc-ircc.c
++<manfred99:gmx.ch>:
++ o [DECNET]: dn_neigh.c needs linux/module.h
++ o [ATM]: Force -n option in gzip invocation
++ o Tigran Aivazian: backport sigmatch() issue in microcode.c
+
-+<rainer.weikusat:sncag.com>:
-+ o bkgoodman@bradgoodman.com: MTD cfi_cmdset_0002.c - Duplicate cleanup in error path
++<mjagdis:eris-associates.co.uk>:
++ o Mike Jagdis CREDITS email address change
+
-+<sezeroz:ttnet.net.tr>:
-+ o pm3fb and kaweth missing casts
-+ o ns83820.c warning fixes
-+ o cpqarray/cciss gcc3.4 inline fixes
-+ o ieee1394/hisax gcc 3.4 inline fixes
-+ o radio/video gcc3.4 inline fixes
-+ o mtd gcc3.4 inline fixes
-+ o net drivers gcc3.4 inline fixes
-+ o scsi drivers gcc3.4 inline fixes
-+ o USB gcc3.4 inline fixes
-+ o net gcc3.4 inline fixes
-+ o char gcc3.4 inline fixes
-+ o filesystems (fs/) gcc3.4 inline fixes
-+ o intermezzo gcc3.4 inline fixes
-+ o uninline do_generic_direct_read
++<vince:arm.linux.org.uk>:
++ o vga16fb: Fix frame buffer bad memory mapping
+
-+<thor:math.tu-berlin.de>:
-+ o NetMOS 9805 ParPort interface
-+
+Adrian Bunk:
-+ o 2.4.28-pre1: add two SATA Configure.help entries
-+ o disallow modular BINFMT_ELF
++ o remove outdated Stallion contact information
+
-+Alan Cox:
-+ o [libata] improve translation of ATA errors to SCSI sense codes
-+ o ad1816 sound driver web page and email address update
++Andrea Arcangeli:
++ o Lazily add anonymous pages to LRU
+
-+Andrew Morton:
-+ o libata build fix
++Andries E. Brouwer:
++ o backport v2.6 largefile isofs fix
+
-+Badari Pulavarty:
-+ o scsi PHYS_4G merging doesn't work
++Barry K. Nathan:
++ o Fix ELF exec with huge bss
++ o binfmt_elf.c fix for 32-bit apps with large bss
+
+Bartlomiej Zolnierkiewicz:
-+ o Fix IDE Triflex hang on boot with two single-channel controllers
++ o REQUEST_SENSE support for ATAPI
++ o [libata] arbitrary size ATAPI PIO support
++ o arbitrary size ATAPI PIO support bugfixes
++ o make ATAPI PIO work
++ o libata PIO bugfix
+
-+Dan Zink:
-+ o PCI Hotplug: fix potential hang in cpqphp
++Chris Wright:
++ o /proc/tty/driver/serial reveals the exact number of characters used in serial links (CAN-2003-0461)
+
-+Daniel Ritz:
-+ o enable read prefetch on o2micro bridges to fix HDSP
-+ o fix EnE Cardbus bridges for HDSP
++Christoph Hellwig:
++ o fix sata_svw compile
+
++Dave Kleikamp:
++ o JFS: Fix extent overflow bugs
++ o JFS: avoid assert in lbmfree
++ o JFS: Fix endian errors
++ o JFS: fix race in jfs_commit_inode
++
+David S. Miller:
-+ o [SPARC64]: Add missing nop to itlb_base.S
++ o [TCP]: Receive buffer moderation fixes
++ o [NETLINK]: sed 's/->sk_/->//' in af_netlink.c
+
-+Dely Sy:
-+ o PCI Hotplug: Fixes for hot-plug drivers in 2.4 kernel
++Ganesh Venkatesan:
++ o e1000: Update Documentation/networking/e1000.txt
++ o e1000: fix set_pauseparam for fiber serdes link
++ o e1000: remove unused function e1000_enable_mng_pass_thru
++ o e1000: fix set ringparam for ethtool returning error
++ o e1000: driver version update
++ o e1000: white space corrections
++ o e100: Update to Configure.help
++ o e1000: Update to Configure.help
+
-+Douglas Gilbert:
-+ o [libata] fix INQUIRY handling
++Herbert Xu:
++ o [NETLINK]: Backport pid hashing changes from 2.6
++ o [NETLINK]: Invoke netlink_proto_init() correctly in non-modular case
+
-+Gary Hade:
-+ o PCI Hotplug: change MAINTAINERS
++Jan Kara:
++ o Configurable quota messages
+
++Jean Delvare:
++ o I2C updates for 2.4.28 (1/5)
++ o I2C updates: i2c proc parser fix
++ o I2C updates: hardcoded buffer size should depend on define
++ o I2C updates: lack trailing newline in logs
++ o I2C updates: get rid of unused code
++
+Jeff Garzik:
-+ o [libata] (cosmetic) sync with 2.6.x
-+ o [libata] support commands SYNCHRONIZE CACHE, VERIFY, VERIFY(16)
-+ o [libata] fix PIO data xfer on big endian
-+ o [libata] ATAPI PIO data xfer
-+ o [libata] add ioctl infrastructure
-+ o [libata] fix error recovery reference count and in-recovery flag
-+ o [ata] remove 'packed' attributed from struct ata_prd
++ o [netdrvr dl2k] new TX scheme, fix minor bug
++ o [netdrvr dl2k] remove unused constant 'CFI'
++ o [libata] add AHCI driver
++ o [libata] fix minor 2.6 backport problems
++ o [libata] return ENOTTY rather than EOPNOTSUPP for unknown-ioctl
++ o [libata] use kunmap_atomic() correctly
++ o [libata] cosmetic: make syncing with 2.6 easier
++ o [libata] add ssleep() function
++ o [libata ahci] bump version to 1.00
++ o Add nth_page() helper
++ o Resync linux/ata.h with 2.6.x
++ o Remove silly comment from linux/ata.h
++ o [libata] remove dependence on PCI (2.4 stub version)
++ o [libata] bump versions, add MODULE_VERSION() tags
++ o [libata] fix DocBook bugs
++ o [libata ahci] minor fixes
+
-+Marcelo Tosatti:
-+ o Changed EXTRAVERSION to -pre2
++Jeremy Higdon:
++ o per-port LED control for sata_vsc
+
-+Martin Schwidefsky:
-+ o s390: core changes
-+ o s390: ibm partition table
-+ o s390: system tick misaccounting
-+ o s390: dasd changes
-+ o s390: ctc fixes
-+ o s390: iucv net driver fixes
-+ o s390: qeth network driver fixes
++John W. Linville:
++ o 3c59x: resync with 2.6
+
-+Mikael Pettersson:
-+ o gcc34 inline failure fixes
++Len Brown:
++ o [ACPI] BIOS workaround allowing devices to use reserved IO ports Author: David Shaohua Li http://bugzilla.kernel.org/show_bug.cgi?id=3049
+
-+Neil Brown:
-+ o Allow larger NFSd MAXBLKSIZE on architectures with larger PAGE_SIZE
-+ o Fixed possibly xdr parsing error if write size exceed 2^31
-+ o Use llseek instead of f_pos= for directory seeking
-+ o mark NFS/TCP not EXPERIMENTAL
++Manfred Spraul:
++ o Backport of the 0.30 forcedeth driver to 2.4. It's a new backport, starting from the 2.6 tree.
+
-+Patrick McHardy:
-+ o [RBTREE]: Add rb_{first,last,prev,next}
-+ o [NET_SCHED]: Replace eligible list by rbtree in HFSC scheduler
-+ o [NET_SCHED]: Replace actlist by rbtrees in HFSC scheduler
-+ o [NET_SCHED]: O(1) children vtoff adjustment in HFSC scheduler
-+ o [PKT_SCHED]: Remove unnecessary memsets in packet schedulers
++Marcelo Tosatti:
++ o O.Sezer: cpqphp_pci.c size warning fix
++ o Cset exclude: m.c.p@kernel.linux-systeme.com|ChangeSet|20041122173550|59288
++ o Marc-Christian Petersen: VM documentation update
++ o Ignore vma's with PageReserved pages at get_user_pages()
++ o Andrea: get_user_pages handle ZERO_PAGE PG_reserved page, BUG otherwise
++ o Changed EXTRAVERSION to -pre1
++ o fix get_user_pages() change typo
+
-+Pete Zaitcev:
-+ o USB: update unusual_devs.h
-+ o USB: remove "interrupt, status %x, frame# %i"
-+ o The Dell's fix for TEAC CD-210PU
++Mark Lord:
++ o Export ata_scsi_simulate() for use by non-libata drivers
+
++Matthijs Melchior:
++ o [libata ahci] fix rather serious (and/or embarassing) bugs
+
-+Summary of changes from v2.4.27 to v2.4.28-pre1
-+============================================
++Meelis Roos:
++ o ata.h undefined types in USB
+
-+<achew:nvidia.com>:
-+ o [libata] Add NVIDIA SATA driver
-+ o [ata] fix reversed bit definitions in linux/ata.h
-+ o [libata] unmap MMIO region _after_ last possible usage
-+
-+<ajgrothe:yahoo.com>:
-+ o [CRYPTO]: Add Khazad algorithm
-+
-+<alanh:fairlite.demon.co.uk>:
-+ o AGPgart update: Intel i915G support
-+
-+<castor:3pardata.com>:
-+ o Add 3PARdata InServ Virtual Volume to SCSI device list
-+
-+<frank_borich:us.xyratex.com>:
-+ o Add Xyratex 4200 to SCSI blacklist
-+
-+<ha505:hszk.bme.hu>:
-+ o Fix i2o_pci.c warning
-+ o Extra tokens at #undef in ma600.c
-+ o Missing enforced type conversion in pc300_tty.c
-+ o Redefinition before undefinition in pci-pc.c
-+ o Redefination before undefination in fore200e.c
-+
-+<jon:oberheide.org>:
-+ o [CRYPTO]: Email update in crypto/arc4.c
-+
-+<joshk:triplehelix.org>:
-+ o [SPARC]: Add missing GPL module license tags to drivers
-+
-+<mcgrof:ruslug.rutgers.edu>:
-+ o [wireless] add new prism54 driver
-+
-+<sergio.gelato:astro.su.se>:
-+ o libata: fix kunmap() of incorrect page, in PIO data xfer
-+
-+<sezeroz:ttnet.net.tr>:
-+ o agpgart: Missing chipset enum entry for i915
-+ o warning fixes: ULL-fixes
-+ o warning fixes: befs trivial
-+ o trivial iph5526.c fixes from 2.6
-+ o trivial nwflash.c missing -EFAULT retcode
-+ o backport applicom 2.6 fixes
-+ o trivial: various "unused" warnings
-+ o amd76xrom.c unused warning
-+
-+Adrian Bunk:
-+ o 2.6.7-mm1: drivers/scsi/hosts.h -> scsi/scsi_host.h
-+ o update email address of Pedro Roque Marques
-+
-+Bartlomiej Zolnierkiewicz:
-+ o DMA mode setup fixes for piix.c/ata_piix.c
-+
-+Chris Wright:
-+ o fix possible buffer overflow in panic()
-+
-+Daniel Ritz:
-+ o PCI: fix irq routing on acer travelmate 360 laptop
-+
-+David Dillow:
-+ o [SPARC64]: Handle SBUS dma allocations larger than 1MB
-+
-+David S. Miller:
-+ o [SPARC64]: Document reserved and soft2 bits in PTE
-+ o [SPARC64]: Reserve a software PTE bit for _PAGE_EXEC
-+ o [SPARC64]: Non-executable page support
-+ o [SPARC64]: Duh, s/_PAGE_FILE/_PAGE_EXEC/
-+ o [SPARC64]: Add CMT register defines
-+ o [SPARC64]: Kill all this silly inline memcpy handling
-+ o [SPARC64]: Simplify and optimize ultra3 memory copies
-+ o [SPARC64]: More entropy in add_timer_randomness
-+
-+James Morris:
-+ o [CRYPTO]: Typo in Documentation/Configure.help
-+ o [CRYPTO]: Typo in crypto/twofish.c
-+ o [CRYPTO]: Typo in crypto/aes.c
-+ o [CRYPTO]: Typo in crypto/scatterwalk.c
-+ o [CRYPTO]: Typo in crypto/blowfish.c
-+ o [CRYPTO]: Typo in crypto/tcrypt.h
-+
-+Jeff Garzik:
-+ o [libata] don't probe from workqueue
-+ o [libata] PCI IDE DMA code shuffling
-+ o [libata] PCI IDE command-end/irq-acknowledge cleanup
-+ o [libata] ->qc_prep hook
-+ o [libata] Add Intel ICH5/6 driver
-+ o [IDE] Introduce SATA enable/disable config option
-+ o [libata ata_piix] disable combined mode
-+ o [libata/IDE nvidia] shuffle pci ids
-+ o [libata] move some code around
-+ o [libata] fix build error, minor cleanups
-+ o [libata ata_piix] combined mode bug fix; improved ICH6 support
-+ o [libata sata_sil] Re-fix mod15write bug
-+ o [libata] add ->qc_issue hook
-+ o [libata] add ata_queued_cmd completion hook
-+ o [libata] create, and use, ->irq_clear hook
-+ o [ata] add ata_ok() inlined helper, and ATA_{DRDY,DF} bit to linux/ata.h
-+ o [libata] split ATA_QCFLAG_SG into ATA_QCFLAG_{SG,SINGLE}
-+ o [libata] create, and use aga_sg_init[_one] helpers
-+ o [libata sata_promise] update driver to use new ->qc_issue hook
-+ o [libata] transfer mode cleanup
-+ o [libata] fix completion bug, better debug output
-+ o [libata] transfer mode bug fixes and type cleanup
-+ o [libata] pio/dma flag bug fix, and cleanup
-+ o [libata] convert set-xfer-mode operation to use ata_queued_cmd
-+ o [libata sata_promise] convert to using packets for non-data taskfiles
-+ o [libata sata_sx4] deliver non-data taskfiles using Promise packet format
-+ o [libata] update IDENTIFY DEVICE path to use ata_queued_cmd
-+ o [libata] export msleep for use in libata drivers
-+ o [libata] ATAPI work - PIO xfer, completion function
-+ o [libata ata_piix] make sure AHCI is disabled, if h/w is used by this driver
-+ o [libata] flags cleanup
-+ o [libata] ATAPI work - cdb len, new taskfile protocol, cleanups
-+ o [libata] fix a 2.6-ism that snuck in
-+
-+Liam Girdwood:
-+ o Fix unsafe reset in ac97_codec.c, support WM9713, more fixes
-+
-+Marcelo Tosatti:
-+ o Herbert Xu: delete zero sized files from BK repository
-+ o Changed Makefile to 2.4.28-pre1
-+
-+Martin Devera:
-+ o [PKT_SCHED]: Fix borrowing fairness in htb
-+
+Mikael Pettersson:
-+ o gcc-3.4 fixes 1/3: fastcall mismatches
-+ o gcc-3.4 fixes 2/3: bogus lvalues
-+ o gcc-3.4 fixes 3/3: misc remaining issues
++ o gcc34 fastcall mismatch fixes for rwsem-spinlock
+
-+Mike Miller:
-+ o cciss update [1/5] PCI ID fix for cciss SATA hba
-+ o cciss update [2/5] fix for 32/64-bit conversions
-+ o cciss update [3/5] pci_dev->irq fix
-+ o cciss update [4/5] fix for HP utilities
-+ o cciss update [5/5] maintainers update for HP drivers
++Mike Kravetz:
++ o Task name handling static copy v2.6 backport
+
-+Pat LaVarre:
-+ o ata_check_bmdma
-+ o SATAPI despite no data
++Nishanth Aravamudan:
++ o scsi/ahci: replace schedule_timeout() with msleep()/ssleep()
+
+Pete Zaitcev:
-+ o David Brownell: Fix uhci-hcd oops
++ o USB: fix ohci_complete_add
++ o USB: ohci fix by Jes&Pete for Jessie
+
-+Richard Hitt:
-+ o s390x: enable ioctl's for UTS global 3270
-+ o UTS Global Cisco CLAW driver: avoid packets from being lost under heavy load
-+ o UTS Global Cisco CLAW driver: remove old ifdefs and adds GPL header
-+ o UTS Global Cisco CLAW driver: Fix 64-bit handling
++Ralf Bächle:
++ o MIPS update
++ o MIPS: sound drivers for AMD Alchemy platforms
++ o MIPS: Configure.help updates
++ o MIPS: MAINTAINERS update
++ o MIPS documentation
+
-+Ricky Beam:
-+ o [libata sata_sil] add drive to mod15write quirk list
++Randy Dunlap:
++ o oops on boot when initializing CDROM
+
-+Rik van Riel:
-+ o reserved buffers only for PF_MEMALLOC
++Solar Designer:
++ o Fix SCSI tape driver return code
++ o Fix 32-bit syscall emulation waste of CPU resources
+
-+Sridhar Samudrala:
-+ o [SCTP] SPARSE cleanup backported from 2.6
-+ o [SCTP] Set/Get default SCTP_PEER_ADDR_PARAMS for endpoint when associd and peer address are 0.
-+ o [SCTP] Fix data not being delivered to user in SHUTDOWN_SENT state
-+ o [SCTP] Fix issues with handling stale cookie error over multihoming associations.
-+ o [SCTP] Fix missing '+' in the computation of sack chunk size in sctp_sm_pull_sack().
-+ o [SCTP] Mark chunks as ineligible for fast retransmit after they are retransmitted. Also mark any chunks that could not be fit in the PMTU sized packet as ineligible for fast retransmit.
++Tobias Lorenz:
++ o [libata sata_promise] s/sata/ata/
+
-+Tom 'spot' Callaway:
-+ o [SPARC]: Fix copy_user.S with gcc 3.3
++Tony Battersby:
++ o sym53c8xx_2 error handler fix
++ o sym53c8xx_2 sniff inquiry fix
++ o sym53c8xx_2 Ultra 160 requires LVD
++ o make SCSI error handler preserve data transfer residual
++ o fix for scsi_unjam_host: Miscount of number of failed commands
++ o fix race condition in sg.c
+
-+William Lee Irwin III:
-+ o [SPARC32]: Mark William Lee Irwin III as maintainer
-+ o Fix OOM killer issues: kill all threads of a process and ignore kernel threads
-+ o OOM killer: make jiffies comparison wrap safe
++Özkan Sezer:
++ o ricoh.h, mem0 wrong definition v2.6 backport
++ o Wilfried Weissmann: hptraid v0.03 from -ac/redhat - minor fixes
++ o DAC960 firmware/alpha backport from 2.6
++ o Cure ISDN eicon size warning
++ o OPTI Viper-M/N+ chipset support (by Michael Mueller)
++ o hamradio scc warning type fix
++ o intermezzo, backport some fixes from 2.6
++ o intermezzo, backport some more fixes from 2.6
++ o intermezzo, fixes from cvs
++ o Mark InterMezzo as orphan
++ o ide-scsi update from ac/rh: Added transform for reading ATAPI tape drive block limits
+
Deleted: trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/series/2.4.28-1
===================================================================
--- trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/series/2.4.28-1 2005-02-06 00:18:46 UTC (rev 2443)
+++ trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/series/2.4.28-1 2005-02-06 00:35:03 UTC (rev 2444)
@@ -1,97 +0,0 @@
-+ 001_optimise_size.diff
-+ 002_alpha_time.diff
-+ 004_386_emu.diff
-+ 005_bigphysarea.diff
-+ 006_acpi_default_off.diff
-+ 007_drmP_no_cmpxchg.diff
-+ 008_DAC960_alpha_fw.diff
-+ 009_scsi_changer.diff
-+ 010_tex_heading.diff
-+ 011_double_request_region.diff
-+ 012_8139too_deadlock.diff
-+ 013_mpparse_cries_wolf.diff
-+ 014_nm256xl_plus.diff
-+ 015_amd8111e_fp.diff
-+ 016_disable_non-free.diff
-+ 017_modularize_vesafb.diff
-+ 019_cpqarray_init.diff
-+ 025_proc_tty_security.diff
-+ 026_binfmt_misc_unload.diff
-+ 027_vfat_cries_wolf.diff
-+ 028_bttv_wintvd.diff
-+ 029_hid_manufacturer.diff
-+ 030_pegasus_lockup.diff
-+ 031_dpti2o_alpha_fix.diff
-+ 032_cramfs_initrd.diff
-+ 033_umsdos_oops.diff
-+ 034_modules_seq.diff
-+ 035_epatc8_runtime.diff
-+ 036_soundmodem_static.diff
-+ 037_pm768_cond.diff
-+ 038_i810_dma_workaround.diff
-+ 039_ibmtr_dupe_fix.diff
-+ 040_via-rhine_port_size.diff
-+ 041_7xxxosm_deadlock.diff
-+ 042_toshiba_blacklist.diff
-+ 044_ide_48bit_hpa.diff
-+ 045_isdn_cleanups.diff
-+ 046_mtd_config_dep.diff
-+ 047_advansys_le32.diff
-+ 048_aic_werror.diff
-+ 049_ohci_urb_complete.diff
-+ 050_export_proc.diff
-+ 051_sparse_off_t.diff
-+ 052_missing_includes.diff
-+ 053_spinlock_gcc_version.diff
-+ 054_skbuff_forward_decl.diff
-+ 055_main_arg_handling.diff
-+ 056_always_check_ECN.diff
-+ 057_init_unshare.diff
-+ 058_do_mounts_printk.diff
-+ 061_devmapper_1.00.19-2.diff
-+ 062_ide_stroke_runtime.diff
-X drivers/net/tg3.c
-+ 063_firmwareless_tg3.diff
-+ 900_changelog.diff
-+ 999_spelling_mistakes.diff
-X drivers/net/acenic_firmware.h
-X drivers/net/dgrs_firmware.c
-X drivers/net/tokenring/smctr_firmware.h
-X drivers/usb/serial/keyspan_mpr_fw.h
-X drivers/usb/serial/keyspan_usa18x_fw.h
-X drivers/usb/serial/keyspan_usa19_fw.h
-X drivers/usb/serial/keyspan_usa19qi_fw.h
-X drivers/usb/serial/keyspan_usa19qw_fw.h
-X drivers/usb/serial/keyspan_usa19w_fw.h
-X drivers/usb/serial/keyspan_usa28_fw.h
-X drivers/usb/serial/keyspan_usa28x_fw.h
-X drivers/usb/serial/keyspan_usa28xa_fw.h
-X drivers/usb/serial/keyspan_usa28xb_fw.h
-X drivers/usb/serial/keyspan_usa49w_fw.h
-X drivers/usb/serial/keyspan_usa49wlc_fw.h
-+ 069_parisc_comment.diff
-+ 070_ide_scan_pcibus.diff
-+ 071_dep_fw_loader-2.diff
-+ 072_6300esb_sata.diff
-+ 073_tg3_hw_autoneg.diff
-+ 075_lvm_ioctl.diff
-+ 076_isofs_acorn_support.diff
-+ 077_isofs_ignore_volseqno.diff
-+ 078_isofs_nodot_execute.diff
-+ 079_ide_config_deps.diff
-+ 081_modular_atiixp.diff
-+ 080_modular_ide-proc.diff
-+ 082_global_scan_direction.diff
-+ 083_ide_pci_scan_delay.diff
-+ 084_ea_acl-2.diff
-+ 086_ver_linux_ld.diff
-+ 087_mkdep_xargs.diff
-+ 088_dont_use_infobox.diff
-+ 089_alpha_include_ptrace.diff
-+ 091_disambiguate_sym53c8xx.diff
-+ 092_sparc64_hme_lockup.diff
-+ 093_tty_lockup.diff
-
-+ 095_sparc32_initrd_memcpy.diff
-+ 096_megaraid2_proc_name.diff
-+ 114-binfmt_aout-CAN-2004-1074.diff
Copied: trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/series/2.4.29-1 (from rev 2443, trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/series/2.4.28-1)
===================================================================
--- trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/series/2.4.28-1 2005-02-06 00:18:46 UTC (rev 2443)
+++ trunk/kernel-2.4/source/kernel-source-2.4.29-2.4.29/debian/patches/series/2.4.29-1 2005-02-06 00:35:03 UTC (rev 2444)
@@ -0,0 +1,91 @@
++ 001_optimise_size.diff
++ 002_alpha_time.diff
++ 004_386_emu.diff
++ 005_bigphysarea.diff
++ 006_acpi_default_off.diff
++ 007_drmP_no_cmpxchg.diff
++ 009_scsi_changer.diff
++ 010_tex_heading.diff
++ 011_double_request_region.diff
++ 012_8139too_deadlock.diff
++ 013_mpparse_cries_wolf.diff
++ 014_nm256xl_plus.diff
++ 015_amd8111e_fp.diff
++ 016_disable_non-free.diff
++ 017_modularize_vesafb.diff
++ 019_cpqarray_init.diff
++ 026_binfmt_misc_unload.diff
++ 027_vfat_cries_wolf.diff
++ 028_bttv_wintvd.diff
++ 029_hid_manufacturer.diff
++ 030_pegasus_lockup.diff
++ 031_dpti2o_alpha_fix.diff
++ 032_cramfs_initrd.diff
++ 033_umsdos_oops.diff
++ 034_modules_seq.diff
++ 035_epatc8_runtime.diff
++ 036_soundmodem_static.diff
++ 037_pm768_cond.diff
++ 038_i810_dma_workaround.diff
++ 039_ibmtr_dupe_fix.diff
++ 040_via-rhine_port_size.diff
++ 041_7xxxosm_deadlock.diff
++ 042_toshiba_blacklist.diff
++ 044_ide_48bit_hpa.diff
++ 045_isdn_cleanups.diff
++ 046_mtd_config_dep.diff
++ 047_advansys_le32.diff
++ 048_aic_werror.diff
++ 049_ohci_urb_complete.diff
++ 050_export_proc.diff
++ 051_sparse_off_t.diff
++ 052_missing_includes.diff
++ 053_spinlock_gcc_version.diff
++ 054_skbuff_forward_decl.diff
++ 055_main_arg_handling.diff
++ 056_always_check_ECN.diff
++ 057_init_unshare.diff
++ 058_do_mounts_printk.diff
++ 061_devmapper_1.00.19-2.diff
++ 062_ide_stroke_runtime.diff
+X drivers/net/tg3.c
++ 063_firmwareless_tg3.diff
++ 900_changelog.diff
++ 999_spelling_mistakes.diff
+X drivers/net/acenic_firmware.h
+X drivers/net/dgrs_firmware.c
+X drivers/net/tokenring/smctr_firmware.h
+X drivers/usb/serial/keyspan_mpr_fw.h
+X drivers/usb/serial/keyspan_usa18x_fw.h
+X drivers/usb/serial/keyspan_usa19_fw.h
+X drivers/usb/serial/keyspan_usa19qi_fw.h
+X drivers/usb/serial/keyspan_usa19qw_fw.h
+X drivers/usb/serial/keyspan_usa19w_fw.h
+X drivers/usb/serial/keyspan_usa28_fw.h
+X drivers/usb/serial/keyspan_usa28x_fw.h
+X drivers/usb/serial/keyspan_usa28xa_fw.h
+X drivers/usb/serial/keyspan_usa28xb_fw.h
+X drivers/usb/serial/keyspan_usa49w_fw.h
+X drivers/usb/serial/keyspan_usa49wlc_fw.h
++ 069_parisc_comment.diff
++ 070_ide_scan_pcibus.diff
++ 071_dep_fw_loader-2.diff
++ 072_6300esb_sata.diff
++ 073_tg3_hw_autoneg.diff
++ 075_lvm_ioctl.diff
++ 076_isofs_acorn_support.diff
++ 078_isofs_nodot_execute.diff
++ 079_ide_config_deps.diff
++ 081_modular_atiixp.diff
++ 080_modular_ide-proc.diff
++ 082_global_scan_direction.diff
++ 083_ide_pci_scan_delay.diff
++ 084_ea_acl-2.diff
++ 086_ver_linux_ld.diff
++ 087_mkdep_xargs.diff
++ 088_dont_use_infobox.diff
++ 089_alpha_include_ptrace.diff
++ 091_disambiguate_sym53c8xx.diff
++ 092_sparc64_hme_lockup.diff
++ 095_sparc32_initrd_memcpy.diff
++ 096_megaraid2_proc_name.diff