diff options
| -rw-r--r-- | Documentation/kernel-parameters.txt | 6 | ||||
| -rw-r--r-- | drivers/ata/pata_amd.c | 76 | ||||
| -rw-r--r-- | drivers/ata/pata_it821x.c | 3 | ||||
| -rw-r--r-- | drivers/ata/pata_legacy.c | 7 | ||||
| -rw-r--r-- | drivers/ata/sata_mv.c | 20 | ||||
| -rw-r--r-- | drivers/ide/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/ide/amd74xx.c | 2 | ||||
| -rw-r--r-- | drivers/ide/atiixp.c | 4 | ||||
| -rw-r--r-- | drivers/ide/ide-cd.c | 35 | ||||
| -rw-r--r-- | drivers/ide/ide-cd.h | 2 | ||||
| -rw-r--r-- | drivers/ide/ide-gd.c | 26 | ||||
| -rw-r--r-- | drivers/ide/ide-gd.h | 2 | ||||
| -rw-r--r-- | drivers/ide/ide-tape.c | 29 | ||||
| -rw-r--r-- | drivers/ide/ide.c | 11 | ||||
| -rw-r--r-- | drivers/ide/it821x.c | 5 | ||||
| -rw-r--r-- | include/linux/ide.h | 2 | ||||
| -rw-r--r-- | mm/shmem.c | 43 |
17 files changed, 179 insertions, 96 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 319785b6dcb..0ed3234125e 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
| @@ -868,8 +868,10 @@ and is between 256 and 4096 characters. It is defined in the file | |||
| 868 | icn= [HW,ISDN] | 868 | icn= [HW,ISDN] |
| 869 | Format: <io>[,<membase>[,<icn_id>[,<icn_id2>]]] | 869 | Format: <io>[,<membase>[,<icn_id>[,<icn_id2>]]] |
| 870 | 870 | ||
| 871 | ide= [HW] (E)IDE subsystem | 871 | ide-core.nodma= [HW] (E)IDE subsystem |
| 872 | Format: ide=nodma or ide=doubler | 872 | Format: =0.0 to prevent dma on hda, =0.1 hdb =1.0 hdc |
| 873 | .vlb_clock .pci_clock .noflush .noprobe .nowerr .cdrom | ||
| 874 | .chs .ignore_cable are additional options | ||
| 873 | See Documentation/ide/ide.txt. | 875 | See Documentation/ide/ide.txt. |
| 874 | 876 | ||
| 875 | idebus= [HW] (E)IDE subsystem - VLB/PCI bus speed | 877 | idebus= [HW] (E)IDE subsystem - VLB/PCI bus speed |
diff --git a/drivers/ata/pata_amd.c b/drivers/ata/pata_amd.c index 63719ab9ea4..115b1cd6dcf 100644 --- a/drivers/ata/pata_amd.c +++ b/drivers/ata/pata_amd.c | |||
| @@ -24,7 +24,7 @@ | |||
| 24 | #include <linux/libata.h> | 24 | #include <linux/libata.h> |
| 25 | 25 | ||
| 26 | #define DRV_NAME "pata_amd" | 26 | #define DRV_NAME "pata_amd" |
| 27 | #define DRV_VERSION "0.3.11" | 27 | #define DRV_VERSION "0.4.1" |
| 28 | 28 | ||
| 29 | /** | 29 | /** |
| 30 | * timing_setup - shared timing computation and load | 30 | * timing_setup - shared timing computation and load |
| @@ -145,6 +145,13 @@ static int amd_pre_reset(struct ata_link *link, unsigned long deadline) | |||
| 145 | return ata_sff_prereset(link, deadline); | 145 | return ata_sff_prereset(link, deadline); |
| 146 | } | 146 | } |
| 147 | 147 | ||
| 148 | /** | ||
| 149 | * amd_cable_detect - report cable type | ||
| 150 | * @ap: port | ||
| 151 | * | ||
| 152 | * AMD controller/BIOS setups record the cable type in word 0x42 | ||
| 153 | */ | ||
| 154 | |||
| 148 | static int amd_cable_detect(struct ata_port *ap) | 155 | static int amd_cable_detect(struct ata_port *ap) |
| 149 | { | 156 | { |
| 150 | static const u32 bitmask[2] = {0x03, 0x0C}; | 157 | static const u32 bitmask[2] = {0x03, 0x0C}; |
| @@ -158,6 +165,40 @@ static int amd_cable_detect(struct ata_port *ap) | |||
| 158 | } | 165 | } |
| 159 | 166 | ||
| 160 | /** | 167 | /** |
| 168 | * amd_fifo_setup - set the PIO FIFO for ATA/ATAPI | ||
| 169 | * @ap: ATA interface | ||
| 170 | * @adev: ATA device | ||
| 171 | * | ||
| 172 | * Set the PCI fifo for this device according to the devices present | ||
| 173 | * on the bus at this point in time. We need to turn the post write buffer | ||
| 174 | * off for ATAPI devices as we may need to issue a word sized write to the | ||
| 175 | * device as the final I/O | ||
| 176 | */ | ||
| 177 | |||
| 178 | static void amd_fifo_setup(struct ata_port *ap) | ||
| 179 | { | ||
| 180 | struct ata_device *adev; | ||
| 181 | struct pci_dev *pdev = to_pci_dev(ap->host->dev); | ||
| 182 | static const u8 fifobit[2] = { 0xC0, 0x30}; | ||
| 183 | u8 fifo = fifobit[ap->port_no]; | ||
| 184 | u8 r; | ||
| 185 | |||
| 186 | |||
| 187 | ata_for_each_dev(adev, &ap->link, ENABLED) { | ||
| 188 | if (adev->class == ATA_DEV_ATAPI) | ||
| 189 | fifo = 0; | ||
| 190 | } | ||
| 191 | if (pdev->device == PCI_DEVICE_ID_AMD_VIPER_7411) /* FIFO is broken */ | ||
| 192 | fifo = 0; | ||
| 193 | |||
| 194 | /* On the later chips the read prefetch bits become no-op bits */ | ||
| 195 | pci_read_config_byte(pdev, 0x41, &r); | ||
| 196 | r &= ~fifobit[ap->port_no]; | ||
| 197 | r |= fifo; | ||
| 198 | pci_write_config_byte(pdev, 0x41, r); | ||
| 199 | } | ||
| 200 | |||
| 201 | /** | ||
| 161 | * amd33_set_piomode - set initial PIO mode data | 202 | * amd33_set_piomode - set initial PIO mode data |
| 162 | * @ap: ATA interface | 203 | * @ap: ATA interface |
| 163 | * @adev: ATA device | 204 | * @adev: ATA device |
| @@ -167,21 +208,25 @@ static int amd_cable_detect(struct ata_port *ap) | |||
| 167 | 208 | ||
| 168 | static void amd33_set_piomode(struct ata_port *ap, struct ata_device *adev) | 209 | static void amd33_set_piomode(struct ata_port *ap, struct ata_device *adev) |
| 169 | { | 210 | { |
| 211 | amd_fifo_setup(ap); | ||
| 170 | timing_setup(ap, adev, 0x40, adev->pio_mode, 1); | 212 | timing_setup(ap, adev, 0x40, adev->pio_mode, 1); |
| 171 | } | 213 | } |
| 172 | 214 | ||
| 173 | static void amd66_set_piomode(struct ata_port *ap, struct ata_device *adev) | 215 | static void amd66_set_piomode(struct ata_port *ap, struct ata_device *adev) |
| 174 | { | 216 | { |
| 217 | amd_fifo_setup(ap); | ||
| 175 | timing_setup(ap, adev, 0x40, adev->pio_mode, 2); | 218 | timing_setup(ap, adev, 0x40, adev->pio_mode, 2); |
| 176 | } | 219 | } |
| 177 | 220 | ||
| 178 | static void amd100_set_piomode(struct ata_port *ap, struct ata_device *adev) | 221 | static void amd100_set_piomode(struct ata_port *ap, struct ata_device *adev) |
| 179 | { | 222 | { |
| 223 | amd_fifo_setup(ap); | ||
| 180 | timing_setup(ap, adev, 0x40, adev->pio_mode, 3); | 224 | timing_setup(ap, adev, 0x40, adev->pio_mode, 3); |
| 181 | } | 225 | } |
| 182 | 226 | ||
| 183 | static void amd133_set_piomode(struct ata_port *ap, struct ata_device *adev) | 227 | static void amd133_set_piomode(struct ata_port *ap, struct ata_device *adev) |
| 184 | { | 228 | { |
| 229 | amd_fifo_setup(ap); | ||
| 185 | timing_setup(ap, adev, 0x40, adev->pio_mode, 4); | 230 | timing_setup(ap, adev, 0x40, adev->pio_mode, 4); |
| 186 | } | 231 | } |
| 187 | 232 | ||
| @@ -397,6 +442,16 @@ static struct ata_port_operations nv133_port_ops = { | |||
| 397 | .set_dmamode = nv133_set_dmamode, | 442 | .set_dmamode = nv133_set_dmamode, |
| 398 | }; | 443 | }; |
| 399 | 444 | ||
| 445 | static void amd_clear_fifo(struct pci_dev *pdev) | ||
| 446 | { | ||
| 447 | u8 fifo; | ||
| 448 | /* Disable the FIFO, the FIFO logic will re-enable it as | ||
| 449 | appropriate */ | ||
| 450 | pci_read_config_byte(pdev, 0x41, &fifo); | ||
| 451 | fifo &= 0x0F; | ||
| 452 | pci_write_config_byte(pdev, 0x41, fifo); | ||
| 453 | } | ||
| 454 | |||
| 400 | static int amd_init_one(struct pci_dev *pdev, const struct pci_device_id *id) | 455 | static int amd_init_one(struct pci_dev *pdev, const struct pci_device_id *id) |
| 401 | { | 456 | { |
| 402 | static const struct ata_port_info info[10] = { | 457 | static const struct ata_port_info info[10] = { |
| @@ -503,14 +558,8 @@ static int amd_init_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
| 503 | 558 | ||
| 504 | if (type < 3) | 559 | if (type < 3) |
| 505 | ata_pci_bmdma_clear_simplex(pdev); | 560 | ata_pci_bmdma_clear_simplex(pdev); |
| 506 | 561 | if (pdev->vendor == PCI_VENDOR_ID_AMD) | |
| 507 | /* Check for AMD7411 */ | 562 | amd_clear_fifo(pdev); |
| 508 | if (type == 3) | ||
| 509 | /* FIFO is broken */ | ||
| 510 | pci_write_config_byte(pdev, 0x41, fifo & 0x0F); | ||
| 511 | else | ||
| 512 | pci_write_config_byte(pdev, 0x41, fifo | 0xF0); | ||
| 513 | |||
| 514 | /* Cable detection on Nvidia chips doesn't work too well, | 563 | /* Cable detection on Nvidia chips doesn't work too well, |
| 515 | * cache BIOS programmed UDMA mode. | 564 | * cache BIOS programmed UDMA mode. |
| 516 | */ | 565 | */ |
| @@ -536,18 +585,11 @@ static int amd_reinit_one(struct pci_dev *pdev) | |||
| 536 | return rc; | 585 | return rc; |
| 537 | 586 | ||
| 538 | if (pdev->vendor == PCI_VENDOR_ID_AMD) { | 587 | if (pdev->vendor == PCI_VENDOR_ID_AMD) { |
| 539 | u8 fifo; | 588 | amd_clear_fifo(pdev); |
| 540 | pci_read_config_byte(pdev, 0x41, &fifo); | ||
| 541 | if (pdev->device == PCI_DEVICE_ID_AMD_VIPER_7411) | ||
| 542 | /* FIFO is broken */ | ||
| 543 | pci_write_config_byte(pdev, 0x41, fifo & 0x0F); | ||
| 544 | else | ||
| 545 | pci_write_config_byte(pdev, 0x41, fifo | 0xF0); | ||
| 546 | if (pdev->device == PCI_DEVICE_ID_AMD_VIPER_7409 || | 589 | if (pdev->device == PCI_DEVICE_ID_AMD_VIPER_7409 || |
| 547 | pdev->device == PCI_DEVICE_ID_AMD_COBRA_7401) | 590 | pdev->device == PCI_DEVICE_ID_AMD_COBRA_7401) |
| 548 | ata_pci_bmdma_clear_simplex(pdev); | 591 | ata_pci_bmdma_clear_simplex(pdev); |
| 549 | } | 592 | } |
| 550 | |||
| 551 | ata_host_resume(host); | 593 | ata_host_resume(host); |
| 552 | return 0; | 594 | return 0; |
| 553 | } | 595 | } |
diff --git a/drivers/ata/pata_it821x.c b/drivers/ata/pata_it821x.c index f1bb2f9fecb..b05b86a912c 100644 --- a/drivers/ata/pata_it821x.c +++ b/drivers/ata/pata_it821x.c | |||
| @@ -557,6 +557,9 @@ static unsigned int it821x_read_id(struct ata_device *adev, | |||
| 557 | id[83] |= 0x4400; /* Word 83 is valid and LBA48 */ | 557 | id[83] |= 0x4400; /* Word 83 is valid and LBA48 */ |
| 558 | id[86] |= 0x0400; /* LBA48 on */ | 558 | id[86] |= 0x0400; /* LBA48 on */ |
| 559 | id[ATA_ID_MAJOR_VER] |= 0x1F; | 559 | id[ATA_ID_MAJOR_VER] |= 0x1F; |
| 560 | /* Clear the serial number because it's different each boot | ||
| 561 | which breaks validation on resume */ | ||
| 562 | memset(&id[ATA_ID_SERNO], 0x20, ATA_ID_SERNO_LEN); | ||
| 560 | } | 563 | } |
| 561 | return err_mask; | 564 | return err_mask; |
| 562 | } | 565 | } |
diff --git a/drivers/ata/pata_legacy.c b/drivers/ata/pata_legacy.c index 6c1d778b63a..e3bc1b43628 100644 --- a/drivers/ata/pata_legacy.c +++ b/drivers/ata/pata_legacy.c | |||
| @@ -283,9 +283,10 @@ static void pdc20230_set_piomode(struct ata_port *ap, struct ata_device *adev) | |||
| 283 | static unsigned int pdc_data_xfer_vlb(struct ata_device *dev, | 283 | static unsigned int pdc_data_xfer_vlb(struct ata_device *dev, |
| 284 | unsigned char *buf, unsigned int buflen, int rw) | 284 | unsigned char *buf, unsigned int buflen, int rw) |
| 285 | { | 285 | { |
| 286 | if (ata_id_has_dword_io(dev->id)) { | 286 | int slop = buflen & 3; |
| 287 | /* 32bit I/O capable *and* we need to write a whole number of dwords */ | ||
| 288 | if (ata_id_has_dword_io(dev->id) && (slop == 0 || slop == 3)) { | ||
| 287 | struct ata_port *ap = dev->link->ap; | 289 | struct ata_port *ap = dev->link->ap; |
| 288 | int slop = buflen & 3; | ||
| 289 | unsigned long flags; | 290 | unsigned long flags; |
| 290 | 291 | ||
| 291 | local_irq_save(flags); | 292 | local_irq_save(flags); |
| @@ -735,7 +736,7 @@ static unsigned int vlb32_data_xfer(struct ata_device *adev, unsigned char *buf, | |||
| 735 | struct ata_port *ap = adev->link->ap; | 736 | struct ata_port *ap = adev->link->ap; |
| 736 | int slop = buflen & 3; | 737 | int slop = buflen & 3; |
| 737 | 738 | ||
| 738 | if (ata_id_has_dword_io(adev->id)) { | 739 | if (ata_id_has_dword_io(adev->id) && (slop == 0 || slop == 3)) { |
| 739 | if (rw == WRITE) | 740 | if (rw == WRITE) |
| 740 | iowrite32_rep(ap->ioaddr.data_addr, buf, buflen >> 2); | 741 | iowrite32_rep(ap->ioaddr.data_addr, buf, buflen >> 2); |
| 741 | else | 742 | else |
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index 4ae1a4138b4..7007edd2d45 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c | |||
| @@ -3114,19 +3114,17 @@ static int mv_init_host(struct ata_host *host, unsigned int board_idx) | |||
| 3114 | writelfl(0, hc_mmio + HC_IRQ_CAUSE_OFS); | 3114 | writelfl(0, hc_mmio + HC_IRQ_CAUSE_OFS); |
| 3115 | } | 3115 | } |
| 3116 | 3116 | ||
| 3117 | if (!IS_SOC(hpriv)) { | 3117 | /* Clear any currently outstanding host interrupt conditions */ |
| 3118 | /* Clear any currently outstanding host interrupt conditions */ | 3118 | writelfl(0, mmio + hpriv->irq_cause_ofs); |
| 3119 | writelfl(0, mmio + hpriv->irq_cause_ofs); | ||
| 3120 | 3119 | ||
| 3121 | /* and unmask interrupt generation for host regs */ | 3120 | /* and unmask interrupt generation for host regs */ |
| 3122 | writelfl(hpriv->unmask_all_irqs, mmio + hpriv->irq_mask_ofs); | 3121 | writelfl(hpriv->unmask_all_irqs, mmio + hpriv->irq_mask_ofs); |
| 3123 | 3122 | ||
| 3124 | /* | 3123 | /* |
| 3125 | * enable only global host interrupts for now. | 3124 | * enable only global host interrupts for now. |
| 3126 | * The per-port interrupts get done later as ports are set up. | 3125 | * The per-port interrupts get done later as ports are set up. |
| 3127 | */ | 3126 | */ |
| 3128 | mv_set_main_irq_mask(host, 0, PCI_ERR); | 3127 | mv_set_main_irq_mask(host, 0, PCI_ERR); |
| 3129 | } | ||
| 3130 | done: | 3128 | done: |
| 3131 | return rc; | 3129 | return rc; |
| 3132 | } | 3130 | } |
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index 3dad2299d9c..e072903b12f 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
| @@ -46,7 +46,7 @@ menuconfig IDE | |||
| 46 | SMART parameters from disk drives. | 46 | SMART parameters from disk drives. |
| 47 | 47 | ||
| 48 | To compile this driver as a module, choose M here: the | 48 | To compile this driver as a module, choose M here: the |
| 49 | module will be called ide. | 49 | module will be called ide-core.ko. |
| 50 | 50 | ||
| 51 | For further information, please read <file:Documentation/ide/ide.txt>. | 51 | For further information, please read <file:Documentation/ide/ide.txt>. |
| 52 | 52 | ||
diff --git a/drivers/ide/amd74xx.c b/drivers/ide/amd74xx.c index 69660a431cd..77267c85996 100644 --- a/drivers/ide/amd74xx.c +++ b/drivers/ide/amd74xx.c | |||
| @@ -166,7 +166,7 @@ static unsigned int init_chipset_amd74xx(struct pci_dev *dev) | |||
| 166 | * Check for broken FIFO support. | 166 | * Check for broken FIFO support. |
| 167 | */ | 167 | */ |
| 168 | if (dev->vendor == PCI_VENDOR_ID_AMD && | 168 | if (dev->vendor == PCI_VENDOR_ID_AMD && |
| 169 | dev->vendor == PCI_DEVICE_ID_AMD_VIPER_7411) | 169 | dev->device == PCI_DEVICE_ID_AMD_VIPER_7411) |
| 170 | t &= 0x0f; | 170 | t &= 0x0f; |
| 171 | else | 171 | else |
| 172 | t |= 0xf0; | 172 | t |= 0xf0; |
diff --git a/drivers/ide/atiixp.c b/drivers/ide/atiixp.c index b2735d28f5c..ecd1e62ca91 100644 --- a/drivers/ide/atiixp.c +++ b/drivers/ide/atiixp.c | |||
| @@ -52,7 +52,7 @@ static void atiixp_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
| 52 | { | 52 | { |
| 53 | struct pci_dev *dev = to_pci_dev(drive->hwif->dev); | 53 | struct pci_dev *dev = to_pci_dev(drive->hwif->dev); |
| 54 | unsigned long flags; | 54 | unsigned long flags; |
| 55 | int timing_shift = (drive->dn & 2) ? 16 : 0 + (drive->dn & 1) ? 0 : 8; | 55 | int timing_shift = (drive->dn ^ 1) * 8; |
| 56 | u32 pio_timing_data; | 56 | u32 pio_timing_data; |
| 57 | u16 pio_mode_data; | 57 | u16 pio_mode_data; |
| 58 | 58 | ||
| @@ -85,7 +85,7 @@ static void atiixp_set_dma_mode(ide_drive_t *drive, const u8 speed) | |||
| 85 | { | 85 | { |
| 86 | struct pci_dev *dev = to_pci_dev(drive->hwif->dev); | 86 | struct pci_dev *dev = to_pci_dev(drive->hwif->dev); |
| 87 | unsigned long flags; | 87 | unsigned long flags; |
| 88 | int timing_shift = (drive->dn & 2) ? 16 : 0 + (drive->dn & 1) ? 0 : 8; | 88 | int timing_shift = (drive->dn ^ 1) * 8; |
| 89 | u32 tmp32; | 89 | u32 tmp32; |
| 90 | u16 tmp16; | 90 | u16 tmp16; |
| 91 | u16 udma_ctl = 0; | 91 | u16 udma_ctl = 0; |
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 0bfeb0c79d6..ddfbea41d29 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
| @@ -55,7 +55,7 @@ | |||
| 55 | 55 | ||
| 56 | static DEFINE_MUTEX(idecd_ref_mutex); | 56 | static DEFINE_MUTEX(idecd_ref_mutex); |
| 57 | 57 | ||
| 58 | static void ide_cd_release(struct kref *); | 58 | static void ide_cd_release(struct device *); |
| 59 | 59 | ||
| 60 | static struct cdrom_info *ide_cd_get(struct gendisk *disk) | 60 | static struct cdrom_info *ide_cd_get(struct gendisk *disk) |
| 61 | { | 61 | { |
| @@ -67,7 +67,7 @@ static struct cdrom_info *ide_cd_get(struct gendisk *disk) | |||
| 67 | if (ide_device_get(cd->drive)) | 67 | if (ide_device_get(cd->drive)) |
| 68 | cd = NULL; | 68 | cd = NULL; |
| 69 | else | 69 | else |
| 70 | kref_get(&cd->kref); | 70 | get_device(&cd->dev); |
| 71 | 71 | ||
| 72 | } | 72 | } |
| 73 | mutex_unlock(&idecd_ref_mutex); | 73 | mutex_unlock(&idecd_ref_mutex); |
| @@ -79,7 +79,7 @@ static void ide_cd_put(struct cdrom_info *cd) | |||
| 79 | ide_drive_t *drive = cd->drive; | 79 | ide_drive_t *drive = cd->drive; |
| 80 | 80 | ||
| 81 | mutex_lock(&idecd_ref_mutex); | 81 | mutex_lock(&idecd_ref_mutex); |
| 82 | kref_put(&cd->kref, ide_cd_release); | 82 | put_device(&cd->dev); |
| 83 | ide_device_put(drive); | 83 | ide_device_put(drive); |
| 84 | mutex_unlock(&idecd_ref_mutex); | 84 | mutex_unlock(&idecd_ref_mutex); |
| 85 | } | 85 | } |
| @@ -194,6 +194,14 @@ static void cdrom_analyze_sense_data(ide_drive_t *drive, | |||
| 194 | bio_sectors = max(bio_sectors(failed_command->bio), 4U); | 194 | bio_sectors = max(bio_sectors(failed_command->bio), 4U); |
| 195 | sector &= ~(bio_sectors - 1); | 195 | sector &= ~(bio_sectors - 1); |
| 196 | 196 | ||
| 197 | /* | ||
| 198 | * The SCSI specification allows for the value | ||
| 199 | * returned by READ CAPACITY to be up to 75 2K | ||
| 200 | * sectors past the last readable block. | ||
| 201 | * Therefore, if we hit a medium error within the | ||
| 202 | * last 75 2K sectors, we decrease the saved size | ||
| 203 | * value. | ||
| 204 | */ | ||
| 197 | if (sector < get_capacity(info->disk) && | 205 | if (sector < get_capacity(info->disk) && |
| 198 | drive->probed_capacity - sector < 4 * 75) | 206 | drive->probed_capacity - sector < 4 * 75) |
| 199 | set_capacity(info->disk, sector); | 207 | set_capacity(info->disk, sector); |
| @@ -1790,15 +1798,17 @@ static void ide_cd_remove(ide_drive_t *drive) | |||
| 1790 | ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__); | 1798 | ide_debug_log(IDE_DBG_FUNC, "Call %s\n", __func__); |
| 1791 | 1799 | ||
| 1792 | ide_proc_unregister_driver(drive, info->driver); | 1800 | ide_proc_unregister_driver(drive, info->driver); |
| 1793 | 1801 | device_del(&info->dev); | |
| 1794 | del_gendisk(info->disk); | 1802 | del_gendisk(info->disk); |
| 1795 | 1803 | ||
| 1796 | ide_cd_put(info); | 1804 | mutex_lock(&idecd_ref_mutex); |
| 1805 | put_device(&info->dev); | ||
| 1806 | mutex_unlock(&idecd_ref_mutex); | ||
| 1797 | } | 1807 | } |
| 1798 | 1808 | ||
| 1799 | static void ide_cd_release(struct kref *kref) | 1809 | static void ide_cd_release(struct device *dev) |
| 1800 | { | 1810 | { |
| 1801 | struct cdrom_info *info = to_ide_drv(kref, cdrom_info); | 1811 | struct cdrom_info *info = to_ide_drv(dev, cdrom_info); |
| 1802 | struct cdrom_device_info *devinfo = &info->devinfo; | 1812 | struct cdrom_device_info *devinfo = &info->devinfo; |
| 1803 | ide_drive_t *drive = info->drive; | 1813 | ide_drive_t *drive = info->drive; |
| 1804 | struct gendisk *g = info->disk; | 1814 | struct gendisk *g = info->disk; |
| @@ -1997,7 +2007,12 @@ static int ide_cd_probe(ide_drive_t *drive) | |||
| 1997 | 2007 | ||
| 1998 | ide_init_disk(g, drive); | 2008 | ide_init_disk(g, drive); |
| 1999 | 2009 | ||
| 2000 | kref_init(&info->kref); | 2010 | info->dev.parent = &drive->gendev; |
| 2011 | info->dev.release = ide_cd_release; | ||
| 2012 | dev_set_name(&info->dev, dev_name(&drive->gendev)); | ||
| 2013 | |||
| 2014 | if (device_register(&info->dev)) | ||
| 2015 | goto out_free_disk; | ||
| 2001 | 2016 | ||
| 2002 | info->drive = drive; | 2017 | info->drive = drive; |
| 2003 | info->driver = &ide_cdrom_driver; | 2018 | info->driver = &ide_cdrom_driver; |
| @@ -2011,7 +2026,7 @@ static int ide_cd_probe(ide_drive_t *drive) | |||
| 2011 | g->driverfs_dev = &drive->gendev; | 2026 | g->driverfs_dev = &drive->gendev; |
| 2012 | g->flags = GENHD_FL_CD | GENHD_FL_REMOVABLE; | 2027 | g->flags = GENHD_FL_CD | GENHD_FL_REMOVABLE; |
| 2013 | if (ide_cdrom_setup(drive)) { | 2028 | if (ide_cdrom_setup(drive)) { |
| 2014 | ide_cd_release(&info->kref); | 2029 | put_device(&info->dev); |
| 2015 | goto failed; | 2030 | goto failed; |
| 2016 | } | 2031 | } |
| 2017 | 2032 | ||
| @@ -2021,6 +2036,8 @@ static int ide_cd_probe(ide_drive_t *drive) | |||
| 2021 | add_disk(g); | 2036 | add_disk(g); |
| 2022 | return 0; | 2037 | return 0; |
| 2023 | 2038 | ||
| 2039 | out_free_disk: | ||
| 2040 | put_disk(g); | ||
| 2024 | out_free_cd: | 2041 | out_free_cd: |
| 2025 | kfree(info); | 2042 | kfree(info); |
| 2026 | failed: | 2043 | failed: |
diff --git a/drivers/ide/ide-cd.h b/drivers/ide/ide-cd.h index ac40d6cb90a..c878bfcf111 100644 --- a/drivers/ide/ide-cd.h +++ b/drivers/ide/ide-cd.h | |||
| @@ -80,7 +80,7 @@ struct cdrom_info { | |||
| 80 | ide_drive_t *drive; | 80 | ide_drive_t *drive; |
| 81 | struct ide_driver *driver; | 81 | struct ide_driver *driver; |
| 82 | struct gendisk *disk; | 82 | struct gendisk *disk; |
| 83 | struct kref kref; | 83 | struct device dev; |
| 84 | 84 | ||
| 85 | /* Buffer for table of contents. NULL if we haven't allocated | 85 | /* Buffer for table of contents. NULL if we haven't allocated |
| 86 | a TOC buffer for this device yet. */ | 86 | a TOC buffer for this device yet. */ |
diff --git a/drivers/ide/ide-gd.c b/drivers/ide/ide-gd.c index 7857b209c6d..04710941990 100644 --- a/drivers/ide/ide-gd.c +++ b/drivers/ide/ide-gd.c | |||
| @@ -25,7 +25,7 @@ module_param(debug_mask, ulong, 0644); | |||
| 25 | 25 | ||
| 26 | static DEFINE_MUTEX(ide_disk_ref_mutex); | 26 | static DEFINE_MUTEX(ide_disk_ref_mutex); |
| 27 | 27 | ||
| 28 | static void ide_disk_release(struct kref *); | 28 | static void ide_disk_release(struct device *); |
| 29 | 29 | ||
| 30 | static struct ide_disk_obj *ide_disk_get(struct gendisk *disk) | 30 | static struct ide_disk_obj *ide_disk_get(struct gendisk *disk) |
| 31 | { | 31 | { |
| @@ -37,7 +37,7 @@ static struct ide_disk_obj *ide_disk_get(struct gendisk *disk) | |||
| 37 | if (ide_device_get(idkp->drive)) | 37 | if (ide_device_get(idkp->drive)) |
| 38 | idkp = NULL; | 38 | idkp = NULL; |
| 39 | else | 39 | else |
| 40 | kref_get(&idkp->kref); | 40 | get_device(&idkp->dev); |
| 41 | } | 41 | } |
| 42 | mutex_unlock(&ide_disk_ref_mutex); | 42 | mutex_unlock(&ide_disk_ref_mutex); |
| 43 | return idkp; | 43 | return idkp; |
| @@ -48,7 +48,7 @@ static void ide_disk_put(struct ide_disk_obj *idkp) | |||
| 48 | ide_drive_t *drive = idkp->drive; | 48 | ide_drive_t *drive = idkp->drive; |
| 49 | 49 | ||
| 50 | mutex_lock(&ide_disk_ref_mutex); | 50 | mutex_lock(&ide_disk_ref_mutex); |
| 51 | kref_put(&idkp->kref, ide_disk_release); | 51 | put_device(&idkp->dev); |
| 52 | ide_device_put(drive); | 52 | ide_device_put(drive); |
| 53 | mutex_unlock(&ide_disk_ref_mutex); | 53 | mutex_unlock(&ide_disk_ref_mutex); |
| 54 | } | 54 | } |
| @@ -66,17 +66,18 @@ static void ide_gd_remove(ide_drive_t *drive) | |||
| 66 | struct gendisk *g = idkp->disk; | 66 | struct gendisk *g = idkp->disk; |
| 67 | 67 | ||
| 68 | ide_proc_unregister_driver(drive, idkp->driver); | 68 | ide_proc_unregister_driver(drive, idkp->driver); |
| 69 | 69 | device_del(&idkp->dev); | |
| 70 | del_gendisk(g); | 70 | del_gendisk(g); |
| 71 | |||
| 72 | drive->disk_ops->flush(drive); | 71 | drive->disk_ops->flush(drive); |
| 73 | 72 | ||
| 74 | ide_disk_put(idkp); | 73 | mutex_lock(&ide_disk_ref_mutex); |
| 74 | put_device(&idkp->dev); | ||
| 75 | mutex_unlock(&ide_disk_ref_mutex); | ||
| 75 | } | 76 | } |
| 76 | 77 | ||
| 77 | static void ide_disk_release(struct kref *kref) | 78 | static void ide_disk_release(struct device *dev) |
| 78 | { | 79 | { |
| 79 | struct ide_disk_obj *idkp = to_ide_drv(kref, ide_disk_obj); | 80 | struct ide_disk_obj *idkp = to_ide_drv(dev, ide_disk_obj); |
| 80 | ide_drive_t *drive = idkp->drive; | 81 | ide_drive_t *drive = idkp->drive; |
| 81 | struct gendisk *g = idkp->disk; | 82 | struct gendisk *g = idkp->disk; |
| 82 | 83 | ||
| @@ -348,7 +349,12 @@ static int ide_gd_probe(ide_drive_t *drive) | |||
| 348 | 349 | ||
| 349 | ide_init_disk(g, drive); | 350 | ide_init_disk(g, drive); |
| 350 | 351 | ||
| 351 | kref_init(&idkp->kref); | 352 | idkp->dev.parent = &drive->gendev; |
| 353 | idkp->dev.release = ide_disk_release; | ||
| 354 | dev_set_name(&idkp->dev, dev_name(&drive->gendev)); | ||
| 355 | |||
| 356 | if (device_register(&idkp->dev)) | ||
| 357 | goto out_free_disk; | ||
| 352 | 358 | ||
| 353 | idkp->drive = drive; | 359 | idkp->drive = drive; |
| 354 | idkp->driver = &ide_gd_driver; | 360 | idkp->driver = &ide_gd_driver; |
| @@ -373,6 +379,8 @@ static int ide_gd_probe(ide_drive_t *drive) | |||
| 373 | add_disk(g); | 379 | add_disk(g); |
| 374 | return 0; | 380 | return 0; |
| 375 | 381 | ||
| 382 | out_free_disk: | ||
| 383 | put_disk(g); | ||
| 376 | out_free_idkp: | 384 | out_free_idkp: |
| 377 | kfree(idkp); | 385 | kfree(idkp); |
| 378 | failed: | 386 | failed: |
diff --git a/drivers/ide/ide-gd.h b/drivers/ide/ide-gd.h index a86779f0756..b604bdd318a 100644 --- a/drivers/ide/ide-gd.h +++ b/drivers/ide/ide-gd.h | |||
| @@ -17,7 +17,7 @@ struct ide_disk_obj { | |||
| 17 | ide_drive_t *drive; | 17 | ide_drive_t *drive; |
| 18 | struct ide_driver *driver; | 18 | struct ide_driver *driver; |
| 19 | struct gendisk *disk; | 19 | struct gendisk *disk; |
| 20 | struct kref kref; | 20 | struct device dev; |
| 21 | unsigned int openers; /* protected by BKL for now */ | 21 | unsigned int openers; /* protected by BKL for now */ |
| 22 | 22 | ||
| 23 | /* Last failed packet command */ | 23 | /* Last failed packet command */ |
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index d7ecd3c7975..bb450a7608c 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
| @@ -169,7 +169,7 @@ typedef struct ide_tape_obj { | |||
| 169 | ide_drive_t *drive; | 169 | ide_drive_t *drive; |
| 170 | struct ide_driver *driver; | 170 | struct ide_driver *driver; |
| 171 | struct gendisk *disk; | 171 | struct gendisk *disk; |
| 172 | struct kref kref; | 172 | struct device dev; |
| 173 | 173 | ||
| 174 | /* | 174 | /* |
| 175 | * failed_pc points to the last failed packet command, or contains | 175 | * failed_pc points to the last failed packet command, or contains |
| @@ -267,7 +267,7 @@ static DEFINE_MUTEX(idetape_ref_mutex); | |||
| 267 | 267 | ||
| 268 | static struct class *idetape_sysfs_class; | 268 | static struct class *idetape_sysfs_class; |
| 269 | 269 | ||
| 270 | static void ide_tape_release(struct kref *); | 270 | static void ide_tape_release(struct device *); |
| 271 | 271 | ||
| 272 | static struct ide_tape_obj *ide_tape_get(struct gendisk *disk) | 272 | static struct ide_tape_obj *ide_tape_get(struct gendisk *disk) |
| 273 | { | 273 | { |
| @@ -279,7 +279,7 @@ static struct ide_tape_obj *ide_tape_get(struct gendisk *disk) | |||
| 279 | if (ide_device_get(tape->drive)) | 279 | if (ide_device_get(tape->drive)) |
| 280 | tape = NULL; | 280 | tape = NULL; |
| 281 | else | 281 | else |
| 282 | kref_get(&tape->kref); | 282 | get_device(&tape->dev); |
| 283 | } | 283 | } |
| 284 | mutex_unlock(&idetape_ref_mutex); | 284 | mutex_unlock(&idetape_ref_mutex); |
| 285 | return tape; | 285 | return tape; |
| @@ -290,7 +290,7 @@ static void ide_tape_put(struct ide_tape_obj *tape) | |||
| 290 | ide_drive_t *drive = tape->drive; | 290 | ide_drive_t *drive = tape->drive; |
| 291 | 291 | ||
| 292 | mutex_lock(&idetape_ref_mutex); | 292 | mutex_lock(&idetape_ref_mutex); |
| 293 | kref_put(&tape->kref, ide_tape_release); | 293 | put_device(&tape->dev); |
| 294 | ide_device_put(drive); | 294 | ide_device_put(drive); |
| 295 | mutex_unlock(&idetape_ref_mutex); | 295 | mutex_unlock(&idetape_ref_mutex); |
| 296 | } | 296 | } |
| @@ -308,7 +308,7 @@ static struct ide_tape_obj *ide_tape_chrdev_get(unsigned int i) | |||
| 308 | mutex_lock(&idetape_ref_mutex); | 308 | mutex_lock(&idetape_ref_mutex); |
| 309 | tape = idetape_devs[i]; | 309 | tape = idetape_devs[i]; |
| 310 | if (tape) | 310 | if (tape) |
| 311 | kref_get(&tape->kref); | 311 | get_device(&tape->dev); |
| 312 | mutex_unlock(&idetape_ref_mutex); | 312 | mutex_unlock(&idetape_ref_mutex); |
| 313 | return tape; | 313 | return tape; |
| 314 | } | 314 | } |
| @@ -2256,15 +2256,17 @@ static void ide_tape_remove(ide_drive_t *drive) | |||
| 2256 | idetape_tape_t *tape = drive->driver_data; | 2256 | idetape_tape_t *tape = drive->driver_data; |
| 2257 | 2257 | ||
| 2258 | ide_proc_unregister_driver(drive, tape->driver); | 2258 | ide_proc_unregister_driver(drive, tape->driver); |
| 2259 | 2259 | device_del(&tape->dev); | |
| 2260 | ide_unregister_region(tape->disk); | 2260 | ide_unregister_region(tape->disk); |
| 2261 | 2261 | ||
| 2262 | ide_tape_put(tape); | 2262 | mutex_lock(&idetape_ref_mutex); |
| 2263 | put_device(&tape->dev); | ||
| 2264 | mutex_unlock(&idetape_ref_mutex); | ||
| 2263 | } | 2265 | } |
| 2264 | 2266 | ||
| 2265 | static void ide_tape_release(struct kref *kref) | 2267 | static void ide_tape_release(struct device *dev) |
| 2266 | { | 2268 | { |
| 2267 | struct ide_tape_obj *tape = to_ide_drv(kref, ide_tape_obj); | 2269 | struct ide_tape_obj *tape = to_ide_drv(dev, ide_tape_obj); |
| 2268 | ide_drive_t *drive = tape->drive; | 2270 | ide_drive_t *drive = tape->drive; |
| 2269 | struct gendisk *g = tape->disk; | 2271 | struct gendisk *g = tape->disk; |
| 2270 | 2272 | ||
| @@ -2407,7 +2409,12 @@ static int ide_tape_probe(ide_drive_t *drive) | |||
| 2407 | 2409 | ||
| 2408 | ide_init_disk(g, drive); | 2410 | ide_init_disk(g, drive); |
| 2409 | 2411 | ||
| 2410 | kref_init(&tape->kref); | 2412 | tape->dev.parent = &drive->gendev; |
| 2413 | tape->dev.release = ide_tape_release; | ||
| 2414 | dev_set_name(&tape->dev, dev_name(&drive->gendev)); | ||
| 2415 | |||
| 2416 | if (device_register(&tape->dev)) | ||
| 2417 | goto out_free_disk; | ||
| 2411 | 2418 | ||
| 2412 | tape->drive = drive; | 2419 | tape->drive = drive; |
| 2413 | tape->driver = &idetape_driver; | 2420 | tape->driver = &idetape_driver; |
| @@ -2436,6 +2443,8 @@ static int ide_tape_probe(ide_drive_t *drive) | |||
| 2436 | 2443 | ||
| 2437 | return 0; | 2444 | return 0; |
| 2438 | 2445 | ||
| 2446 | out_free_disk: | ||
| 2447 | put_disk(g); | ||
| 2439 | out_free_tape: | 2448 | out_free_tape: |
| 2440 | kfree(tape); | 2449 | kfree(tape); |
| 2441 | failed: | 2450 | failed: |
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 258805da15c..0920e3b0c96 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c | |||
| @@ -337,6 +337,7 @@ static int ide_set_dev_param_mask(const char *s, struct kernel_param *kp) | |||
| 337 | int a, b, i, j = 1; | 337 | int a, b, i, j = 1; |
| 338 | unsigned int *dev_param_mask = (unsigned int *)kp->arg; | 338 | unsigned int *dev_param_mask = (unsigned int *)kp->arg; |
| 339 | 339 | ||
| 340 | /* controller . device (0 or 1) [ : 1 (set) | 0 (clear) ] */ | ||
| 340 | if (sscanf(s, "%d.%d:%d", &a, &b, &j) != 3 && | 341 | if (sscanf(s, "%d.%d:%d", &a, &b, &j) != 3 && |
| 341 | sscanf(s, "%d.%d", &a, &b) != 2) | 342 | sscanf(s, "%d.%d", &a, &b) != 2) |
| 342 | return -EINVAL; | 343 | return -EINVAL; |
| @@ -349,7 +350,7 @@ static int ide_set_dev_param_mask(const char *s, struct kernel_param *kp) | |||
| 349 | if (j) | 350 | if (j) |
| 350 | *dev_param_mask |= (1 << i); | 351 | *dev_param_mask |= (1 << i); |
| 351 | else | 352 | else |
| 352 | *dev_param_mask &= (1 << i); | 353 | *dev_param_mask &= ~(1 << i); |
| 353 | 354 | ||
| 354 | return 0; | 355 | return 0; |
| 355 | } | 356 | } |
| @@ -392,6 +393,8 @@ static int ide_set_disk_chs(const char *str, struct kernel_param *kp) | |||
| 392 | { | 393 | { |
| 393 | int a, b, c = 0, h = 0, s = 0, i, j = 1; | 394 | int a, b, c = 0, h = 0, s = 0, i, j = 1; |
| 394 | 395 | ||
| 396 | /* controller . device (0 or 1) : Cylinders , Heads , Sectors */ | ||
| 397 | /* controller . device (0 or 1) : 1 (use CHS) | 0 (ignore CHS) */ | ||
| 395 | if (sscanf(str, "%d.%d:%d,%d,%d", &a, &b, &c, &h, &s) != 5 && | 398 | if (sscanf(str, "%d.%d:%d,%d,%d", &a, &b, &c, &h, &s) != 5 && |
| 396 | sscanf(str, "%d.%d:%d", &a, &b, &j) != 3) | 399 | sscanf(str, "%d.%d:%d", &a, &b, &j) != 3) |
| 397 | return -EINVAL; | 400 | return -EINVAL; |
| @@ -407,7 +410,7 @@ static int ide_set_disk_chs(const char *str, struct kernel_param *kp) | |||
| 407 | if (j) | 410 | if (j) |
| 408 | ide_disks |= (1 << i); | 411 | ide_disks |= (1 << i); |
| 409 | else | 412 | else |
| 410 | ide_disks &= (1 << i); | 413 | ide_disks &= ~(1 << i); |
| 411 | 414 | ||
| 412 | ide_disks_chs[i].cyl = c; | 415 | ide_disks_chs[i].cyl = c; |
| 413 | ide_disks_chs[i].head = h; | 416 | ide_disks_chs[i].head = h; |
| @@ -469,6 +472,8 @@ static int ide_set_ignore_cable(const char *s, struct kernel_param *kp) | |||
| 469 | { | 472 | { |
| 470 | int i, j = 1; | 473 | int i, j = 1; |
| 471 | 474 | ||
| 475 | /* controller (ignore) */ | ||
| 476 | /* controller : 1 (ignore) | 0 (use) */ | ||
| 472 | if (sscanf(s, "%d:%d", &i, &j) != 2 && sscanf(s, "%d", &i) != 1) | 477 | if (sscanf(s, "%d:%d", &i, &j) != 2 && sscanf(s, "%d", &i) != 1) |
| 473 | return -EINVAL; | 478 | return -EINVAL; |
| 474 | 479 | ||
| @@ -478,7 +483,7 @@ static int ide_set_ignore_cable(const char *s, struct kernel_param *kp) | |||
| 478 | if (j) | 483 | if (j) |
| 479 | ide_ignore_cable |= (1 << i); | 484 | ide_ignore_cable |= (1 << i); |
| 480 | else | 485 | else |
| 481 | ide_ignore_cable &= (1 << i); | 486 | ide_ignore_cable &= ~(1 << i); |
| 482 | 487 | ||
| 483 | return 0; | 488 | return 0; |
| 484 | } | 489 | } |
diff --git a/drivers/ide/it821x.c b/drivers/ide/it821x.c index e1c4f543739..13b8153112e 100644 --- a/drivers/ide/it821x.c +++ b/drivers/ide/it821x.c | |||
| @@ -5,9 +5,8 @@ | |||
| 5 | * May be copied or modified under the terms of the GNU General Public License | 5 | * May be copied or modified under the terms of the GNU General Public License |
| 6 | * Based in part on the ITE vendor provided SCSI driver. | 6 | * Based in part on the ITE vendor provided SCSI driver. |
| 7 | * | 7 | * |
| 8 | * Documentation available from | 8 | * Documentation: |
| 9 | * http://www.ite.com.tw/pc/IT8212F_V04.pdf | 9 | * Datasheet is freely available, some other documents under NDA. |
| 10 | * Some other documents are NDA. | ||
| 11 | * | 10 | * |
| 12 | * The ITE8212 isn't exactly a standard IDE controller. It has two | 11 | * The ITE8212 isn't exactly a standard IDE controller. It has two |
| 13 | * modes. In pass through mode then it is an IDE controller. In its smart | 12 | * modes. In pass through mode then it is an IDE controller. In its smart |
diff --git a/include/linux/ide.h b/include/linux/ide.h index 194da5a4b0d..fe235b65207 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
| @@ -663,7 +663,7 @@ typedef struct ide_drive_s ide_drive_t; | |||
| 663 | #define to_ide_device(dev) container_of(dev, ide_drive_t, gendev) | 663 | #define to_ide_device(dev) container_of(dev, ide_drive_t, gendev) |
| 664 | 664 | ||
| 665 | #define to_ide_drv(obj, cont_type) \ | 665 | #define to_ide_drv(obj, cont_type) \ |
| 666 | container_of(obj, struct cont_type, kref) | 666 | container_of(obj, struct cont_type, dev) |
| 667 | 667 | ||
| 668 | #define ide_drv_g(disk, cont_type) \ | 668 | #define ide_drv_g(disk, cont_type) \ |
| 669 | container_of((disk)->private_data, struct cont_type, driver) | 669 | container_of((disk)->private_data, struct cont_type, driver) |
diff --git a/mm/shmem.c b/mm/shmem.c index 19d566ccdee..4103a239ce8 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
| @@ -169,13 +169,13 @@ static inline struct shmem_sb_info *SHMEM_SB(struct super_block *sb) | |||
| 169 | */ | 169 | */ |
| 170 | static inline int shmem_acct_size(unsigned long flags, loff_t size) | 170 | static inline int shmem_acct_size(unsigned long flags, loff_t size) |
| 171 | { | 171 | { |
| 172 | return (flags & VM_ACCOUNT) ? | 172 | return (flags & VM_NORESERVE) ? |
| 173 | security_vm_enough_memory_kern(VM_ACCT(size)) : 0; | 173 | 0 : security_vm_enough_memory_kern(VM_ACCT(size)); |
| 174 | } | 174 | } |
| 175 | 175 | ||
| 176 | static inline void shmem_unacct_size(unsigned long flags, loff_t size) | 176 | static inline void shmem_unacct_size(unsigned long flags, loff_t size) |
| 177 | { | 177 | { |
| 178 | if (flags & VM_ACCOUNT) | 178 | if (!(flags & VM_NORESERVE)) |
| 179 | vm_unacct_memory(VM_ACCT(size)); | 179 | vm_unacct_memory(VM_ACCT(size)); |
| 180 | } | 180 | } |
| 181 | 181 | ||
| @@ -187,13 +187,13 @@ static inline void shmem_unacct_size(unsigned long flags, loff_t size) | |||
| 187 | */ | 187 | */ |
| 188 | static inline int shmem_acct_block(unsigned long flags) | 188 | static inline int shmem_acct_block(unsigned long flags) |
| 189 | { | 189 | { |
| 190 | return (flags & VM_ACCOUNT) ? | 190 | return (flags & VM_NORESERVE) ? |
| 191 | 0 : security_vm_enough_memory_kern(VM_ACCT(PAGE_CACHE_SIZE)); | 191 | security_vm_enough_memory_kern(VM_ACCT(PAGE_CACHE_SIZE)) : 0; |
| 192 | } | 192 | } |
| 193 | 193 | ||
| 194 | static inline void shmem_unacct_blocks(unsigned long flags, long pages) | 194 | static inline void shmem_unacct_blocks(unsigned long flags, long pages) |
| 195 | { | 195 | { |
| 196 | if (!(flags & VM_ACCOUNT)) | 196 | if (flags & VM_NORESERVE) |
| 197 | vm_unacct_memory(pages * VM_ACCT(PAGE_CACHE_SIZE)); | 197 | vm_unacct_memory(pages * VM_ACCT(PAGE_CACHE_SIZE)); |
| 198 | } | 198 | } |
| 199 | 199 | ||
| @@ -1515,8 +1515,8 @@ static int shmem_mmap(struct file *file, struct vm_area_struct *vma) | |||
| 1515 | return 0; | 1515 | return 0; |
| 1516 | } | 1516 | } |
| 1517 | 1517 | ||
| 1518 | static struct inode * | 1518 | static struct inode *shmem_get_inode(struct super_block *sb, int mode, |
| 1519 | shmem_get_inode(struct super_block *sb, int mode, dev_t dev) | 1519 | dev_t dev, unsigned long flags) |
| 1520 | { | 1520 | { |
| 1521 | struct inode *inode; | 1521 | struct inode *inode; |
| 1522 | struct shmem_inode_info *info; | 1522 | struct shmem_inode_info *info; |
| @@ -1537,6 +1537,7 @@ shmem_get_inode(struct super_block *sb, int mode, dev_t dev) | |||
| 1537 | info = SHMEM_I(inode); | 1537 | info = SHMEM_I(inode); |
| 1538 | memset(info, 0, (char *)inode - (char *)info); | 1538 | memset(info, 0, (char *)inode - (char *)info); |
| 1539 | spin_lock_init(&info->lock); | 1539 | spin_lock_init(&info->lock); |
| 1540 | info->flags = flags & VM_NORESERVE; | ||
| 1540 | INIT_LIST_HEAD(&info->swaplist); | 1541 | INIT_LIST_HEAD(&info->swaplist); |
| 1541 | 1542 | ||
| 1542 | switch (mode & S_IFMT) { | 1543 | switch (mode & S_IFMT) { |
| @@ -1779,9 +1780,10 @@ static int shmem_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
| 1779 | static int | 1780 | static int |
| 1780 | shmem_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev) | 1781 | shmem_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev) |
| 1781 | { | 1782 | { |
| 1782 | struct inode *inode = shmem_get_inode(dir->i_sb, mode, dev); | 1783 | struct inode *inode; |
| 1783 | int error = -ENOSPC; | 1784 | int error = -ENOSPC; |
| 1784 | 1785 | ||
| 1786 | inode = shmem_get_inode(dir->i_sb, mode, dev, VM_NORESERVE); | ||
| 1785 | if (inode) { | 1787 | if (inode) { |
| 1786 | error = security_inode_init_security(inode, dir, NULL, NULL, | 1788 | error = security_inode_init_security(inode, dir, NULL, NULL, |
| 1787 | NULL); | 1789 | NULL); |
| @@ -1920,7 +1922,7 @@ static int shmem_symlink(struct inode *dir, struct dentry *dentry, const char *s | |||
| 1920 | if (len > PAGE_CACHE_SIZE) | 1922 | if (len > PAGE_CACHE_SIZE) |
| 1921 | return -ENAMETOOLONG; | 1923 | return -ENAMETOOLONG; |
| 1922 | 1924 | ||
| 1923 | inode = shmem_get_inode(dir->i_sb, S_IFLNK|S_IRWXUGO, 0); | 1925 | inode = shmem_get_inode(dir->i_sb, S_IFLNK|S_IRWXUGO, 0, VM_NORESERVE); |
| 1924 | if (!inode) | 1926 | if (!inode) |
| 1925 | return -ENOSPC; | 1927 | return -ENOSPC; |
| 1926 | 1928 | ||
| @@ -2332,7 +2334,7 @@ static int shmem_fill_super(struct super_block *sb, | |||
| 2332 | sb->s_flags |= MS_POSIXACL; | 2334 | sb->s_flags |= MS_POSIXACL; |
| 2333 | #endif | 2335 | #endif |
| 2334 | 2336 | ||
| 2335 | inode = shmem_get_inode(sb, S_IFDIR | sbinfo->mode, 0); | 2337 | inode = shmem_get_inode(sb, S_IFDIR | sbinfo->mode, 0, VM_NORESERVE); |
| 2336 | if (!inode) | 2338 | if (!inode) |
| 2337 | goto failed; | 2339 | goto failed; |
| 2338 | inode->i_uid = sbinfo->uid; | 2340 | inode->i_uid = sbinfo->uid; |
| @@ -2574,12 +2576,12 @@ int shmem_unuse(swp_entry_t entry, struct page *page) | |||
| 2574 | return 0; | 2576 | return 0; |
| 2575 | } | 2577 | } |
| 2576 | 2578 | ||
| 2577 | #define shmem_file_operations ramfs_file_operations | 2579 | #define shmem_vm_ops generic_file_vm_ops |
| 2578 | #define shmem_vm_ops generic_file_vm_ops | 2580 | #define shmem_file_operations ramfs_file_operations |
| 2579 | #define shmem_get_inode ramfs_get_inode | 2581 | #define shmem_get_inode(sb, mode, dev, flags) ramfs_get_inode(sb, mode, dev) |
| 2580 | #define shmem_acct_size(a, b) 0 | 2582 | #define shmem_acct_size(flags, size) 0 |
| 2581 | #define shmem_unacct_size(a, b) do {} while (0) | 2583 | #define shmem_unacct_size(flags, size) do {} while (0) |
| 2582 | #define SHMEM_MAX_BYTES LLONG_MAX | 2584 | #define SHMEM_MAX_BYTES LLONG_MAX |
| 2583 | 2585 | ||
| 2584 | #endif /* CONFIG_SHMEM */ | 2586 | #endif /* CONFIG_SHMEM */ |
| 2585 | 2587 | ||
| @@ -2589,7 +2591,7 @@ int shmem_unuse(swp_entry_t entry, struct page *page) | |||
| 2589 | * shmem_file_setup - get an unlinked file living in tmpfs | 2591 | * shmem_file_setup - get an unlinked file living in tmpfs |
| 2590 | * @name: name for dentry (to be seen in /proc/<pid>/maps | 2592 | * @name: name for dentry (to be seen in /proc/<pid>/maps |
| 2591 | * @size: size to be set for the file | 2593 | * @size: size to be set for the file |
| 2592 | * @flags: vm_flags | 2594 | * @flags: VM_NORESERVE suppresses pre-accounting of the entire object size |
| 2593 | */ | 2595 | */ |
| 2594 | struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags) | 2596 | struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags) |
| 2595 | { | 2597 | { |
| @@ -2623,13 +2625,10 @@ struct file *shmem_file_setup(char *name, loff_t size, unsigned long flags) | |||
| 2623 | goto put_dentry; | 2625 | goto put_dentry; |
| 2624 | 2626 | ||
| 2625 | error = -ENOSPC; | 2627 | error = -ENOSPC; |
| 2626 | inode = shmem_get_inode(root->d_sb, S_IFREG | S_IRWXUGO, 0); | 2628 | inode = shmem_get_inode(root->d_sb, S_IFREG | S_IRWXUGO, 0, flags); |
| 2627 | if (!inode) | 2629 | if (!inode) |
| 2628 | goto close_file; | 2630 | goto close_file; |
| 2629 | 2631 | ||
| 2630 | #ifdef CONFIG_SHMEM | ||
| 2631 | SHMEM_I(inode)->flags = (flags & VM_NORESERVE) ? 0 : VM_ACCOUNT; | ||
| 2632 | #endif | ||
| 2633 | d_instantiate(dentry, inode); | 2632 | d_instantiate(dentry, inode); |
| 2634 | inode->i_size = size; | 2633 | inode->i_size = size; |
| 2635 | inode->i_nlink = 0; /* It is unlinked */ | 2634 | inode->i_nlink = 0; /* It is unlinked */ |
