]> git.neil.brown.name Git - history.git/commitdiff
Import 2.1.119 2.1.119
authorLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:16:28 +0000 (15:16 -0500)
committerLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:16:28 +0000 (15:16 -0500)
16 files changed:
CREDITS
Documentation/Changes
Makefile
arch/ppc/kernel/pmac_setup.c
drivers/block/Config.in
drivers/block/Makefile
drivers/block/ide-pmac.c [new file with mode: 0644]
drivers/block/ide.c
drivers/block/nbd.c
drivers/isdn/isdn_common.c
drivers/scsi/hosts.c
fs/nfs/write.c
fs/smbfs/proc.c
include/asm-ppc/ide.h
include/linux/smb_fs.h
include/linux/smb_mount.h

diff --git a/CREDITS b/CREDITS
index c6c7c7f8752215b9c9b5a2bf8633d5ac212b312a..77d7ef22fbab37205212fa15a9be96cce1e72718 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -68,6 +68,7 @@ D: Parport hacker
 D: Implemented a workaround for some interrupt buggy printers
 D: Author of pscan that helps to fix lp/parport bug
 D: Author of lil (Linux Interrupt Latency benchmark)
+D: Fixed the shm swap deallocation at swapoff time (try_to_unuse message)
 D: Various other kernel hacks
 S: Via Ciaclini 26
 S: Imola 40026
index 15afefdcfa14dde97191855213f6e06e2ae7b2c2..df2eb36d4892064476fd19edbbf9cb96e6704275 100644 (file)
@@ -190,12 +190,6 @@ net-tools.  This will also fix other problems.  For example, the format
 of /proc/net/dev changed; as a result, an older ifconfig will
 incorrectly report errors.
 
-   As of 2.1.102, the firewalling code has been replaced with
-firewalling chains.  See
-http://www.adelaide.net.au/~rustcorp/ipfwchains/ipfwchains.html for
-more information.  Among other things, you'll now need to use ipchains
-instead of ipfwadm to configure your filters.
-
    The IP firewalling code has been replaced: ipfwadm will no longer
 work.  You need to obtain `ipchains', available from
 http://www.adelaide.net.au/~rustcorp/ipfwchains/ipfwchains.html
index ff40e2075c9b2cb11235b3be32e461e089d87378..d722bf94d72058a160ef7cd2c106f2c87b0a7235 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -72,6 +72,12 @@ ROOT_DEV = CURRENT
 
 #INSTALL_PATH=/boot
 
+#
+# INSTALL_MOD_PATH specifies a prefix to MODLIB for module directory 
+# relocations required by build roots.  This is not defined in the
+# makefile but the arguement can be passed to make if needed.
+#
+
 #
 # If you want to preset the SVGA mode, uncomment the next line and
 # set SVGA_MODE to whatever number you want.
@@ -289,7 +295,7 @@ $(patsubst %, _mod_%, $(SUBDIRS)) : include/linux/version.h
 
 modules_install:
        @( \
-       MODLIB=/lib/modules/$(VERSION).$(PATCHLEVEL).$(SUBLEVEL); \
+       MODLIB=$(INSTALL_MOD_PATH)/lib/modules/$(VERSION).$(PATCHLEVEL).$(SUBLEVEL); \
        cd modules; \
        MODULES=""; \
        inst_mod() { These="`cat $$1`"; MODULES="$$MODULES $$These"; \
index 46a11dd78641b41d4f0efeeaaa16b4f42674fea8..7e44b404c7ad532241700aa425d0813c967848b9 100644 (file)
@@ -44,7 +44,6 @@
 #include <asm/system.h>
 #include <asm/pgtable.h>
 #include <asm/io.h>
-#include <asm/ide.h>
 #include <asm/pci-bridge.h>
 #include <asm/adb.h>
 #include <asm/cuda.h>
@@ -273,94 +272,3 @@ __initfunc(void note_bootable_part(kdev_t dev, int part))
        }
 }
 
-#ifdef CONFIG_BLK_DEV_IDE
-int pmac_ide_ports_known;
-ide_ioreg_t pmac_ide_regbase[MAX_HWIFS];
-int pmac_ide_irq[MAX_HWIFS];
-
-__initfunc(void pmac_ide_init_hwif_ports(ide_ioreg_t *p, ide_ioreg_t base, int *irq))
-{
-       int i;
-
-       *p = 0;
-       if (base == 0)
-               return;
-       if (base == mb_cd_base && !check_media_bay(MB_CD)) {
-               mb_cd_index = -1;
-               return;
-       }
-       for (i = 0; i < 8; ++i)
-               *p++ = base + i * 0x10;
-       *p = base + 0x160;
-       if (irq != NULL) {
-               *irq = 0;
-               for (i = 0; i < MAX_HWIFS; ++i) {
-                       if (base == pmac_ide_regbase[i]) {
-                               *irq = pmac_ide_irq[i];
-                               break;
-                       }
-               }
-       }
-}
-
-__initfunc(void pmac_ide_probe(void))
-{
-       struct device_node *np;
-       int i;
-       struct device_node *atas;
-       struct device_node *p, **pp, *removables, **rp;
-
-       pp = &atas;
-       rp = &removables;
-       p = find_devices("ATA");
-       if (p == NULL)
-               p = find_devices("IDE");
-       if (p == NULL)
-               p = find_type_devices("ide");
-       if (p == NULL)
-               p = find_type_devices("ata");
-       /* Move removable devices such as the media-bay CDROM
-          on the PB3400 to the end of the list. */
-       for (; p != NULL; p = p->next) {
-               if (p->parent && p->parent->name
-                   && strcasecmp(p->parent->name, "media-bay") == 0) {
-                       *rp = p;
-                       rp = &p->next;
-               } else {
-                       *pp = p;
-                       pp = &p->next;
-               }
-       }
-       *rp = NULL;
-       *pp = removables;
-
-       for (i = 0, np = atas; i < MAX_HWIFS && np != NULL; np = np->next) {
-               if (np->n_addrs == 0) {
-                       printk(KERN_WARNING "ide: no address for device %s\n",
-                              np->full_name);
-                       continue;
-               }
-               pmac_ide_regbase[i] = (unsigned long)
-                       ioremap(np->addrs[0].address, 0x200);
-               if (np->n_intrs == 0) {
-                       printk("ide: no intrs for device %s, using 13\n",
-                              np->full_name);
-                       pmac_ide_irq[i] = 13;
-               } else {
-                       pmac_ide_irq[i] = np->intrs[0].line;
-               }
-
-               if (np->parent && np->parent->name
-                   && strcasecmp(np->parent->name, "media-bay") == 0) {
-                       mb_cd_index = i;
-                       mb_cd_base = pmac_ide_regbase[i];
-                       mb_cd_irq = pmac_ide_irq[i];
-               }
-
-               ++i;
-       }
-
-       pmac_ide_ports_known = 1;
-}
-#endif /* CONFIG_BLK_DEV_IDE */
-
index 86208ba98d62b8e138403e6806174b3131ffb45e..02bfe7dcd7c180282c6d4695443f9be953351f04 100644 (file)
@@ -48,6 +48,14 @@ else
           bool '   WInbond SL82c105 support' CONFIG_BLK_DEV_SL82C105
       fi
     fi
+    if [ "$CONFIG_PMAC" = "y" ]; then
+      define_bool CONFIG_BLK_DEV_IDE_PMAC y
+      bool '   PowerMac IDE DMA support' CONFIG_BLK_DEV_IDEDMA_PMAC
+      if [ "$CONFIG_BLK_DEV_IDEDMA_PMAC" = "y" ]; then
+        define_bool CONFIG_BLK_DEV_IDEDMA y
+       bool '     Use DMA by default' CONFIG_PMAC_IDEDMA_AUTO
+      fi
+    fi
     bool '   Other IDE chipset support' CONFIG_IDE_CHIPSETS
     if [ "$CONFIG_IDE_CHIPSETS" = "y" ]; then
       comment 'Note: most of these also require special kernel boot parameters'
index eff9baf4318554fd64fb3f7551c96b05c7f42692..fa943cc48048297bf79820916c8cac86eea90c34 100644 (file)
@@ -106,6 +106,10 @@ ifeq ($(CONFIG_BLK_DEV_CMD640),y)
 IDE_OBJS += cmd640.o
 endif
 
+ifeq ($(CONFIG_BLK_DEV_IDE_PMAC),y)
+IDE_OBJS += ide-pmac.o
+endif
+
 ifeq ($(CONFIG_BLK_DEV_IDEPCI),y)
 IDE_OBJS += ide-pci.o
 endif
diff --git a/drivers/block/ide-pmac.c b/drivers/block/ide-pmac.c
new file mode 100644 (file)
index 0000000..e034dc4
--- /dev/null
@@ -0,0 +1,298 @@
+/*
+ * Support for IDE interfaces on PowerMacs.
+ * These IDE interfaces are memory-mapped and have a DBDMA channel
+ * for doing DMA.
+ *
+ *  Copyright (C) 1998 Paul Mackerras.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version
+ *  2 of the License, or (at your option) any later version.
+ *
+ * Some code taken from drivers/block/ide-dma.c:
+ *
+ *  Copyright (c) 1995-1998  Mark Lord
+ *
+ */
+#include <linux/config.h>
+#include <linux/types.h>
+#include <linux/kernel.h>
+#include <linux/sched.h>
+#include <linux/init.h>
+#include <asm/prom.h>
+#include <asm/io.h>
+#include <asm/dbdma.h>
+#include <asm/ide.h>
+#include <asm/mediabay.h>
+#include "ide.h"
+
+ide_ioreg_t pmac_ide_regbase[MAX_HWIFS];
+int pmac_ide_irq[MAX_HWIFS];
+
+#ifdef CONFIG_BLK_DEV_IDEDMA_PMAC
+#define MAX_DCMDS      256     /* allow up to 256 DBDMA commands per xfer */
+
+static void pmac_ide_setup_dma(struct device_node *np, ide_hwif_t *hwif);
+static int pmac_ide_dmaproc(ide_dma_action_t func, ide_drive_t *drive);
+static int pmac_ide_build_dmatable(ide_drive_t *drive, int wr);
+#endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */
+
+__initfunc(void
+pmac_ide_init_hwif_ports(ide_ioreg_t *p, ide_ioreg_t base, int *irq))
+{
+       int i;
+
+       *p = 0;
+       if (base == 0)
+               return;
+       if (base == mb_cd_base && !check_media_bay(MB_CD)) {
+               mb_cd_index = -1;
+               return;
+       }
+       for (i = 0; i < 8; ++i)
+               *p++ = base + i * 0x10;
+       *p = base + 0x160;
+       if (irq != NULL) {
+               *irq = 0;
+               for (i = 0; i < MAX_HWIFS; ++i) {
+                       if (base == pmac_ide_regbase[i]) {
+                               *irq = pmac_ide_irq[i];
+                               break;
+                       }
+               }
+       }
+}
+
+__initfunc(void
+pmac_ide_probe(void))
+{
+       struct device_node *np;
+       int i;
+       struct device_node *atas;
+       struct device_node *p, **pp, *removables, **rp;
+       unsigned long base;
+       int irq;
+       ide_hwif_t *hwif;
+
+       if (_machine != _MACH_Pmac)
+               return;
+       pp = &atas;
+       rp = &removables;
+       p = find_devices("ATA");
+       if (p == NULL)
+               p = find_devices("IDE");
+       if (p == NULL)
+               p = find_type_devices("ide");
+       if (p == NULL)
+               p = find_type_devices("ata");
+       /* Move removable devices such as the media-bay CDROM
+          on the PB3400 to the end of the list. */
+       for (; p != NULL; p = p->next) {
+               if (p->parent && p->parent->name
+                   && strcasecmp(p->parent->name, "media-bay") == 0) {
+                       *rp = p;
+                       rp = &p->next;
+               } else {
+                       *pp = p;
+                       pp = &p->next;
+               }
+       }
+       *rp = NULL;
+       *pp = removables;
+
+       for (i = 0, np = atas; i < MAX_HWIFS && np != NULL; np = np->next) {
+               if (np->n_addrs == 0) {
+                       printk(KERN_WARNING "ide: no address for device %s\n",
+                              np->full_name);
+                       continue;
+               }
+               base = (unsigned long) ioremap(np->addrs[0].address, 0x200);
+               if (np->n_intrs == 0) {
+                       printk("ide: no intrs for device %s, using 13\n",
+                              np->full_name);
+                       irq = 13;
+               } else {
+                       irq = np->intrs[0].line;
+               }
+               pmac_ide_regbase[i] = base;
+               pmac_ide_irq[i] = irq;
+
+               if (np->parent && np->parent->name
+                   && strcasecmp(np->parent->name, "media-bay") == 0) {
+                       mb_cd_index = i;
+                       mb_cd_base = base;
+                       mb_cd_irq = irq;
+               }
+
+               hwif = &ide_hwifs[i];
+               pmac_ide_init_hwif_ports(hwif->io_ports, base, &hwif->irq);
+               hwif->chipset = ide_generic;
+               hwif->noprobe = !hwif->io_ports[IDE_DATA_OFFSET];
+
+#ifdef CONFIG_BLK_DEV_IDEDMA_PMAC
+               if (np->n_addrs >= 2 && np->n_intrs >= 2) {
+                       /* has a DBDMA controller channel */
+                       pmac_ide_setup_dma(np, hwif);
+               }
+#endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */
+
+               ++i;
+       }
+}
+
+#ifdef CONFIG_BLK_DEV_IDEDMA_PMAC
+
+__initfunc(static void
+pmac_ide_setup_dma(struct device_node *np, ide_hwif_t *hwif))
+{
+       hwif->dma_base = (unsigned long) ioremap(np->addrs[1].address, 0x200);
+
+       /*
+        * Allocate space for the DBDMA commands.
+        * The +2 is +1 for the stop command and +1 to allow for
+        * aligning the start address to a multiple of 16 bytes.
+        */
+       hwif->dmatable = (unsigned long *)
+              kmalloc((MAX_DCMDS + 2) * sizeof(struct dbdma_cmd), GFP_KERNEL);
+       if (hwif->dmatable == 0) {
+               printk(KERN_ERR "%s: unable to allocate DMA command list\n",
+                      hwif->name);
+               return;
+       }
+
+       hwif->dmaproc = &pmac_ide_dmaproc;
+#ifdef CONFIG_PMAC_IDEDMA_AUTO
+       hwif->autodma = 1;
+#endif
+}
+
+/*
+ * pmac_ide_build_dmatable builds the DBDMA command list
+ * for a transfer and sets the DBDMA channel to point to it.
+ */
+static int
+pmac_ide_build_dmatable(ide_drive_t *drive, int wr)
+{
+       ide_hwif_t *hwif = HWIF(drive);
+       struct dbdma_cmd *table, *tstart;
+       int count = 0;
+       struct request *rq = HWGROUP(drive)->rq;
+       struct buffer_head *bh = rq->bh;
+       unsigned int size, addr;
+       volatile struct dbdma_regs *dma
+               = (volatile struct dbdma_regs *) hwif->dma_base;
+
+       table = tstart = (struct dbdma_cmd *) DBDMA_ALIGN(hwif->dmatable);
+       out_le32(&dma->control, (RUN|PAUSE|FLUSH|WAKE|DEAD) << 16);
+
+       do {
+               /*
+                * Determine addr and size of next buffer area.  We assume that
+                * individual virtual buffers are always composed linearly in
+                * physical memory.  For example, we assume that any 8kB buffer
+                * is always composed of two adjacent physical 4kB pages rather
+                * than two possibly non-adjacent physical 4kB pages.
+                */
+               if (bh == NULL) {  /* paging requests have (rq->bh == NULL) */
+                       addr = virt_to_bus(rq->buffer);
+                       size = rq->nr_sectors << 9;
+               } else {
+                       /* group sequential buffers into one large buffer */
+                       addr = virt_to_bus(bh->b_data);
+                       size = bh->b_size;
+                       while ((bh = bh->b_reqnext) != NULL) {
+                               if ((addr + size) != virt_to_bus(bh->b_data))
+                                       break;
+                               size += bh->b_size;
+                       }
+               }
+
+               /*
+                * Fill in the next DBDMA command block.
+                * Note that one DBDMA command can transfer
+                * at most 65535 bytes.
+                */
+               while (size) {
+                       unsigned int tc = (size < 0xfe00)? size: 0xfe00;
+
+                       if (++count >= MAX_DCMDS) {
+                               printk("%s: DMA table too small\n",
+                                      drive->name);
+                               return 0; /* revert to PIO for this request */
+                       }
+                       st_le16(&table->command, wr? OUTPUT_MORE: INPUT_MORE);
+                       st_le16(&table->req_count, tc);
+                       st_le32(&table->phy_addr, addr);
+                       table->cmd_dep = 0;
+                       table->xfer_status = 0;
+                       table->res_count = 0;
+                       addr += tc;
+                       size -= tc;
+                       ++table;
+               }
+       } while (bh != NULL);
+
+       /* convert the last command to an input/output last command */
+       if (count)
+               st_le16(&table[-1].command, wr? OUTPUT_LAST: INPUT_LAST);
+       else
+               printk(KERN_DEBUG "%s: empty DMA table?\n", drive->name);
+
+       /* add the stop command to the end of the list */
+       memset(table, 0, sizeof(struct dbdma_cmd));
+       out_le16(&table->command, DBDMA_STOP);
+
+       out_le32(&dma->cmdptr, virt_to_bus(tstart));
+       return 1;
+}
+
+int pmac_ide_dmaproc(ide_dma_action_t func, ide_drive_t *drive)
+{
+       ide_hwif_t *hwif = HWIF(drive);
+       volatile struct dbdma_regs *dma
+               = (volatile struct dbdma_regs *) hwif->dma_base;
+       int dstat;
+
+       switch (func) {
+       case ide_dma_on:
+               /* ide-floppy DMA doesn't work yet... */
+               drive->using_dma = drive->media != ide_floppy;
+               break;
+       case ide_dma_off:
+               printk(KERN_INFO "%s: DMA disabled\n", drive->name);
+       case ide_dma_off_quietly:
+               drive->using_dma = 0;
+               break;
+       case ide_dma_check:
+               /* ide-floppy DMA doesn't work yet... */
+               drive->using_dma = hwif->autodma && drive->media != ide_floppy;
+               break;
+       case ide_dma_read:
+       case ide_dma_write:
+               if (!pmac_ide_build_dmatable(drive, func==ide_dma_write))
+                       return 1;
+               drive->waiting_for_dma = 1;
+               if (drive->media != ide_disk)
+                       return 0;
+               ide_set_handler(drive, &ide_dma_intr, WAIT_CMD);
+               OUT_BYTE(func==ide_dma_write? WIN_WRITEDMA: WIN_READDMA,
+                        IDE_COMMAND_REG);
+       case ide_dma_begin:
+               out_le32(&dma->control, (RUN << 16) | RUN);
+               break;
+       case ide_dma_end:
+               drive->waiting_for_dma = 0;
+               dstat = in_le32(&dma->status);
+               out_le32(&dma->control, ((RUN|WAKE|DEAD) << 16));
+               /* verify good dma status */
+               return (dstat & (RUN|DEAD|ACTIVE)) != RUN;
+       case ide_dma_test_irq:
+               return (in_le32(&dma->status) & (RUN|ACTIVE)) == RUN;
+       default:
+               printk(KERN_ERR "pmac_ide_dmaproc: bad func %d\n", func);
+       }
+       return 0;
+}
+
+#endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */
index ca7f01352e30a0583b8882e01407d22ecf59e731..02a13126d5cc831cc98d1104b02d1d61361e16ca 100644 (file)
@@ -2637,6 +2637,12 @@ __initfunc(static void probe_for_hwifs (void))
                (void) init_pdc4030();
        }
 #endif /* CONFIG_BLK_DEV_PDC4030 */
+#ifdef CONFIG_BLK_DEV_IDE_PMAC
+       {
+               extern void pmac_ide_probe(void);
+               pmac_ide_probe();
+       }
+#endif /* CONFIG_BLK_DEV_IDE_PMAC */
 }
 
 __initfunc(void ide_init_builtin_drivers (void))
index 94464709615c4139ae70da46d304b39767a853a3..8ed2e34babfe5900a525b6c4ba74c72e92151061 100644 (file)
@@ -81,9 +81,18 @@ static int nbd_xmit(int send, struct socket *sock, char *buf, int size)
        int result;
        struct msghdr msg;
        struct iovec iov;
+       unsigned long flags;
 
        oldfs = get_fs();
        set_fs(get_ds());
+
+       spin_lock_irqsave(&current->sigmask_lock, flags);
+       oldset = current->blocked;
+       sigfillset(&current->blocked);
+       recalc_sigpending(current);
+       spin_unlock_irqrestore(&current->sigmask_lock, flags);
+
+
        do {
                sigset_t oldset;
 
@@ -98,22 +107,11 @@ static int nbd_xmit(int send, struct socket *sock, char *buf, int size)
                msg.msg_namelen = 0;
                msg.msg_flags = 0;
 
-               spin_lock_irq(&current->sigmask_lock);
-               oldset = current->blocked;
-               sigfillset(&current->blocked);
-               recalc_sigpending(current);
-               spin_unlock_irq(&current->sigmask_lock);
-
                if (send)
                        result = sock_sendmsg(sock, &msg, size);
                else
                        result = sock_recvmsg(sock, &msg, size, 0);
 
-               spin_lock_irq(&current->sigmask_lock);
-               current->blocked = oldset;
-               recalc_sigpending(current);
-               spin_unlock_irq(&current->sigmask_lock);
-
                if (result <= 0) {
 #ifdef PARANOIA
                        printk(KERN_ERR "NBD: %s - sock=%ld at buf=%ld, size=%d returned %d.\n",
@@ -124,6 +122,12 @@ static int nbd_xmit(int send, struct socket *sock, char *buf, int size)
                size -= result;
                buf += result;
        } while (size > 0);
+
+       spin_lock_irqsave(&current->sigmask_lock, flags);
+       current->blocked = oldset;
+       recalc_sigpending(current);
+       spin_unlock_irqrestore(&current->sigmask_lock, flags);
+
        set_fs(oldfs);
        return result;
 }
@@ -295,8 +299,6 @@ static void do_nbd_request(void)
                requests_in++;
 #endif
                req->errors = 0;
-
-               nbd_send_req(lo->sock, req);    /* Why does this block?         */
                CURRENT = CURRENT->next;
                req->next = NULL;
                if (lo->head == NULL) {
@@ -306,6 +308,10 @@ static void do_nbd_request(void)
                        lo->head->next = req;
                        lo->head = req;
                }
+
+               spin_unlock_irq(&io_request_lock);
+               nbd_send_req(lo->sock, req);    /* Why does this block?         */
+               spin_lock_irq(&io_request_lock);
                continue;
 
              error_out:
index 3f4953f06a7296f487975b8e7846944c9df3a8a3..331842faba4ce9a318e54611dafa800bbb0f8853 100644 (file)
@@ -1787,6 +1787,7 @@ static struct file_operations isdn_fops =
        isdn_ioctl,             /* isdn_ioctl */
        NULL,                   /* isdn_mmap */
        isdn_open,
+       NULL,                   /* flush */
        isdn_close,
        NULL                    /* fsync */
 };
index 4e7be2e79e75ff8df4a9af0c8de3d8e23726a6db..276930d52e26ba3b8ff5c11fbae8e8dd13472a67 100644 (file)
@@ -518,10 +518,18 @@ scsi_unregister(struct Scsi_Host * sh){
     
     /* If we are removing the last host registered, it is safe to reuse
      * its host number (this avoids "holes" at boot time) (DB) 
+     * It is also safe to reuse those of numbers directly below which have
+     * been released earlier (to avoid some holes in numbering).
      */
-    if (max_scsi_hosts == next_scsi_host)
-       max_scsi_hosts--;
-    
+    if(sh->host_no == max_scsi_hosts - 1) {
+       while(--max_scsi_hosts >= next_scsi_host) {
+           shpnt = scsi_hostlist;
+           while(shpnt && shpnt->host_no != max_scsi_hosts - 1)
+               shpnt = shpnt->next;
+           if(shpnt)
+               break;
+       }
+    }
     next_scsi_host--;
     scsi_init_free((char *) sh, sizeof(struct Scsi_Host) + sh->extra_bytes);
 }
index 572c413d007dc5e7974dc85078acb5a71e0ca126..005c2e78705ec8e096ad29a5409a674189ef9620 100644 (file)
 #include <linux/nfs_fs.h>
 #include <asm/uaccess.h>
 
-/*
- * NOTE! We must NOT default to soft-mounting: that breaks too many
- * programs that depend on POSIX behaviour of uninterruptible reads
- * and writes.
- *
- * Until we have a per-mount soft/hard mount policy that we can honour
- * we must default to hard mounting!
- *
- * And yes, this should be "interruptible", not soft.
- */
-#define IS_SOFT 0
-
 #define NFS_PARANOIA 1
 #define NFSDBG_FACILITY                NFSDBG_PAGECACHE
 
@@ -730,29 +718,21 @@ int
 nfs_flush_dirty_pages(struct inode *inode, pid_t pid, off_t offset, off_t len)
 {
        struct nfs_wreq *last = NULL;
-       int result = 0, cancel = 0;
+       int result = 0;
 
        dprintk("NFS:      flush_dirty_pages(%x/%ld for pid %d %ld/%ld)\n",
                inode->i_dev, inode->i_ino, current->pid, offset, len);
 
-       if (IS_SOFT && signalled()) {
-               nfs_cancel_dirty(inode, pid);
-               cancel = 1;
-       }
-
        for (;;) {
-               if (IS_SOFT && signalled()) {
-                       if (!cancel)
-                               nfs_cancel_dirty(inode, pid);
-                       result = -ERESTARTSYS;
-                       break;
-               }
-
                /* Flush all pending writes for the pid and file region */
                last = nfs_flush_pages(inode, pid, offset, len, 0);
                if (last == NULL)
                        break;
-               wait_on_write_request(last);
+               result = wait_on_write_request(last);
+               if (result) {
+                       nfs_cancel_dirty(inode,pid);
+                       break;
+               }
        }
 
        return result;
index 2334ff72947af75a501eca7232d95e2763680f40..b61bb32779836e55c308eba6efbc4975c0b10745 100644 (file)
@@ -1961,11 +1961,13 @@ smb_proc_getattr(struct dentry *dir, struct smb_fattr *fattr)
        smb_init_dirent(server, fattr);
 
        /*
-        * Win 95 is painfully slow at returning trans2 getattr info,
-        * so we provide the SMB_FIX_OLDATTR option switch.
+        * Select whether to use core or trans2 getattr.
         */
        if (server->opt.protocol >= SMB_PROTOCOL_LANMAN2) {
-               if (server->mnt->version & SMB_FIX_OLDATTR)
+               /*
+                * Win 95 appears to break with the trans2 getattr.
+                */
+               if (server->mnt->version & (SMB_FIX_OLDATTR|SMB_FIX_WIN95))
                        goto core_attr;
                if (server->mnt->version & SMB_FIX_DIRATTR)
                        result = smb_proc_getattr_ff(server, dir, fattr);
index e7aad0504194c4a49f970052c2b9c1cd84fdcac5..52576cf15c7c2039e371a848cc54c4834016585a 100644 (file)
@@ -95,8 +95,6 @@ static __inline__ int ide_default_irq(ide_ioreg_t base)
 static __inline__ ide_ioreg_t ide_default_io_base(int index)
 {
         if (_machine == _MACH_Pmac) {
-               if (!pmac_ide_ports_known)
-                       pmac_ide_probe();
                return pmac_ide_regbase[index];
        }
        if (_machine == _MACH_mbx) return index;
index 2e83cf446987932c4ab9dc68e4d40768a3ff8023..35478fe4d113bac4e3680551f6385ebd1d1e0c91 100644 (file)
@@ -9,7 +9,6 @@
 #ifndef _LINUX_SMB_FS_H
 #define _LINUX_SMB_FS_H
 
-#include <linux/dirent.h>
 #include <linux/smb.h>
 
 /*
index 0a8a10ee226b45c6792dd001088f6a32a6044a12..886d945d5fe0a4bd1b5fbbd3bd1c1bdcc727f061 100644 (file)
 
 struct smb_mount_data {
        int version;
-        uid_t mounted_uid;      /* Who may umount() this filesystem? */
-
-        uid_t uid;
-        gid_t gid;
-        mode_t file_mode;
-        mode_t dir_mode;
+       __kernel_uid_t mounted_uid; /* Who may umount() this filesystem? */
+       __kernel_uid_t uid;
+       __kernel_gid_t gid;
+       __kernel_mode_t file_mode;
+       __kernel_mode_t dir_mode;
 };
 
 #endif