[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