[kernel] r10948 - in dists/trunk/linux-2.6/debian/patches: bugfix/all series

Maximilian Attems maks at alioth.debian.org
Sun Mar 23 07:26:09 UTC 2008


Author: maks
Date: Sun Mar 23 07:26:07 2008
New Revision: 10948

Log:
update to 2.6.25-rc6-git7

no conflicts, ide, cifs x86 merge.


Added:
   dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.25-rc6-git7
      - copied, changed from r10947, /dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.25-rc6-git6
Removed:
   dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.25-rc6-git6
Modified:
   dists/trunk/linux-2.6/debian/patches/series/1~experimental.1

Copied: dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.25-rc6-git7 (from r10947, /dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.25-rc6-git6)
==============================================================================
--- /dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.25-rc6-git6	(original)
+++ dists/trunk/linux-2.6/debian/patches/bugfix/all/patch-2.6.25-rc6-git7	Sun Mar 23 07:26:07 2008
@@ -101,6 +101,88 @@
 +mappable frame buffer. It has been tested with tinyx (Xfbdev). It is known
 +to work at this time with xeyes, xclock, xloadimage, xpdf.
 +
+diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt
+index c1d1fd0..bf0e3df 100644
+--- a/Documentation/feature-removal-schedule.txt
++++ b/Documentation/feature-removal-schedule.txt
+@@ -172,16 +172,6 @@ Who:	Len Brown <len.brown at intel.com>
+ 
+ ---------------------------
+ 
+-What:	ide-tape driver
+-When:	July 2008
+-Files:	drivers/ide/ide-tape.c
+-Why:	This driver might not have any users anymore and maintaining it for no
+-	reason is an effort no one wants to make.
+-Who:	Bartlomiej Zolnierkiewicz <bzolnier at gmail.com>, Borislav Petkov
+-	<petkovbb at googlemail.com>
+-
+----------------------------
+-
+ What: libata spindown skipping and warning
+ When: Dec 2008
+ Why:  Some halt(8) implementations synchronize caches for and spin
+diff --git a/Documentation/ide/ide.txt b/Documentation/ide/ide.txt
+index e3b3425..818676a 100644
+--- a/Documentation/ide/ide.txt
++++ b/Documentation/ide/ide.txt
+@@ -105,7 +105,7 @@ Drives are normally found by auto-probing and/or examining the CMOS/BIOS data.
+ For really weird situations, the apparent (fdisk) geometry can also be specified
+ on the kernel "command line" using LILO.  The format of such lines is:
+ 
+-	hdx=cyls,heads,sects,wpcom,irq
++	hdx=cyls,heads,sects
+ or	hdx=cdrom
+ 
+ where hdx can be any of hda through hdh, Three values are required
+@@ -214,9 +214,9 @@ driver using the "options=" keyword to insmod, while replacing any ',' with
+ Summary of ide driver parameters for kernel command line
+ --------------------------------------------------------
+ 
+- "hdx="  is recognized for all "x" from "a" to "h", such as "hdc".
++ "hdx="  is recognized for all "x" from "a" to "u", such as "hdc".
+ 
+- "idex=" is recognized for all "x" from "0" to "3", such as "ide1".
++ "idex=" is recognized for all "x" from "0" to "9", such as "ide1".
+ 
+  "hdx=noprobe"		: drive may be present, but do not probe for it
+ 
+@@ -228,13 +228,6 @@ Summary of ide driver parameters for kernel command line
+ 
+  "hdx=cyl,head,sect"	: disk drive is present, with specified geometry
+ 
+- "hdx=remap"		: remap access of sector 0 to sector 1 (for EZDrive)
+-
+- "hdx=remap63"		: remap the drive: add 63 to all sector numbers
+-			  (for DM OnTrack)
+-
+- "idex=noautotune"	: driver will NOT attempt to tune interface speed
+-
+  "hdx=autotune"		: driver will attempt to tune interface speed
+ 			  to the fastest PIO mode supported,
+ 			  if possible for this drive only.
+@@ -244,10 +237,6 @@ Summary of ide driver parameters for kernel command line
+ 
+  "hdx=nodma"		: disallow DMA
+ 
+- "hdx=scsi"		: the return of the ide-scsi flag, this is useful for
+- 			  allowing ide-floppy, ide-tape, and ide-cdrom|writers
+- 			  to use ide-scsi emulation on a device specific option.
+-
+  "idebus=xx"		: inform IDE driver of VESA/PCI bus speed in MHz,
+ 			  where "xx" is between 20 and 66 inclusive,
+ 			  used when tuning chipset PIO modes.
+@@ -282,10 +271,6 @@ Summary of ide driver parameters for kernel command line
+ 
+  "ide=reverse"		: formerly called to pci sub-system, but now local.
+ 
+-The following are valid ONLY on ide0, which usually corresponds
+-to the first ATA interface found on the particular host, and the defaults for
+-the base,ctl ports must not be altered.
+-
+  "ide=doubler"		: probe/support IDE doublers on Amiga
+ 
+ There may be more options than shown -- use the source, Luke!
 diff --git a/Documentation/input/notifier.txt b/Documentation/input/notifier.txt
 new file mode 100644
 index 0000000..95172ca
@@ -223,7 +305,7 @@
  	Better support for these cards than the driver for ISA.
     Supports multiple cards with IRQ sharing.
 diff --git a/MAINTAINERS b/MAINTAINERS
-index 6d628fb..03e4602 100644
+index 6d628fb..73883b8 100644
 --- a/MAINTAINERS
 +++ b/MAINTAINERS
 @@ -452,7 +452,7 @@ S:	Maintained
@@ -244,6 +326,19 @@
  W:	http://bluez.sf.net
  W:	http://www.bluez.org
  W:	http://www.holtmann.org/linux/bluetooth/
+@@ -2935,9 +2935,9 @@ S:	Maintained
+ 
+ ORACLE CLUSTER FILESYSTEM 2 (OCFS2)
+ P:	Mark Fasheh
+-M:	mark.fasheh at oracle.com
+-P:	Kurt Hackel
+-M:	kurt.hackel at oracle.com
++M:	mfasheh at suse.com
++P:	Joel Becker
++M:	joel.becker at oracle.com
+ L:	ocfs2-devel at oss.oracle.com
+ W:	http://oss.oracle.com/projects/ocfs2/
+ S:	Supported
 diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
 index 955fc53..4039a13 100644
 --- a/arch/arm/Kconfig
@@ -5942,19 +6037,10 @@
  /* pusha regs: */	"     EDI %p  ESI %p  EBP %p  ESP %p\n"		\
  			"     EBX %p  EDX %p  ECX %p  EAX %p\n"		\
 diff --git a/arch/x86/kernel/pci-dma_64.c b/arch/x86/kernel/pci-dma_64.c
-index a82473d..8bc1e18 100644
+index a82473d..375cb2b 100644
 --- a/arch/x86/kernel/pci-dma_64.c
 +++ b/arch/x86/kernel/pci-dma_64.c
-@@ -8,6 +8,8 @@
- #include <linux/pci.h>
- #include <linux/module.h>
- #include <linux/dmar.h>
-+#include <linux/bootmem.h>
-+#include <asm/proto.h>
- #include <asm/io.h>
- #include <asm/gart.h>
- #include <asm/calgary.h>
-@@ -53,11 +55,6 @@ dma_alloc_pages(struct device *dev, gfp_t gfp, unsigned order)
+@@ -53,11 +53,6 @@ dma_alloc_pages(struct device *dev, gfp_t gfp, unsigned order)
  	int node;
  
  	node = dev_to_node(dev);
@@ -5966,62 +6052,6 @@
  
  	page = alloc_pages_node(node, gfp, order);
  	return page ? page_address(page) : NULL;
-@@ -291,8 +288,55 @@ static __init int iommu_setup(char *p)
- }
- early_param("iommu", iommu_setup);
- 
-+static __initdata void *dma32_bootmem_ptr;
-+static unsigned long dma32_bootmem_size __initdata = (128ULL<<20);
-+
-+static int __init parse_dma32_size_opt(char *p)
-+{
-+	if (!p)
-+		return -EINVAL;
-+	dma32_bootmem_size = memparse(p, &p);
-+	return 0;
-+}
-+early_param("dma32_size", parse_dma32_size_opt);
-+
-+void __init dma32_reserve_bootmem(void)
-+{
-+	unsigned long size, align;
-+	if (end_pfn <= MAX_DMA32_PFN)
-+		return;
-+
-+	align = 64ULL<<20;
-+	size = round_up(dma32_bootmem_size, align);
-+	dma32_bootmem_ptr = __alloc_bootmem_nopanic(size, align,
-+				 __pa(MAX_DMA_ADDRESS));
-+	if (dma32_bootmem_ptr)
-+		dma32_bootmem_size = size;
-+	else
-+		dma32_bootmem_size = 0;
-+}
-+static void __init dma32_free_bootmem(void)
-+{
-+	int node;
-+
-+	if (end_pfn <= MAX_DMA32_PFN)
-+		return;
-+
-+	if (!dma32_bootmem_ptr)
-+		return;
-+
-+	for_each_online_node(node)
-+		free_bootmem_node(NODE_DATA(node), __pa(dma32_bootmem_ptr),
-+				  dma32_bootmem_size);
-+
-+	dma32_bootmem_ptr = NULL;
-+	dma32_bootmem_size = 0;
-+}
-+
- void __init pci_iommu_alloc(void)
- {
-+	/* free the range so iommu could get some range less than 4G */
-+	dma32_free_bootmem();
- 	/*
- 	 * The order of these functions is important for
- 	 * fall-back/fail-over reasons
 diff --git a/arch/x86/kernel/quirks.c b/arch/x86/kernel/quirks.c
 index c47208f..d89a648 100644
 --- a/arch/x86/kernel/quirks.c
@@ -6091,19 +6121,6 @@
  		if (!ptr)
  			panic("Cannot allocate cpu data for CPU %d\n", i);
  		cpu_pda(i)->data_offset = ptr - __per_cpu_start;
-diff --git a/arch/x86/kernel/setup_64.c b/arch/x86/kernel/setup_64.c
-index 7637dc9..a775fe3 100644
---- a/arch/x86/kernel/setup_64.c
-+++ b/arch/x86/kernel/setup_64.c
-@@ -389,6 +389,8 @@ void __init setup_arch(char **cmdline_p)
- 
- 	early_res_to_bootmem();
- 
-+	dma32_reserve_bootmem();
-+
- #ifdef CONFIG_ACPI_SLEEP
- 	/*
- 	 * Reserve low memory region for sleep support.
 diff --git a/arch/x86/mach-visws/traps.c b/arch/x86/mach-visws/traps.c
 index 843b67a..bfac6ba 100644
 --- a/arch/x86/mach-visws/traps.c
@@ -9342,6 +9359,59 @@
  		} else
  			continue;
  
+diff --git a/drivers/ide/ide-lib.c b/drivers/ide/ide-lib.c
+index 29e2c97..7031a8d 100644
+--- a/drivers/ide/ide-lib.c
++++ b/drivers/ide/ide-lib.c
+@@ -122,7 +122,6 @@ static struct ide_pio_info {
+ 	const char	*name;
+ 	int		pio;
+ } ide_pio_blacklist [] = {
+-/*	{ "Conner Peripherals 1275MB - CFS1275A", 4 }, */
+ 	{ "Conner Peripherals 540MB - CFS540A", 3 },
+ 
+ 	{ "WDC AC2700",  3 },
+@@ -138,10 +137,8 @@ static struct ide_pio_info {
+ 	{ "WDC AC1170",  1 },
+ 	{ "WDC AC1210",  1 },
+ 	{ "WDC AC280",   0 },
+-/*	{ "WDC AC21000", 4 }, */
+ 	{ "WDC AC31000", 3 },
+ 	{ "WDC AC31200", 3 },
+-/*	{ "WDC AC31600", 4 }, */
+ 
+ 	{ "Maxtor 7131 AT", 1 },
+ 	{ "Maxtor 7171 AT", 1 },
+@@ -155,13 +152,6 @@ static struct ide_pio_info {
+ 	{ "SAMSUNG SHD-3122A", 1 },
+ 	{ "SAMSUNG SHD-3172A", 1 },
+ 
+-/*	{ "ST51080A", 4 },
+- *	{ "ST51270A", 4 },
+- *	{ "ST31220A", 4 },
+- *	{ "ST31640A", 4 },
+- *	{ "ST32140A", 4 },
+- *	{ "ST3780A",  4 },
+- */
+ 	{ "ST5660A",  3 },
+ 	{ "ST3660A",  3 },
+ 	{ "ST3630A",  3 },
+diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c
+index 43e0e05..0598ecf 100644
+--- a/drivers/ide/ide-tape.c
++++ b/drivers/ide/ide-tape.c
+@@ -3765,11 +3765,6 @@ static int ide_tape_probe(ide_drive_t *drive)
+ 	g->fops = &idetape_block_ops;
+ 	ide_register_region(g);
+ 
+-	printk(KERN_WARNING "It is possible that this driver does not have any"
+-		" users anymore and, as a result, it will be REMOVED soon."
+-		" Please notify Bart <bzolnier at gmail.com> or Boris"
+-		" <petkovbb at gmail.com> in case you still need it.\n");
+-
+ 	return 0;
+ 
+ out_free_tape:
 diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c
 index 0518a2e..4c86a8d 100644
 --- a/drivers/ide/ide-taskfile.c
@@ -9399,6 +9469,96 @@
  	if (!hwif->nleft) {
  		stat = wait_drive_not_busy(drive);
  		if (!OK_STAT(stat, 0, BAD_STAT))
+diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c
+index 9976f9d..fc69fe2 100644
+--- a/drivers/ide/ide.c
++++ b/drivers/ide/ide.c
+@@ -1258,7 +1258,7 @@ static int __init ide_setup(char *s)
+ 		drive = &hwif->drives[unit];
+ 		if (strncmp(s + 4, "ide-", 4) == 0) {
+ 			strlcpy(drive->driver_req, s + 4, sizeof(drive->driver_req));
+-			goto done;
++			goto obsolete_option;
+ 		}
+ 		switch (match_parm(&s[3], hd_words, vals, 3)) {
+ 			case -1: /* "none" */
+@@ -1290,13 +1290,13 @@ static int __init ide_setup(char *s)
+ 				goto done;
+ 			case -12: /* "remap" */
+ 				drive->remap_0_to_1 = 1;
+-				goto done;
++				goto obsolete_option;
+ 			case -13: /* "remap63" */
+ 				drive->sect0 = 63;
+-				goto done;
++				goto obsolete_option;
+ 			case -14: /* "scsi" */
+ 				drive->scsi = 1;
+-				goto done;
++				goto obsolete_option;
+ 			case 3: /* cyl,head,sect */
+ 				drive->media	= ide_disk;
+ 				drive->ready_stat = READY_STAT;
+@@ -1370,32 +1370,32 @@ static int __init ide_setup(char *s)
+ #ifdef CONFIG_BLK_DEV_ALI14XX
+ 			case -17: /* "ali14xx" */
+ 				probe_ali14xx = 1;
+-				goto done;
++				goto obsolete_option;
+ #endif
+ #ifdef CONFIG_BLK_DEV_UMC8672
+ 			case -16: /* "umc8672" */
+ 				probe_umc8672 = 1;
+-				goto done;
++				goto obsolete_option;
+ #endif
+ #ifdef CONFIG_BLK_DEV_DTC2278
+ 			case -15: /* "dtc2278" */
+ 				probe_dtc2278 = 1;
+-				goto done;
++				goto obsolete_option;
+ #endif
+ #ifdef CONFIG_BLK_DEV_CMD640
+ 			case -14: /* "cmd640_vlb" */
+ 				cmd640_vlb = 1;
+-				goto done;
++				goto obsolete_option;
+ #endif
+ #ifdef CONFIG_BLK_DEV_HT6560B
+ 			case -13: /* "ht6560b" */
+ 				probe_ht6560b = 1;
+-				goto done;
++				goto obsolete_option;
+ #endif
+ #ifdef CONFIG_BLK_DEV_QD65XX
+ 			case -12: /* "qd65xx" */
+ 				probe_qd65xx = 1;
+-				goto done;
++				goto obsolete_option;
+ #endif
+ #ifdef CONFIG_BLK_DEV_4DRIVES
+ 			case -11: /* "four" drives on one set of ports */
+diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c
+index 39adb26..0bef878 100644
+--- a/drivers/infiniband/hw/nes/nes_cm.c
++++ b/drivers/infiniband/hw/nes/nes_cm.c
+@@ -40,6 +40,7 @@
+ #include <linux/tcp.h>
+ #include <linux/init.h>
+ #include <linux/if_arp.h>
++#include <linux/if_vlan.h>
+ #include <linux/notifier.h>
+ #include <linux/net.h>
+ #include <linux/types.h>
+@@ -1072,7 +1073,7 @@ static struct nes_cm_node *make_cm_node(struct nes_cm_core *cm_core,
+ 	ts = current_kernel_time();
+ 	cm_node->tcp_cntxt.loc_seq_num = htonl(ts.tv_nsec);
+ 	cm_node->tcp_cntxt.mss = nesvnic->max_frame_size - sizeof(struct iphdr) -
+-			sizeof(struct tcphdr) - ETH_HLEN;
++			sizeof(struct tcphdr) - ETH_HLEN - VLAN_HLEN;
+ 	cm_node->tcp_cntxt.rcv_nxt = 0;
+ 	/* get a unique session ID , add thread_id to an upcounter to handle race */
+ 	atomic_inc(&cm_core->node_cnt);
 diff --git a/drivers/input/misc/cobalt_btns.c b/drivers/input/misc/cobalt_btns.c
 index 4833b1a..5511ef0 100644
 --- a/drivers/input/misc/cobalt_btns.c
@@ -11234,6 +11394,484 @@
  }
  
  #endif
+diff --git a/drivers/mmc/core/Makefile b/drivers/mmc/core/Makefile
+index 4985807..19a1a25 100644
+--- a/drivers/mmc/core/Makefile
++++ b/drivers/mmc/core/Makefile
+@@ -7,7 +7,7 @@ ifeq ($(CONFIG_MMC_DEBUG),y)
+ endif
+ 
+ obj-$(CONFIG_MMC)		+= mmc_core.o
+-mmc_core-y			:= core.o sysfs.o bus.o host.o \
++mmc_core-y			:= core.o bus.o host.o \
+ 				   mmc.o mmc_ops.o sd.o sd_ops.o \
+ 				   sdio.o sdio_ops.o sdio_bus.o \
+ 				   sdio_cis.o sdio_io.o sdio_irq.o
+diff --git a/drivers/mmc/core/bus.c b/drivers/mmc/core/bus.c
+index b0c22ca..fd95b18 100644
+--- a/drivers/mmc/core/bus.c
++++ b/drivers/mmc/core/bus.c
+@@ -17,7 +17,6 @@
+ #include <linux/mmc/card.h>
+ #include <linux/mmc/host.h>
+ 
+-#include "sysfs.h"
+ #include "core.h"
+ #include "sdio_cis.h"
+ #include "bus.h"
+@@ -43,7 +42,7 @@ static ssize_t mmc_type_show(struct device *dev,
+ }
+ 
+ static struct device_attribute mmc_dev_attrs[] = {
+-	MMC_ATTR_RO(type),
++	__ATTR(type, S_IRUGO, mmc_type_show, NULL),
+ 	__ATTR_NULL,
+ };
+ 
+@@ -189,7 +188,7 @@ static void mmc_release_card(struct device *dev)
+ /*
+  * Allocate and initialise a new MMC card structure.
+  */
+-struct mmc_card *mmc_alloc_card(struct mmc_host *host)
++struct mmc_card *mmc_alloc_card(struct mmc_host *host, struct device_type *type)
+ {
+ 	struct mmc_card *card;
+ 
+@@ -204,6 +203,7 @@ struct mmc_card *mmc_alloc_card(struct mmc_host *host)
+ 	card->dev.parent = mmc_classdev(host);
+ 	card->dev.bus = &mmc_bus_type;
+ 	card->dev.release = mmc_release_card;
++	card->dev.type = type;
+ 
+ 	return card;
+ }
+@@ -248,24 +248,10 @@ int mmc_add_card(struct mmc_card *card)
+ 			type, card->rca);
+ 	}
+ 
+-	card->dev.uevent_suppress = 1;
+-
+ 	ret = device_add(&card->dev);
+ 	if (ret)
+ 		return ret;
+ 
+-	if (card->host->bus_ops->sysfs_add) {
+-		ret = card->host->bus_ops->sysfs_add(card->host, card);
+-		if (ret) {
+-			device_del(&card->dev);
+-			return ret;
+-		 }
+-	}
+-
+-	card->dev.uevent_suppress = 0;
+-
+-	kobject_uevent(&card->dev.kobj, KOBJ_ADD);
+-
+ 	mmc_card_set_present(card);
+ 
+ 	return 0;
+@@ -285,9 +271,6 @@ void mmc_remove_card(struct mmc_card *card)
+ 			printk(KERN_INFO "%s: card %04x removed\n",
+ 				mmc_hostname(card->host), card->rca);
+ 		}
+-
+-		if (card->host->bus_ops->sysfs_remove)
+-			card->host->bus_ops->sysfs_remove(card->host, card);
+ 		device_del(&card->dev);
+ 	}
+ 
+diff --git a/drivers/mmc/core/bus.h b/drivers/mmc/core/bus.h
+index 4f35431..1817876 100644
+--- a/drivers/mmc/core/bus.h
++++ b/drivers/mmc/core/bus.h
+@@ -11,7 +11,16 @@
+ #ifndef _MMC_CORE_BUS_H
+ #define _MMC_CORE_BUS_H
+ 
+-struct mmc_card *mmc_alloc_card(struct mmc_host *host);
++#define MMC_DEV_ATTR(name, fmt, args...)					\
++static ssize_t mmc_##name##_show (struct device *dev, struct device_attribute *attr, char *buf)	\
++{										\
++	struct mmc_card *card = container_of(dev, struct mmc_card, dev);	\
++	return sprintf(buf, fmt, args);						\
++}										\
++static DEVICE_ATTR(name, S_IRUGO, mmc_##name##_show, NULL)
++
++struct mmc_card *mmc_alloc_card(struct mmc_host *host,
++	struct device_type *type);
+ int mmc_add_card(struct mmc_card *card);
+ void mmc_remove_card(struct mmc_card *card);
+ 
+diff --git a/drivers/mmc/core/core.h b/drivers/mmc/core/core.h
+index 39daf2f..cfa8e15 100644
+--- a/drivers/mmc/core/core.h
++++ b/drivers/mmc/core/core.h
+@@ -18,8 +18,6 @@
+ struct mmc_bus_ops {
+ 	void (*remove)(struct mmc_host *);
+ 	void (*detect)(struct mmc_host *);
+-	int (*sysfs_add)(struct mmc_host *, struct mmc_card *card);
+-	void (*sysfs_remove)(struct mmc_host *, struct mmc_card *card);
+ 	void (*suspend)(struct mmc_host *);
+ 	void (*resume)(struct mmc_host *);
+ };
+diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
+index 68c0e3b..3da29ee 100644
+--- a/drivers/mmc/core/mmc.c
++++ b/drivers/mmc/core/mmc.c
+@@ -17,7 +17,6 @@
+ #include <linux/mmc/mmc.h>
+ 
+ #include "core.h"
+-#include "sysfs.h"
+ #include "bus.h"
+ #include "mmc_ops.h"
+ 
+@@ -248,6 +247,44 @@ out:
+ 	return err;
+ }
+ 
++MMC_DEV_ATTR(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1],
++	card->raw_cid[2], card->raw_cid[3]);
++MMC_DEV_ATTR(csd, "%08x%08x%08x%08x\n", card->raw_csd[0], card->raw_csd[1],
++	card->raw_csd[2], card->raw_csd[3]);
++MMC_DEV_ATTR(date, "%02d/%04d\n", card->cid.month, card->cid.year);
++MMC_DEV_ATTR(fwrev, "0x%x\n", card->cid.fwrev);
++MMC_DEV_ATTR(hwrev, "0x%x\n", card->cid.hwrev);
++MMC_DEV_ATTR(manfid, "0x%06x\n", card->cid.manfid);
++MMC_DEV_ATTR(name, "%s\n", card->cid.prod_name);
++MMC_DEV_ATTR(oemid, "0x%04x\n", card->cid.oemid);
++MMC_DEV_ATTR(serial, "0x%08x\n", card->cid.serial);
++
++static struct attribute *mmc_std_attrs[] = {
++	&dev_attr_cid.attr,
++	&dev_attr_csd.attr,
++	&dev_attr_date.attr,
++	&dev_attr_fwrev.attr,
++	&dev_attr_hwrev.attr,
++	&dev_attr_manfid.attr,
++	&dev_attr_name.attr,
++	&dev_attr_oemid.attr,
++	&dev_attr_serial.attr,
++	NULL,
++};
++
++static struct attribute_group mmc_std_attr_group = {
++	.attrs = mmc_std_attrs,
++};
++
++static struct attribute_group *mmc_attr_groups[] = {
++	&mmc_std_attr_group,
++	NULL,
++};
++
++static struct device_type mmc_type = {
++	.groups = mmc_attr_groups,
++};
++
+ /*
+  * Handle the detection and initialisation of a card.
+  *
+@@ -308,7 +345,7 @@ static int mmc_init_card(struct mmc_host *host, u32 ocr,
+ 		/*
+ 		 * Allocate card structure.
+ 		 */
+-		card = mmc_alloc_card(host);
++		card = mmc_alloc_card(host, &mmc_type);
+ 		if (IS_ERR(card)) {
+ 			err = PTR_ERR(card);
+ 			goto err;
+@@ -459,53 +496,6 @@ static void mmc_detect(struct mmc_host *host)
+ 	}
+ }
+ 
+-MMC_ATTR_FN(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1],
+-	card->raw_cid[2], card->raw_cid[3]);
+-MMC_ATTR_FN(csd, "%08x%08x%08x%08x\n", card->raw_csd[0], card->raw_csd[1],
+-	card->raw_csd[2], card->raw_csd[3]);
+-MMC_ATTR_FN(date, "%02d/%04d\n", card->cid.month, card->cid.year);
+-MMC_ATTR_FN(fwrev, "0x%x\n", card->cid.fwrev);
+-MMC_ATTR_FN(hwrev, "0x%x\n", card->cid.hwrev);
+-MMC_ATTR_FN(manfid, "0x%06x\n", card->cid.manfid);
+-MMC_ATTR_FN(name, "%s\n", card->cid.prod_name);
+-MMC_ATTR_FN(oemid, "0x%04x\n", card->cid.oemid);
+-MMC_ATTR_FN(serial, "0x%08x\n", card->cid.serial);
+-
+-static struct device_attribute mmc_dev_attrs[] = {
+-	MMC_ATTR_RO(cid),
+-	MMC_ATTR_RO(csd),
+-	MMC_ATTR_RO(date),
+-	MMC_ATTR_RO(fwrev),
+-	MMC_ATTR_RO(hwrev),
+-	MMC_ATTR_RO(manfid),
+-	MMC_ATTR_RO(name),
+-	MMC_ATTR_RO(oemid),
+-	MMC_ATTR_RO(serial),
+-	__ATTR_NULL,
+-};
+-
+-/*
+- * Adds sysfs entries as relevant.
+- */
+-static int mmc_sysfs_add(struct mmc_host *host, struct mmc_card *card)
+-{
+-	int ret;
+-
+-	ret = mmc_add_attrs(card, mmc_dev_attrs);
+-	if (ret < 0)
+-		return ret;
+-
+-	return 0;
+-}
+-
+-/*
+- * Removes the sysfs entries added by mmc_sysfs_add().
+- */
+-static void mmc_sysfs_remove(struct mmc_host *host, struct mmc_card *card)
+-{
+-	mmc_remove_attrs(card, mmc_dev_attrs);
+-}
+-
+ #ifdef CONFIG_MMC_UNSAFE_RESUME
+ 
+ /*
+@@ -560,8 +550,6 @@ static void mmc_resume(struct mmc_host *host)
+ static const struct mmc_bus_ops mmc_ops = {
+ 	.remove = mmc_remove,
+ 	.detect = mmc_detect,
+-	.sysfs_add = mmc_sysfs_add,
+-	.sysfs_remove = mmc_sysfs_remove,
+ 	.suspend = mmc_suspend,
+ 	.resume = mmc_resume,
+ };
+diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c
+index d1c1e0f..7ef3b15 100644
+--- a/drivers/mmc/core/sd.c
++++ b/drivers/mmc/core/sd.c
+@@ -18,7 +18,6 @@
+ #include <linux/mmc/sd.h>
+ 
+ #include "core.h"
+-#include "sysfs.h"
+ #include "bus.h"
+ #include "mmc_ops.h"
+ #include "sd_ops.h"
+@@ -283,6 +282,47 @@ out:
+ 	return err;
+ }
+ 
++MMC_DEV_ATTR(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1],
++	card->raw_cid[2], card->raw_cid[3]);
++MMC_DEV_ATTR(csd, "%08x%08x%08x%08x\n", card->raw_csd[0], card->raw_csd[1],
++	card->raw_csd[2], card->raw_csd[3]);
++MMC_DEV_ATTR(scr, "%08x%08x\n", card->raw_scr[0], card->raw_scr[1]);
++MMC_DEV_ATTR(date, "%02d/%04d\n", card->cid.month, card->cid.year);
++MMC_DEV_ATTR(fwrev, "0x%x\n", card->cid.fwrev);
++MMC_DEV_ATTR(hwrev, "0x%x\n", card->cid.hwrev);
++MMC_DEV_ATTR(manfid, "0x%06x\n", card->cid.manfid);
++MMC_DEV_ATTR(name, "%s\n", card->cid.prod_name);
++MMC_DEV_ATTR(oemid, "0x%04x\n", card->cid.oemid);
++MMC_DEV_ATTR(serial, "0x%08x\n", card->cid.serial);
++
++
++static struct attribute *sd_std_attrs[] = {
++	&dev_attr_cid.attr,
++	&dev_attr_csd.attr,
++	&dev_attr_scr.attr,
++	&dev_attr_date.attr,
++	&dev_attr_fwrev.attr,
++	&dev_attr_hwrev.attr,
++	&dev_attr_manfid.attr,
++	&dev_attr_name.attr,
++	&dev_attr_oemid.attr,
++	&dev_attr_serial.attr,
++	NULL,
++};
++
++static struct attribute_group sd_std_attr_group = {
++	.attrs = sd_std_attrs,
++};
++
++static struct attribute_group *sd_attr_groups[] = {
++	&sd_std_attr_group,
++	NULL,
++};
++
++static struct device_type sd_type = {
++	.groups = sd_attr_groups,
++};
++
+ /*
+  * Handle the detection and initialisation of a card.
+  *
+@@ -352,7 +392,7 @@ static int mmc_sd_init_card(struct mmc_host *host, u32 ocr,
+ 		/*
+ 		 * Allocate card structure.
+ 		 */
+-		card = mmc_alloc_card(host);
++		card = mmc_alloc_card(host, &sd_type);
+ 		if (IS_ERR(card)) {
+ 			err = PTR_ERR(card);
+ 			goto err;
+@@ -518,55 +558,6 @@ static void mmc_sd_detect(struct mmc_host *host)
+ 	}
+ }
+ 
+-MMC_ATTR_FN(cid, "%08x%08x%08x%08x\n", card->raw_cid[0], card->raw_cid[1],
+-	card->raw_cid[2], card->raw_cid[3]);
+-MMC_ATTR_FN(csd, "%08x%08x%08x%08x\n", card->raw_csd[0], card->raw_csd[1],
+-	card->raw_csd[2], card->raw_csd[3]);
+-MMC_ATTR_FN(scr, "%08x%08x\n", card->raw_scr[0], card->raw_scr[1]);
+-MMC_ATTR_FN(date, "%02d/%04d\n", card->cid.month, card->cid.year);
+-MMC_ATTR_FN(fwrev, "0x%x\n", card->cid.fwrev);
+-MMC_ATTR_FN(hwrev, "0x%x\n", card->cid.hwrev);
+-MMC_ATTR_FN(manfid, "0x%06x\n", card->cid.manfid);
+-MMC_ATTR_FN(name, "%s\n", card->cid.prod_name);
+-MMC_ATTR_FN(oemid, "0x%04x\n", card->cid.oemid);
+-MMC_ATTR_FN(serial, "0x%08x\n", card->cid.serial);
+-
+-static struct device_attribute mmc_sd_dev_attrs[] = {
+-	MMC_ATTR_RO(cid),
+-	MMC_ATTR_RO(csd),
+-	MMC_ATTR_RO(scr),
+-	MMC_ATTR_RO(date),
+-	MMC_ATTR_RO(fwrev),
+-	MMC_ATTR_RO(hwrev),
+-	MMC_ATTR_RO(manfid),
+-	MMC_ATTR_RO(name),
+-	MMC_ATTR_RO(oemid),
+-	MMC_ATTR_RO(serial),
+-	__ATTR_NULL,
+-};
+-
+-/*
+- * Adds sysfs entries as relevant.
+- */
+-static int mmc_sd_sysfs_add(struct mmc_host *host, struct mmc_card *card)
+-{
+-	int ret;
+-
+-	ret = mmc_add_attrs(card, mmc_sd_dev_attrs);
+-	if (ret < 0)
+-		return ret;
+-
+-	return 0;
+-}
+-
+-/*
+- * Removes the sysfs entries added by mmc_sysfs_add().
+- */
+-static void mmc_sd_sysfs_remove(struct mmc_host *host, struct mmc_card *card)
+-{
+-	mmc_remove_attrs(card, mmc_sd_dev_attrs);
+-}
+-
+ #ifdef CONFIG_MMC_UNSAFE_RESUME
+ 
+ /*
+@@ -621,8 +612,6 @@ static void mmc_sd_resume(struct mmc_host *host)
+ static const struct mmc_bus_ops mmc_sd_ops = {
+ 	.remove = mmc_sd_remove,
+ 	.detect = mmc_sd_detect,
+-	.sysfs_add = mmc_sd_sysfs_add,
+-	.sysfs_remove = mmc_sd_sysfs_remove,
+ 	.suspend = mmc_sd_suspend,
+ 	.resume = mmc_sd_resume,
+ };
+diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c
+index 87a50f4..4eab79e 100644
+--- a/drivers/mmc/core/sdio.c
++++ b/drivers/mmc/core/sdio.c
+@@ -287,7 +287,7 @@ int mmc_attach_sdio(struct mmc_host *host, u32 ocr)
+ 	/*
+ 	 * Allocate card structure.
+ 	 */
+-	card = mmc_alloc_card(host);
++	card = mmc_alloc_card(host, NULL);
+ 	if (IS_ERR(card)) {
+ 		err = PTR_ERR(card);
+ 		goto err;
+diff --git a/drivers/mmc/core/sysfs.c b/drivers/mmc/core/sysfs.c
+deleted file mode 100644
+index 00a97e7..0000000
+--- a/drivers/mmc/core/sysfs.c
++++ /dev/null
+@@ -1,43 +0,0 @@
+-/*
+- *  linux/drivers/mmc/core/sysfs.c
+- *
+- *  Copyright (C) 2003 Russell King, All Rights Reserved.
+- *  Copyright 2007 Pierre Ossman
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License version 2 as
+- * published by the Free Software Foundation.
+- *
+- *  MMC sysfs/driver model support.
+- */
+-#include <linux/device.h>
+-
+-#include <linux/mmc/card.h>
+-
+-#include "sysfs.h"
+-
+-int mmc_add_attrs(struct mmc_card *card, struct device_attribute *attrs)
+-{
+-	int error = 0;
+-	int i;
+-
+-	for (i = 0; attr_name(attrs[i]); i++) {
+-		error = device_create_file(&card->dev, &attrs[i]);
+-		if (error) {
+-			while (--i >= 0)
+-				device_remove_file(&card->dev, &attrs[i]);
+-			break;
+-		}
+-	}
+-
+-	return error;
+-}
+-
+-void mmc_remove_attrs(struct mmc_card *card, struct device_attribute *attrs)
+-{
+-	int i;
+-
+-	for (i = 0; attr_name(attrs[i]); i++)
+-		device_remove_file(&card->dev, &attrs[i]);
+-}
+-
+diff --git a/drivers/mmc/core/sysfs.h b/drivers/mmc/core/sysfs.h
+deleted file mode 100644
+index 4b8f670..0000000
+--- a/drivers/mmc/core/sysfs.h
++++ /dev/null
+@@ -1,26 +0,0 @@
+-/*
+- *  linux/drivers/mmc/core/sysfs.h
+- *
+- *  Copyright (C) 2003 Russell King, All Rights Reserved.
+- *  Copyright 2007 Pierre Ossman
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License version 2 as
+- * published by the Free Software Foundation.
+- */
+-#ifndef _MMC_CORE_SYSFS_H
+-#define _MMC_CORE_SYSFS_H
+-
+-#define MMC_ATTR_FN(name, fmt, args...)					\
+-static ssize_t mmc_##name##_show (struct device *dev, struct device_attribute *attr, char *buf)	\
+-{									\
+-	struct mmc_card *card = container_of(dev, struct mmc_card, dev);\
+-	return sprintf(buf, fmt, args);					\
+-}
+-
+-#define MMC_ATTR_RO(name) __ATTR(name, S_IRUGO, mmc_##name##_show, NULL)
+-
+-int mmc_add_attrs(struct mmc_card *card, struct device_attribute *attrs);
+-void mmc_remove_attrs(struct mmc_card *card, struct device_attribute *attrs);
+-
+-#endif
 diff --git a/drivers/net/3c501.c b/drivers/net/3c501.c
 index 7d25368..5ba4bab 100644
 --- a/drivers/net/3c501.c
@@ -12667,6 +13305,95 @@
  		rc = pciehp_enable_slot(t_slot);
  		if (rc)	/* -ENODEV: shouldn't happen, but deal with it */
  			value = 0;
+diff --git a/drivers/pnp/isapnp/core.c b/drivers/pnp/isapnp/core.c
+index 2c925b7..257f5d8 100644
+--- a/drivers/pnp/isapnp/core.c
++++ b/drivers/pnp/isapnp/core.c
+@@ -88,6 +88,15 @@ MODULE_LICENSE("GPL");
+ #define _LTAG_MEM32RANGE	0x85
+ #define _LTAG_FIXEDMEM32RANGE	0x86
+ 
++/*
++ * Sizes of ISAPNP logical device configuration register sets.
++ * See PNP-ISA-v1.0a.pdf, Appendix A.
++ */
++#define ISAPNP_MAX_MEM		4
++#define ISAPNP_MAX_PORT		8
++#define ISAPNP_MAX_IRQ		2
++#define ISAPNP_MAX_DMA		2
++
+ static unsigned char isapnp_checksum_value;
+ static DEFINE_MUTEX(isapnp_cfg_mutex);
+ static int isapnp_csn_count;
+@@ -945,14 +954,14 @@ static int isapnp_read_resources(struct pnp_dev *dev,
+ 
+ 	dev->active = isapnp_read_byte(ISAPNP_CFG_ACTIVATE);
+ 	if (dev->active) {
+-		for (tmp = 0; tmp < PNP_MAX_PORT; tmp++) {
++		for (tmp = 0; tmp < ISAPNP_MAX_PORT; tmp++) {
+ 			ret = isapnp_read_word(ISAPNP_CFG_PORT + (tmp << 1));
+ 			if (!ret)
+ 				continue;
+ 			res->port_resource[tmp].start = ret;
+ 			res->port_resource[tmp].flags = IORESOURCE_IO;
+ 		}
+-		for (tmp = 0; tmp < PNP_MAX_MEM; tmp++) {
++		for (tmp = 0; tmp < ISAPNP_MAX_MEM; tmp++) {
+ 			ret =
+ 			    isapnp_read_word(ISAPNP_CFG_MEM + (tmp << 3)) << 8;
+ 			if (!ret)
+@@ -960,7 +969,7 @@ static int isapnp_read_resources(struct pnp_dev *dev,
+ 			res->mem_resource[tmp].start = ret;
+ 			res->mem_resource[tmp].flags = IORESOURCE_MEM;
+ 		}
+-		for (tmp = 0; tmp < PNP_MAX_IRQ; tmp++) {
++		for (tmp = 0; tmp < ISAPNP_MAX_IRQ; tmp++) {
+ 			ret =
+ 			    (isapnp_read_word(ISAPNP_CFG_IRQ + (tmp << 1)) >>
+ 			     8);
+@@ -970,7 +979,7 @@ static int isapnp_read_resources(struct pnp_dev *dev,
+ 			    res->irq_resource[tmp].end = ret;
+ 			res->irq_resource[tmp].flags = IORESOURCE_IRQ;
+ 		}
+-		for (tmp = 0; tmp < PNP_MAX_DMA; tmp++) {
++		for (tmp = 0; tmp < ISAPNP_MAX_DMA; tmp++) {
+ 			ret = isapnp_read_byte(ISAPNP_CFG_DMA + tmp);
+ 			if (ret == 4)
+ 				continue;
+@@ -1002,14 +1011,14 @@ static int isapnp_set_resources(struct pnp_dev *dev,
+ 	isapnp_cfg_begin(dev->card->number, dev->number);
+ 	dev->active = 1;
+ 	for (tmp = 0;
+-	     tmp < PNP_MAX_PORT
++	     tmp < ISAPNP_MAX_PORT
+ 	     && (res->port_resource[tmp].
+ 		 flags & (IORESOURCE_IO | IORESOURCE_UNSET)) == IORESOURCE_IO;
+ 	     tmp++)
+ 		isapnp_write_word(ISAPNP_CFG_PORT + (tmp << 1),
+ 				  res->port_resource[tmp].start);
+ 	for (tmp = 0;
+-	     tmp < PNP_MAX_IRQ
++	     tmp < ISAPNP_MAX_IRQ
+ 	     && (res->irq_resource[tmp].
+ 		 flags & (IORESOURCE_IRQ | IORESOURCE_UNSET)) == IORESOURCE_IRQ;
+ 	     tmp++) {
+@@ -1019,14 +1028,14 @@ static int isapnp_set_resources(struct pnp_dev *dev,
+ 		isapnp_write_byte(ISAPNP_CFG_IRQ + (tmp << 1), irq);
+ 	}
+ 	for (tmp = 0;
+-	     tmp < PNP_MAX_DMA
++	     tmp < ISAPNP_MAX_DMA
+ 	     && (res->dma_resource[tmp].
+ 		 flags & (IORESOURCE_DMA | IORESOURCE_UNSET)) == IORESOURCE_DMA;
+ 	     tmp++)
+ 		isapnp_write_byte(ISAPNP_CFG_DMA + tmp,
+ 				  res->dma_resource[tmp].start);
+ 	for (tmp = 0;
+-	     tmp < PNP_MAX_MEM
++	     tmp < ISAPNP_MAX_MEM
+ 	     && (res->mem_resource[tmp].
+ 		 flags & (IORESOURCE_MEM | IORESOURCE_UNSET)) == IORESOURCE_MEM;
+ 	     tmp++)
 diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
 index 82f5ad9..9e7de63 100644
 --- a/drivers/rtc/Kconfig
@@ -14555,6 +15282,620 @@
   * @bh: struct buffer_head
   *
   * Returns zero on success and -EIO on error.
+diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c
+index 7f88382..a1a95b0 100644
+--- a/fs/cifs/cifs_dfs_ref.c
++++ b/fs/cifs/cifs_dfs_ref.c
+@@ -74,7 +74,7 @@ static char *cifs_get_share_name(const char *node_name)
+ 	pSep = memchr(UNC+2, '\\', len-2);
+ 	if (!pSep) {
+ 		cERROR(1, ("%s: no server name end in node name: %s",
+-			__FUNCTION__, node_name));
++			__func__, node_name));
+ 		kfree(UNC);
+ 		return NULL;
+ 	}
+@@ -84,7 +84,7 @@ static char *cifs_get_share_name(const char *node_name)
+ 	pSep = memchr(UNC+(pSep-UNC), '\\', len-(pSep-UNC));
+ 	if (!pSep) {
+ 		cERROR(1, ("%s:2 cant find share name in node name: %s",
+-			__FUNCTION__, node_name));
++			__func__, node_name));
+ 		kfree(UNC);
+ 		return NULL;
+ 	}
+@@ -127,7 +127,7 @@ static char *compose_mount_options(const char *sb_mountdata,
+ 	rc = dns_resolve_server_name_to_ip(*devname, &srvIP);
+ 	if (rc != 0) {
+ 		cERROR(1, ("%s: Failed to resolve server part of %s to IP",
+-			  __FUNCTION__, *devname));
++			  __func__, *devname));
+ 		mountdata = ERR_PTR(rc);
+ 		goto compose_mount_options_out;
+ 	}
+@@ -181,8 +181,8 @@ static char *compose_mount_options(const char *sb_mountdata,
+ 		}
+ 	}
+ 
+-	/*cFYI(1,("%s: parent mountdata: %s", __FUNCTION__,sb_mountdata));*/
+-	/*cFYI(1, ("%s: submount mountdata: %s", __FUNCTION__, mountdata ));*/
++	/*cFYI(1,("%s: parent mountdata: %s", __func__,sb_mountdata));*/
++	/*cFYI(1, ("%s: submount mountdata: %s", __func__, mountdata ));*/
+ 
+ compose_mount_options_out:
+ 	kfree(srvIP);
+@@ -302,7 +302,7 @@ cifs_dfs_follow_mountpoint(struct dentry *dentry, struct nameidata *nd)
+ 	int rc = 0;
+ 	struct vfsmount *mnt = ERR_PTR(-ENOENT);
+ 
+-	cFYI(1, ("in %s", __FUNCTION__));
++	cFYI(1, ("in %s", __func__));
+ 	BUG_ON(IS_ROOT(dentry));
+ 
+ 	xid = GetXid();
+@@ -336,7 +336,7 @@ cifs_dfs_follow_mountpoint(struct dentry *dentry, struct nameidata *nd)
+ 			len = strlen(referrals[i].node_name);
+ 			if (len < 2) {
+ 				cERROR(1, ("%s: Net Address path too short: %s",
+-					__FUNCTION__, referrals[i].node_name));
++					__func__, referrals[i].node_name));
+ 				rc = -EINVAL;
+ 				goto out_err;
+ 			}
+@@ -344,7 +344,7 @@ cifs_dfs_follow_mountpoint(struct dentry *dentry, struct nameidata *nd)
+ 						nd->path.dentry,
+ 						referrals[i].node_name);
+ 			cFYI(1, ("%s: cifs_dfs_do_refmount:%s , mnt:%p",
+-					 __FUNCTION__,
++					 __func__,
+ 					referrals[i].node_name, mnt));
+ 
+ 			/* complete mount procedure if we accured submount */
+@@ -365,7 +365,7 @@ out:
+ 	FreeXid(xid);
+ 	free_dfs_info_array(referrals, num_referrals);
+ 	kfree(full_path);
+-	cFYI(1, ("leaving %s" , __FUNCTION__));
++	cFYI(1, ("leaving %s" , __func__));
+ 	return ERR_PTR(rc);
+ out_err:
+ 	path_put(&nd->path);
+diff --git a/fs/cifs/cifsacl.c b/fs/cifs/cifsacl.c
+index f93932c..1f5a428 100644
+--- a/fs/cifs/cifsacl.c
++++ b/fs/cifs/cifsacl.c
+@@ -1,7 +1,7 @@
+ /*
+  *   fs/cifs/cifsacl.c
+  *
+- *   Copyright (C) International Business Machines  Corp., 2007
++ *   Copyright (C) International Business Machines  Corp., 2007,2008
+  *   Author(s): Steve French (sfrench at us.ibm.com)
+  *
+  *   Contains the routines for mapping CIFS/NTFS ACLs
+@@ -556,9 +556,9 @@ static int build_sec_desc(struct cifs_ntsd *pntsd, struct cifs_ntsd *pnntsd,
+ 
+ /* Retrieve an ACL from the server */
+ static struct cifs_ntsd *get_cifs_acl(u32 *pacllen, struct inode *inode,
+-				       const char *path)
++				       const char *path, const __u16 *pfid)
+ {
+-	struct cifsFileInfo *open_file;
++	struct cifsFileInfo *open_file = NULL;
+ 	int unlock_file = FALSE;
+ 	int xid;
+ 	int rc = -EIO;
+@@ -573,7 +573,11 @@ static struct cifs_ntsd *get_cifs_acl(u32 *pacllen, struct inode *inode,
+ 		return NULL;
+ 
+ 	xid = GetXid();
+-	open_file = find_readable_file(CIFS_I(inode));
++	if (pfid == NULL)
++		open_file = find_readable_file(CIFS_I(inode));
++	else
++		fid = *pfid;
++
+ 	sb = inode->i_sb;
+ 	if (sb == NULL) {
+ 		FreeXid(xid);
+@@ -584,7 +588,7 @@ static struct cifs_ntsd *get_cifs_acl(u32 *pacllen, struct inode *inode,
+ 	if (open_file) {
+ 		unlock_file = TRUE;
+ 		fid = open_file->netfid;
+-	} else {
++	} else if (pfid == NULL) {
+ 		int oplock = FALSE;
+ 		/* open file */
+ 		rc = CIFSSMBOpen(xid, cifs_sb->tcon, path, FILE_OPEN,
+@@ -600,10 +604,11 @@ static struct cifs_ntsd *get_cifs_acl(u32 *pacllen, struct inode *inode,
+ 
+ 	rc = CIFSSMBGetCIFSACL(xid, cifs_sb->tcon, fid, &pntsd, pacllen);
+ 	cFYI(1, ("GetCIFSACL rc = %d ACL len %d", rc, *pacllen));
+-	if (unlock_file == TRUE)
++	if (unlock_file == TRUE) /* find_readable_file increments ref count */
+ 		atomic_dec(&open_file->wrtPending);
+-	else
++	else if (pfid == NULL) /* if opened above we have to close the handle */
+ 		CIFSSMBClose(xid, cifs_sb->tcon, fid);
++	/* else handle was passed in by caller */
+ 
+ 	FreeXid(xid);
+ 	return pntsd;
+@@ -664,14 +669,14 @@ static int set_cifs_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
+ }
+ 
+ /* Translate the CIFS ACL (simlar to NTFS ACL) for a file into mode bits */
+-void acl_to_uid_mode(struct inode *inode, const char *path)
++void acl_to_uid_mode(struct inode *inode, const char *path, const __u16 *pfid)
+ {
+ 	struct cifs_ntsd *pntsd = NULL;
+ 	u32 acllen = 0;
+ 	int rc = 0;
+ 
+ 	cFYI(DBG2, ("converting ACL to mode for %s", path));
+-	pntsd = get_cifs_acl(&acllen, inode, path);
++	pntsd = get_cifs_acl(&acllen, inode, path, pfid);
+ 
+ 	/* if we can retrieve the ACL, now parse Access Control Entries, ACEs */
+ 	if (pntsd)
+@@ -694,7 +699,7 @@ int mode_to_acl(struct inode *inode, const char *path, __u64 nmode)
+ 	cFYI(DBG2, ("set ACL from mode for %s", path));
+ 
+ 	/* Get the security descriptor */
+-	pntsd = get_cifs_acl(&acllen, inode, path);
++	pntsd = get_cifs_acl(&acllen, inode, path, NULL);
+ 
+ 	/* Add three ACEs for owner, group, everyone getting rid of
+ 	   other ACEs as chmod disables ACEs and set the security descriptor */
+diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
+index 0af63e6..7e5e0e7 100644
+--- a/fs/cifs/cifsproto.h
++++ b/fs/cifs/cifsproto.h
+@@ -39,8 +39,8 @@ extern int smb_send(struct socket *, struct smb_hdr *,
+ 			unsigned int /* length */ , struct sockaddr *);
+ extern unsigned int _GetXid(void);
+ extern void _FreeXid(unsigned int);
+-#define GetXid() (int)_GetXid(); cFYI(1,("CIFS VFS: in %s as Xid: %d with uid: %d",__FUNCTION__, xid,current->fsuid));
+-#define FreeXid(curr_xid) {_FreeXid(curr_xid); cFYI(1,("CIFS VFS: leaving %s (xid = %d) rc = %d",__FUNCTION__,curr_xid,(int)rc));}
++#define GetXid() (int)_GetXid(); cFYI(1,("CIFS VFS: in %s as Xid: %d with uid: %d",__func__, xid,current->fsuid));
++#define FreeXid(curr_xid) {_FreeXid(curr_xid); cFYI(1,("CIFS VFS: leaving %s (xid = %d) rc = %d",__func__,curr_xid,(int)rc));}
+ extern char *build_path_from_dentry(struct dentry *);
+ extern char *build_wildcard_path_from_dentry(struct dentry *direntry);
+ /* extern void renew_parental_timestamps(struct dentry *direntry);*/
+@@ -92,11 +92,12 @@ extern struct timespec cnvrtDosUnixTm(__u16 date, __u16 time);
+ extern int cifs_get_inode_info(struct inode **pinode,
+ 			const unsigned char *search_path,
+ 			FILE_ALL_INFO * pfile_info,
+-			struct super_block *sb, int xid);
++			struct super_block *sb, int xid, const __u16 *pfid);
+ extern int cifs_get_inode_info_unix(struct inode **pinode,
+ 			const unsigned char *search_path,
+ 			struct super_block *sb, int xid);
+-extern void acl_to_uid_mode(struct inode *inode, const char *search_path);
++extern void acl_to_uid_mode(struct inode *inode, const char *path,
++			    const __u16 *pfid);
+ extern int mode_to_acl(struct inode *inode, const char *path, __u64);
+ 
+ extern int cifs_mount(struct super_block *, struct cifs_sb_info *, char *,
+diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c
+index 4e83b47..0f5c62b 100644
+--- a/fs/cifs/dir.c
++++ b/fs/cifs/dir.c
+@@ -229,7 +229,8 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode,
+ 						 inode->i_sb, xid);
+ 		else {
+ 			rc = cifs_get_inode_info(&newinode, full_path,
+-						 buf, inode->i_sb, xid);
++						 buf, inode->i_sb, xid,
++						 &fileHandle);
+ 			if (newinode) {
+ 				newinode->i_mode = mode;
+ 				if ((oplock & CIFS_CREATE_ACTION) &&
+@@ -483,7 +484,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry,
+ 					      parent_dir_inode->i_sb, xid);
+ 	else
+ 		rc = cifs_get_inode_info(&newInode, full_path, NULL,
+-					 parent_dir_inode->i_sb, xid);
++					 parent_dir_inode->i_sb, xid, NULL);
+ 
+ 	if ((rc == 0) && (newInode != NULL)) {
+ 		if (pTcon->nocase)
+diff --git a/fs/cifs/dns_resolve.c b/fs/cifs/dns_resolve.c
+index ef7f438..7cc86c4 100644
+--- a/fs/cifs/dns_resolve.c
++++ b/fs/cifs/dns_resolve.c
+@@ -77,14 +77,14 @@ dns_resolve_server_name_to_ip(const char *unc, char **ip_addr)
+ 	/* search for server name delimiter */
+ 	len = strlen(unc);
+ 	if (len < 3) {
+-		cFYI(1, ("%s: unc is too short: %s", __FUNCTION__, unc));
++		cFYI(1, ("%s: unc is too short: %s", __func__, unc));
+ 		return -EINVAL;
+ 	}
+ 	len -= 2;
+ 	name = memchr(unc+2, '\\', len);
+ 	if (!name) {
+ 		cFYI(1, ("%s: probably server name is whole unc: %s",
+-					__FUNCTION__, unc));
++					__func__, unc));
+ 	} else {
+ 		len = (name - unc) - 2/* leading // */;
+ 	}
+@@ -104,7 +104,7 @@ dns_resolve_server_name_to_ip(const char *unc, char **ip_addr)
+ 		if (*ip_addr) {
+ 			memcpy(*ip_addr, rkey->payload.data, len);
+ 			(*ip_addr)[len] = '\0';
+-			cFYI(1, ("%s: resolved: %s to %s", __FUNCTION__,
++			cFYI(1, ("%s: resolved: %s to %s", __func__,
+ 					rkey->description,
+ 					*ip_addr
+ 				));
+@@ -114,7 +114,7 @@ dns_resolve_server_name_to_ip(const char *unc, char **ip_addr)
+ 		}
+ 		key_put(rkey);
+ 	} else {
+-		cERROR(1, ("%s: unable to resolve: %s", __FUNCTION__, name));
++		cERROR(1, ("%s: unable to resolve: %s", __func__, name));
+ 	}
+ 
+ 	kfree(name);
+diff --git a/fs/cifs/file.c b/fs/cifs/file.c
+index fa849c9..40b6900 100644
+--- a/fs/cifs/file.c
++++ b/fs/cifs/file.c
+@@ -145,7 +145,7 @@ client_can_cache:
+ 			full_path, inode->i_sb, xid);
+ 	else
+ 		rc = cifs_get_inode_info(&file->f_path.dentry->d_inode,
+-			full_path, buf, inode->i_sb, xid);
++			full_path, buf, inode->i_sb, xid, NULL);
+ 
+ 	if ((*oplock & 0xF) == OPLOCK_EXCLUSIVE) {
+ 		pCifsInode->clientCanCacheAll = TRUE;
+@@ -440,7 +440,7 @@ reopen_error_exit:
+ 				else
+ 					rc = cifs_get_inode_info(&inode,
+ 						full_path, NULL, inode->i_sb,
+-						xid);
++						xid, NULL);
+ 			} /* else we are writing out data to server already
+ 			     and could deadlock if we tried to flush data, and
+ 			     since we do not know if we have data that would
+diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
+index 24eb4d3..bc673c8 100644
+--- a/fs/cifs/inode.c
++++ b/fs/cifs/inode.c
+@@ -30,7 +30,7 @@
+ #include "cifs_fs_sb.h"
+ 
+ 
+-static void cifs_set_ops(struct inode *inode)
++static void cifs_set_ops(struct inode *inode, const bool is_dfs_referral)
+ {
+ 	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
+ 
+@@ -57,8 +57,16 @@ static void cifs_set_ops(struct inode *inode)
+ 			inode->i_data.a_ops = &cifs_addr_ops;
+ 		break;
+ 	case S_IFDIR:
+-		inode->i_op = &cifs_dir_inode_ops;
+-		inode->i_fop = &cifs_dir_ops;
++#ifdef CONFIG_CIFS_DFS_UPCALL
++		if (is_dfs_referral) {
++			inode->i_op = &cifs_dfs_referral_inode_operations;
++		} else {
++#else /* NO DFS support, treat as a directory */
++		{
++#endif
++			inode->i_op = &cifs_dir_inode_ops;
++			inode->i_fop = &cifs_dir_ops;
++		}
+ 		break;
+ 	case S_IFLNK:
+ 		inode->i_op = &cifs_symlink_inode_ops;
+@@ -153,6 +161,30 @@ static void cifs_unix_info_to_inode(struct inode *inode,
+ 	spin_unlock(&inode->i_lock);
+ }
+ 
++static const unsigned char *cifs_get_search_path(struct cifsTconInfo *pTcon,
++					const char *search_path)
++{
++	int tree_len;
++	int path_len;
++	char *tmp_path;
++
++	if (!(pTcon->Flags & SMB_SHARE_IS_IN_DFS))
++		return search_path;
++
++	/* use full path name for working with DFS */
++	tree_len = strnlen(pTcon->treeName, MAX_TREE_SIZE + 1);
++	path_len = strnlen(search_path, MAX_PATHCONF);
++
++	tmp_path = kmalloc(tree_len+path_len+1, GFP_KERNEL);
++	if (tmp_path == NULL)
++		return search_path;
++
++	strncpy(tmp_path, pTcon->treeName, tree_len);
++	strncpy(tmp_path+tree_len, search_path, path_len);
++	tmp_path[tree_len+path_len] = 0;
++	return tmp_path;
++}
++
+ int cifs_get_inode_info_unix(struct inode **pinode,
+ 	const unsigned char *search_path, struct super_block *sb, int xid)
+ {
+@@ -161,41 +193,31 @@ int cifs_get_inode_info_unix(struct inode **pinode,
+ 	struct cifsTconInfo *pTcon;
+ 	struct inode *inode;
+ 	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
+-	char *tmp_path;
++	const unsigned char *full_path;
++	bool is_dfs_referral = false;
+ 
+ 	pTcon = cifs_sb->tcon;
+ 	cFYI(1, ("Getting info on %s", search_path));
++
++	full_path = cifs_get_search_path(pTcon, search_path);
++
++try_again_CIFSSMBUnixQPathInfo:
+ 	/* could have done a find first instead but this returns more info */
+-	rc = CIFSSMBUnixQPathInfo(xid, pTcon, search_path, &findData,
++	rc = CIFSSMBUnixQPathInfo(xid, pTcon, full_path, &findData,
+ 				  cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
+ 					CIFS_MOUNT_MAP_SPECIAL_CHR);
+ /*	dump_mem("\nUnixQPathInfo return data", &findData,
+ 		 sizeof(findData)); */
+ 	if (rc) {
+-		if (rc == -EREMOTE) {
+-			tmp_path =
+-			    kmalloc(strnlen(pTcon->treeName,
+-					    MAX_TREE_SIZE + 1) +
+-				    strnlen(search_path, MAX_PATHCONF) + 1,
+-				    GFP_KERNEL);
+-			if (tmp_path == NULL)
+-				return -ENOMEM;
+-
+-			/* have to skip first of the double backslash of
+-			   UNC name */
+-			strncpy(tmp_path, pTcon->treeName, MAX_TREE_SIZE);
+-			strncat(tmp_path, search_path, MAX_PATHCONF);
+-			rc = connect_to_dfs_path(xid, pTcon->ses,
+-						 /* treename + */ tmp_path,
+-						 cifs_sb->local_nls,
+-						 cifs_sb->mnt_cifs_flags &
+-						    CIFS_MOUNT_MAP_SPECIAL_CHR);
+-			kfree(tmp_path);
+-
+-			/* BB fix up inode etc. */
+-		} else if (rc) {
+-			return rc;
++		if (rc == -EREMOTE && !is_dfs_referral) {
++			is_dfs_referral = true;
++			if (full_path != search_path) {
++				kfree(full_path);
++				full_path = search_path;
++			}
++			goto try_again_CIFSSMBUnixQPathInfo;
+ 		}
++		goto cgiiu_exit;
+ 	} else {
+ 		struct cifsInodeInfo *cifsInfo;
+ 		__u64 num_of_bytes = le64_to_cpu(findData.NumOfBytes);
+@@ -204,8 +226,10 @@ int cifs_get_inode_info_unix(struct inode **pinode,
+ 		/* get new inode */
+ 		if (*pinode == NULL) {
+ 			*pinode = new_inode(sb);
+-			if (*pinode == NULL)
+-				return -ENOMEM;
++			if (*pinode == NULL) {
++				rc = -ENOMEM;
++				goto cgiiu_exit;
++			}
+ 			/* Is an i_ino of zero legal? */
+ 			/* Are there sanity checks we can use to ensure that
+ 			   the server is really filling in that field? */
+@@ -237,8 +261,11 @@ int cifs_get_inode_info_unix(struct inode **pinode,
+ 			(unsigned long) inode->i_size,
+ 			(unsigned long long)inode->i_blocks));
+ 
+-		cifs_set_ops(inode);
++		cifs_set_ops(inode, is_dfs_referral);
+ 	}
++cgiiu_exit:
++	if (full_path != search_path)
++		kfree(full_path);
+ 	return rc;
+ }
+ 
+@@ -347,15 +374,16 @@ static int get_sfu_mode(struct inode *inode,
+ 
+ int cifs_get_inode_info(struct inode **pinode,
+ 	const unsigned char *search_path, FILE_ALL_INFO *pfindData,
+-	struct super_block *sb, int xid)
++	struct super_block *sb, int xid, const __u16 *pfid)
+ {
+ 	int rc = 0;
+ 	struct cifsTconInfo *pTcon;
+ 	struct inode *inode;
+ 	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
+-	char *tmp_path;
++	const unsigned char *full_path = NULL;
+ 	char *buf = NULL;
+ 	int adjustTZ = FALSE;
++	bool is_dfs_referral = false;
+ 
+ 	pTcon = cifs_sb->tcon;
+ 	cFYI(1, ("Getting info on %s", search_path));
+@@ -373,8 +401,12 @@ int cifs_get_inode_info(struct inode **pinode,
+ 		if (buf == NULL)
+ 			return -ENOMEM;
+ 		pfindData = (FILE_ALL_INFO *)buf;
++
++		full_path = cifs_get_search_path(pTcon, search_path);
++
++try_again_CIFSSMBQPathInfo:
+ 		/* could do find first instead but this returns more info */
+-		rc = CIFSSMBQPathInfo(xid, pTcon, search_path, pfindData,
++		rc = CIFSSMBQPathInfo(xid, pTcon, full_path, pfindData,
+ 			      0 /* not legacy */,
+ 			      cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
+ 				CIFS_MOUNT_MAP_SPECIAL_CHR);
+@@ -382,7 +414,7 @@ int cifs_get_inode_info(struct inode **pinode,
+ 		when server claims no NT SMB support and the above call
+ 		failed at least once - set flag in tcon or mount */
+ 		if ((rc == -EOPNOTSUPP) || (rc == -EINVAL)) {
+-			rc = SMBQueryInformation(xid, pTcon, search_path,
++			rc = SMBQueryInformation(xid, pTcon, full_path,
+ 					pfindData, cifs_sb->local_nls,
+ 					cifs_sb->mnt_cifs_flags &
+ 					  CIFS_MOUNT_MAP_SPECIAL_CHR);
+@@ -391,31 +423,15 @@ int cifs_get_inode_info(struct inode **pinode,
+ 	}
+ 	/* dump_mem("\nQPathInfo return data",&findData, sizeof(findData)); */
+ 	if (rc) {
+-		if (rc == -EREMOTE) {
+-			tmp_path =
+-			    kmalloc(strnlen
+-				    (pTcon->treeName,
+-				     MAX_TREE_SIZE + 1) +
+-				    strnlen(search_path, MAX_PATHCONF) + 1,
+-				    GFP_KERNEL);
+-			if (tmp_path == NULL) {
+-				kfree(buf);
+-				return -ENOMEM;
++		if (rc == -EREMOTE && !is_dfs_referral) {
++			is_dfs_referral = true;
++			if (full_path != search_path) {
++				kfree(full_path);
++				full_path = search_path;
+ 			}
+-
+-			strncpy(tmp_path, pTcon->treeName, MAX_TREE_SIZE);
+-			strncat(tmp_path, search_path, MAX_PATHCONF);
+-			rc = connect_to_dfs_path(xid, pTcon->ses,
+-						 /* treename + */ tmp_path,
+-						 cifs_sb->local_nls,
+-						 cifs_sb->mnt_cifs_flags &
+-						   CIFS_MOUNT_MAP_SPECIAL_CHR);
+-			kfree(tmp_path);
+-			/* BB fix up inode etc. */
+-		} else if (rc) {
+-			kfree(buf);
+-			return rc;
++			goto try_again_CIFSSMBQPathInfo;
+ 		}
++		goto cgii_exit;
+ 	} else {
+ 		struct cifsInodeInfo *cifsInfo;
+ 		__u32 attr = le32_to_cpu(pfindData->Attributes);
+@@ -424,8 +440,8 @@ int cifs_get_inode_info(struct inode **pinode,
+ 		if (*pinode == NULL) {
+ 			*pinode = new_inode(sb);
+ 			if (*pinode == NULL) {
+-				kfree(buf);
+-				return -ENOMEM;
++				rc = -ENOMEM;
++				goto cgii_exit;
+ 			}
+ 			/* Is an i_ino of zero legal? Can we use that to check
+ 			   if the server supports returning inode numbers?  Are
+@@ -559,7 +575,7 @@ int cifs_get_inode_info(struct inode **pinode,
+ 		/* fill in 0777 bits from ACL */
+ 		if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_CIFS_ACL) {
+ 			cFYI(1, ("Getting mode bits from ACL"));
+-			acl_to_uid_mode(inode, search_path);
++			acl_to_uid_mode(inode, search_path, pfid);
+ 		}
+ #endif
+ 		if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) {
+@@ -573,8 +589,11 @@ int cifs_get_inode_info(struct inode **pinode,
+ 			atomic_set(&cifsInfo->inUse, 1);
+ 		}
+ 
+-		cifs_set_ops(inode);
++		cifs_set_ops(inode, is_dfs_referral);
+ 	}
++cgii_exit:
++	if (full_path != search_path)
++		kfree(full_path);
+ 	kfree(buf);
+ 	return rc;
+ }
+@@ -603,7 +622,8 @@ struct inode *cifs_iget(struct super_block *sb, unsigned long ino)
+ 	if (cifs_sb->tcon->unix_ext)
+ 		rc = cifs_get_inode_info_unix(&inode, "", inode->i_sb, xid);
+ 	else
+-		rc = cifs_get_inode_info(&inode, "", NULL, inode->i_sb, xid);
++		rc = cifs_get_inode_info(&inode, "", NULL, inode->i_sb, xid,
++					 NULL);
+ 	if (rc && cifs_sb->tcon->ipc) {
+ 		cFYI(1, ("ipc connection - fake read inode"));
+ 		inode->i_mode |= S_IFDIR;
+@@ -804,7 +824,7 @@ static void posix_fill_in_inode(struct inode *tmp_inode,
+ 	local_size  = tmp_inode->i_size;
+ 
+ 	cifs_unix_info_to_inode(tmp_inode, pData, 1);
+-	cifs_set_ops(tmp_inode);
++	cifs_set_ops(tmp_inode, false);
+ 
+ 	if (!S_ISREG(tmp_inode->i_mode))
+ 		return;
+@@ -936,7 +956,7 @@ mkdir_get_info:
+ 						      inode->i_sb, xid);
+ 		else
+ 			rc = cifs_get_inode_info(&newinode, full_path, NULL,
+-						 inode->i_sb, xid);
++						 inode->i_sb, xid, NULL);
+ 
+ 		if (pTcon->nocase)
+ 			direntry->d_op = &cifs_ci_dentry_ops;
+@@ -1218,7 +1238,7 @@ int cifs_revalidate(struct dentry *direntry)
+ 		}
+ 	} else {
+ 		rc = cifs_get_inode_info(&direntry->d_inode, full_path, NULL,
+-					 direntry->d_sb, xid);
++					 direntry->d_sb, xid, NULL);
+ 		if (rc) {
+ 			cFYI(1, ("error on getting revalidate info %d", rc));
+ /*			if (rc != -ENOENT)
+@@ -1407,11 +1427,10 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
+ 	}
+ 	cifsInode = CIFS_I(direntry->d_inode);
+ 
+-	/* BB check if we need to refresh inode from server now ? BB */
+-
+-	if (attrs->ia_valid & ATTR_SIZE) {
++	if ((attrs->ia_valid & ATTR_MTIME) || (attrs->ia_valid & ATTR_SIZE)) {
+ 		/*
+-		   Flush data before changing file size on server. If the
++		   Flush data before changing file size or changing the last
++		   write time of the file on the server. If the
+ 		   flush returns error, store it to report later and continue.
+ 		   BB: This should be smarter. Why bother flushing pages that
+ 		   will be truncated anyway? Also, should we error out here if
+@@ -1422,7 +1441,9 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
+ 			CIFS_I(direntry->d_inode)->write_behind_rc = rc;
+ 			rc = 0;
+ 		}
++	}
+ 
++	if (attrs->ia_valid & ATTR_SIZE) {
+ 		/* To avoid spurious oplock breaks from server, in the case of
+ 		   inodes that we already have open, avoid doing path based
+ 		   setting of file size if we can do it by handle.
+diff --git a/fs/cifs/link.c b/fs/cifs/link.c
+index 1d6fb01..d4e7ec9 100644
+--- a/fs/cifs/link.c
++++ b/fs/cifs/link.c
+@@ -205,7 +205,7 @@ cifs_symlink(struct inode *inode, struct dentry *direntry, const char *symname)
+ 						      inode->i_sb, xid);
+ 		else
+ 			rc = cifs_get_inode_info(&newinode, full_path, NULL,
+-						 inode->i_sb, xid);
++						 inode->i_sb, xid, NULL);
+ 
+ 		if (rc != 0) {
+ 			cFYI(1, ("Create symlink ok, getinodeinfo fail rc = %d",
 diff --git a/fs/dquot.c b/fs/dquot.c
 index 9c7feb6..41b9dbd 100644
 --- a/fs/dquot.c
@@ -14999,6 +16340,89 @@
  #endif
  #ifdef CONFIG_FAULT_INJECTION
  	REG("make-it-fail", S_IRUGO|S_IWUSR, fault_inject),
+diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
+index 4206454..9dfb5ff 100644
+--- a/fs/proc/task_mmu.c
++++ b/fs/proc/task_mmu.c
+@@ -527,13 +527,21 @@ struct pagemapread {
+ 	char __user *out, *end;
+ };
+ 
+-#define PM_ENTRY_BYTES sizeof(u64)
+-#define PM_RESERVED_BITS    3
+-#define PM_RESERVED_OFFSET  (64 - PM_RESERVED_BITS)
+-#define PM_RESERVED_MASK    (((1LL<<PM_RESERVED_BITS)-1) << PM_RESERVED_OFFSET)
+-#define PM_SPECIAL(nr)      (((nr) << PM_RESERVED_OFFSET) & PM_RESERVED_MASK)
+-#define PM_NOT_PRESENT      PM_SPECIAL(1LL)
+-#define PM_SWAP             PM_SPECIAL(2LL)
++#define PM_ENTRY_BYTES      sizeof(u64)
++#define PM_STATUS_BITS      3
++#define PM_STATUS_OFFSET    (64 - PM_STATUS_BITS)
++#define PM_STATUS_MASK      (((1LL << PM_STATUS_BITS) - 1) << PM_STATUS_OFFSET)
++#define PM_STATUS(nr)       (((nr) << PM_STATUS_OFFSET) & PM_STATUS_MASK)
++#define PM_PSHIFT_BITS      6
++#define PM_PSHIFT_OFFSET    (PM_STATUS_OFFSET - PM_PSHIFT_BITS)
++#define PM_PSHIFT_MASK      (((1LL << PM_PSHIFT_BITS) - 1) << PM_PSHIFT_OFFSET)
++#define PM_PSHIFT(x)        (((u64) (x) << PM_PSHIFT_OFFSET) & PM_PSHIFT_MASK)
++#define PM_PFRAME_MASK      ((1LL << PM_PSHIFT_OFFSET) - 1)
++#define PM_PFRAME(x)        ((x) & PM_PFRAME_MASK)
++
++#define PM_PRESENT          PM_STATUS(4LL)
++#define PM_SWAP             PM_STATUS(2LL)
++#define PM_NOT_PRESENT      PM_PSHIFT(PAGE_SHIFT)
+ #define PM_END_OF_BUFFER    1
+ 
+ static int add_to_pagemap(unsigned long addr, u64 pfn,
+@@ -574,7 +582,7 @@ static int pagemap_pte_hole(unsigned long start, unsigned long end,
+ u64 swap_pte_to_pagemap_entry(pte_t pte)
+ {
+ 	swp_entry_t e = pte_to_swp_entry(pte);
+-	return PM_SWAP | swp_type(e) | (swp_offset(e) << MAX_SWAPFILES_SHIFT);
++	return swp_type(e) | (swp_offset(e) << MAX_SWAPFILES_SHIFT);
+ }
+ 
+ static int pagemap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
+@@ -588,9 +596,11 @@ static int pagemap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
+ 		u64 pfn = PM_NOT_PRESENT;
+ 		pte = pte_offset_map(pmd, addr);
+ 		if (is_swap_pte(*pte))
+-			pfn = swap_pte_to_pagemap_entry(*pte);
++			pfn = PM_PFRAME(swap_pte_to_pagemap_entry(*pte))
++				| PM_PSHIFT(PAGE_SHIFT) | PM_SWAP;
+ 		else if (pte_present(*pte))
+-			pfn = pte_pfn(*pte);
++			pfn = PM_PFRAME(pte_pfn(*pte))
++				| PM_PSHIFT(PAGE_SHIFT) | PM_PRESENT;
+ 		/* unmap so we're not in atomic when we copy to userspace */
+ 		pte_unmap(pte);
+ 		err = add_to_pagemap(addr, pfn, pm);
+@@ -611,12 +621,20 @@ static struct mm_walk pagemap_walk = {
+ /*
+  * /proc/pid/pagemap - an array mapping virtual pages to pfns
+  *
+- * For each page in the address space, this file contains one 64-bit
+- * entry representing the corresponding physical page frame number
+- * (PFN) if the page is present. If there is a swap entry for the
+- * physical page, then an encoding of the swap file number and the
+- * page's offset into the swap file are returned. If no page is
+- * present at all, PM_NOT_PRESENT is returned. This allows determining
++ * For each page in the address space, this file contains one 64-bit entry
++ * consisting of the following:
++ *
++ * Bits 0-55  page frame number (PFN) if present
++ * Bits 0-4   swap type if swapped
++ * Bits 5-55  swap offset if swapped
++ * Bits 55-60 page shift (page size = 1<<page shift)
++ * Bit  61    reserved for future use
++ * Bit  62    page swapped
++ * Bit  63    page present
++ *
++ * If the page is not present but in swap, then the PFN contains an
++ * encoding of the swap file number and the page's offset into the
++ * swap. Unmapped pages return a null PFN. This allows determining
+  * precisely which pages are mapped (or in swap) and comparing mapped
+  * pages between processes.
+  *
 diff --git a/fs/romfs/inode.c b/fs/romfs/inode.c
 index 00b6f0a..3f13d49 100644
 --- a/fs/romfs/inode.c
@@ -15340,18 +16764,6 @@
  				struct page *topage)
  {
  	copy_page(to, from);
-diff --git a/include/asm-x86/pci_64.h b/include/asm-x86/pci_64.h
-index 3746903..da8266a 100644
---- a/include/asm-x86/pci_64.h
-+++ b/include/asm-x86/pci_64.h
-@@ -25,6 +25,7 @@ extern int (*pci_config_write)(int seg, int bus, int dev, int fn, int reg, int l
- 
- 
- 
-+extern void dma32_reserve_bootmem(void);
- extern void pci_iommu_alloc(void);
- 
- /* The PCI address space does equal the physical memory
 diff --git a/include/asm-x86/sync_bitops.h b/include/asm-x86/sync_bitops.h
 index cbce08a..6b775c9 100644
 --- a/include/asm-x86/sync_bitops.h
@@ -15510,6 +16922,19 @@
  	struct tc_u32_key	keys[0];
  };
  
+diff --git a/include/linux/pnp.h b/include/linux/pnp.h
+index cd6332b..29dd558 100644
+--- a/include/linux/pnp.h
++++ b/include/linux/pnp.h
+@@ -14,7 +14,7 @@
+ #include <linux/mod_devicetable.h>
+ 
+ #define PNP_MAX_PORT		40
+-#define PNP_MAX_MEM		12
++#define PNP_MAX_MEM		24
+ #define PNP_MAX_IRQ		2
+ #define PNP_MAX_DMA		2
+ #define PNP_NAME_LEN		50
 diff --git a/include/linux/ps2esdi.h b/include/linux/ps2esdi.h
 deleted file mode 100644
 index c0e050b..0000000

Modified: dists/trunk/linux-2.6/debian/patches/series/1~experimental.1
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/series/1~experimental.1	(original)
+++ dists/trunk/linux-2.6/debian/patches/series/1~experimental.1	Sun Mar 23 07:26:07 2008
@@ -1,4 +1,4 @@
-+ bugfix/all/patch-2.6.25-rc6-git6
++ bugfix/all/patch-2.6.25-rc6-git7
 + debian/version.patch
 + debian/kernelvariables.patch
 + debian/doc-build-parallel.patch



More information about the Kernel-svn-changes mailing list