From 7d1d613138d6c91cc3f455d6bd38f5861ddea535 Mon Sep 17 00:00:00 2001 From: Ivan Kokshaysky Date: Fri, 6 Sep 2002 21:17:41 -0700 Subject: [PATCH] alpha: compile fixes - add another argument to do_fork(); - assorted compile fixes. --- include/asm-alpha/ide.h | 11 +++++++++++ include/asm-alpha/kmap_types.h | 31 +++++++++++++++++++++++++++++++ include/asm-alpha/user.h | 1 + 3 files changed, 43 insertions(+) create mode 100644 include/asm-alpha/kmap_types.h (limited to 'include') diff --git a/include/asm-alpha/ide.h b/include/asm-alpha/ide.h index 63bb9f785498..0ca863142cf5 100644 --- a/include/asm-alpha/ide.h +++ b/include/asm-alpha/ide.h @@ -80,6 +80,17 @@ static __inline__ void ide_init_default_hwifs(void) #endif } +#define ide_request_irq(irq,hand,flg,dev,id) request_irq((irq),(hand),(flg),(dev),(id)) +#define ide_free_irq(irq,dev_id) free_irq((irq), (dev_id)) +#define ide_check_region(from,extent) check_region((from), (extent)) +#define ide_request_region(from,extent,name) request_region((from), (extent), (name)) +#define ide_release_region(from,extent) release_region((from), (extent)) + +#define ide_ack_intr(hwif) (1) +#define ide_fix_driveid(id) do {} while (0) +#define ide_release_lock(lock) do {} while (0) +#define ide_get_lock(lock, hdlr, data) do {} while (0) + #endif /* __KERNEL__ */ #endif /* __ASMalpha_IDE_H */ diff --git a/include/asm-alpha/kmap_types.h b/include/asm-alpha/kmap_types.h new file mode 100644 index 000000000000..3e755b973e65 --- /dev/null +++ b/include/asm-alpha/kmap_types.h @@ -0,0 +1,31 @@ +#ifndef _ASM_KMAP_TYPES_H +#define _ASM_KMAP_TYPES_H + +/* Dummy header just to define km_type. */ + +#include + +#if CONFIG_DEBUG_HIGHMEM +# define D(n) __KM_FENCE_##n , +#else +# define D(n) +#endif + +enum km_type { +D(0) KM_BOUNCE_READ, +D(1) KM_SKB_SUNRPC_DATA, +D(2) KM_SKB_DATA_SOFTIRQ, +D(3) KM_USER0, +D(4) KM_USER1, +D(5) KM_BIO_SRC_IRQ, +D(6) KM_BIO_DST_IRQ, +D(7) KM_PTE0, +D(8) KM_PTE1, +D(9) KM_IRQ0, +D(10) KM_IRQ1, +D(11) KM_TYPE_NR +}; + +#undef D + +#endif diff --git a/include/asm-alpha/user.h b/include/asm-alpha/user.h index c5519bf162d7..7e417fc9d491 100644 --- a/include/asm-alpha/user.h +++ b/include/asm-alpha/user.h @@ -1,6 +1,7 @@ #ifndef _ALPHA_USER_H #define _ALPHA_USER_H +#include #include #include -- cgit v1.2.3 From b340c708d02453fe1e19c79e89b870f8ebeb035a Mon Sep 17 00:00:00 2001 From: Ivan Kokshaysky Date: Fri, 6 Sep 2002 21:17:45 -0700 Subject: [PATCH] alpha: misc fixes Patch set from Jay Estabrook: - include/asm-alpha/dma.h: Add MAX_DMA_ADDR for SABLE and ALCOR - include/asm-alpha/floppy.h: enable the full CROSS_64KB macro for all platforms - include/asm-alpha/core_t2.h: fix HAE usage - arch/alpha/kernel/pci.c: fiddle with quirk_cypress - arch/alpha/kernel/traps.c: prevent opDEC_check() from multiple calls (EV4 SMP SABLEs) - arch/alpha/kernel/proto.h: make t2_pci_tbi() real - arch/alpha/kernel/time.c: shorten timeout delay - arch/alpha/kernel/sys_alcor.c: use ALCOR_MAX_DMA_ADDR because of the 1GB limit on ISA devices - arch/alpha/kernel/core_t2.c: add S/G support and allow direct-map to handle 2GB of memory - arch/alpha/kernel/core_tsunami.c: rework alignment requirements for ISA DMA, esp. for ACER platforms - arch/alpha/kernel/sys_sable.c: fix MAX_DMA_ADDR for the 1GB limitation - arch/alpha/kernel/pci_impl.h: add T2_DEFAULT_MEM_BASE to help avoid HAE use - arch/alpha/kernel/pci_iommu.c: fix ISA_DMA_MASK calculation, and force ISA alignment to 64KB --- arch/alpha/kernel/core_t2.c | 126 +++++++++++++++++++++++++++------------ arch/alpha/kernel/core_tsunami.c | 7 +++ arch/alpha/kernel/pci.c | 19 ++++-- arch/alpha/kernel/pci_impl.h | 13 ++-- arch/alpha/kernel/pci_iommu.c | 20 ++++--- arch/alpha/kernel/proto.h | 2 +- arch/alpha/kernel/sys_alcor.c | 2 +- arch/alpha/kernel/sys_sable.c | 8 +-- arch/alpha/kernel/time.c | 8 +-- arch/alpha/kernel/traps.c | 4 ++ include/asm-alpha/core_t2.h | 40 +++++-------- include/asm-alpha/dma.h | 47 ++++++++++----- include/asm-alpha/floppy.h | 23 ++++--- 13 files changed, 197 insertions(+), 122 deletions(-) (limited to 'include') diff --git a/arch/alpha/kernel/core_t2.c b/arch/alpha/kernel/core_t2.c index 7ce84d5c275f..801b5b2c2037 100644 --- a/arch/alpha/kernel/core_t2.c +++ b/arch/alpha/kernel/core_t2.c @@ -26,6 +26,18 @@ #include "proto.h" #include "pci_impl.h" +/* + * By default, we direct-map starting at 2GB, in order to allow the + * maximum size direct-map window (2GB) to match the maximum amount of + * memory (2GB) that can be present on SABLEs. But that limits the + * floppy to DMA only via the scatter/gather window set up for 8MB + * ISA DMA, since the maximum ISA DMA address is 2GB-1. + * + * For now, this seems a reasonable trade-off: even though most SABLEs + * have far less than even 1GB of memory, floppy usage/performance will + * not really be affected by forcing it to go via scatter/gather... + */ +#define T2_DIRECTMAP_2G 1 /* * NOTE: Herein lie back-to-back mb instructions. They are magic. @@ -282,6 +294,7 @@ void __init t2_init_arch(void) { struct pci_controller *hose; + unsigned long t2_iocsr; unsigned int i; for (i = 0; i < NR_CPUS; i++) { @@ -290,43 +303,80 @@ t2_init_arch(void) } #if 0 - { - /* Set up error reporting. */ - unsigned long t2_err; + /* Set up error reporting. */ + t2_iocsr = *(vulp)T2_IOCSR; + *(vulp)T2_IOCSR = t2_iocsr | (0x1UL << 7); /* TLB error check */ + mb(); + *(vulp)T2_IOCSR; /* read it back to make sure */ +#endif - t2_err = *(vulp)T2_IOCSR; - t2_err |= (0x1 << 7); /* master abort */ - *(vulp)T2_IOCSR = t2_err; - mb(); + /* Enable scatter/gather TLB use. */ + t2_iocsr = *(vulp)T2_IOCSR; + if (!(t2_iocsr & (0x1UL << 26))) { + printk("t2_init_arch: enabling SG TLB, IOCSR was 0x%lx\n", + t2_iocsr); + *(vulp)T2_IOCSR = t2_iocsr | (0x1UL << 26); + mb(); + *(vulp)T2_IOCSR; /* read it back to make sure */ } -#endif - printk("t2_init: HBASE was 0x%lx\n", *(vulp)T2_HBASE); #if 0 - printk("t2_init: WBASE1=0x%lx WMASK1=0x%lx TBASE1=0x%lx\n", - *(vulp)T2_WBASE1, - *(vulp)T2_WMASK1, - *(vulp)T2_TBASE1); - printk("t2_init: WBASE2=0x%lx WMASK2=0x%lx TBASE2=0x%lx\n", - *(vulp)T2_WBASE2, - *(vulp)T2_WMASK2, - *(vulp)T2_TBASE2); + printk("t2_init_arch: HBASE was 0x%lx\n", *(vulp)T2_HBASE); + printk("t2_init_arch: WBASE1=0x%lx WMASK1=0x%lx TBASE1=0x%lx\n", + *(vulp)T2_WBASE1, *(vulp)T2_WMASK1, *(vulp)T2_TBASE1); + printk("t2_init_arch: WBASE2=0x%lx WMASK2=0x%lx TBASE2=0x%lx\n", + *(vulp)T2_WBASE2, *(vulp)T2_WMASK2, *(vulp)T2_TBASE2); #endif + /* + * Create our single hose. + */ + + pci_isa_hose = hose = alloc_pci_controller(); + hose->io_space = &ioport_resource; + hose->mem_space = &iomem_resource; + hose->index = 0; + + hose->sparse_mem_base = T2_SPARSE_MEM - IDENT_ADDR; + hose->dense_mem_base = T2_DENSE_MEM - IDENT_ADDR; + hose->sparse_io_base = T2_IO - IDENT_ADDR; + hose->dense_io_base = 0; + + /* Note we can only do 1 SG window, as the other is for direct, so + do an ISA SG area, especially for the floppy. */ + hose->sg_isa = iommu_arena_new(hose, 0x00800000, 0x00800000, 0); + hose->sg_pci = NULL; + /* * Set up the PCI->physical memory translation windows. - * For now, window 2 is disabled. In the future, we may - * want to use it to do scatter/gather DMA. * - * Window 1 goes at 1 GB and is 1 GB large. + * Window 1 goes at ? GB and is ?GB large, direct mapped. + * Window 2 goes at 8 MB and is 8MB large, scatter/gather (for ISA). */ - /* WARNING!! must correspond to the DMA_WIN params!!! */ +#if T2_DIRECTMAP_2G + __direct_map_base = 0x80000000UL; + __direct_map_size = 0x80000000UL; + + /* WARNING!! must correspond to the direct map window params!!! */ + *(vulp)T2_WBASE1 = 0x80080fffU; + *(vulp)T2_WMASK1 = 0x7ff00000U; + *(vulp)T2_TBASE1 = 0; +#else /* T2_DIRECTMAP_2G */ + __direct_map_base = 0x40000000UL; + __direct_map_size = 0x40000000UL; + + /* WARNING!! must correspond to the direct map window params!!! */ *(vulp)T2_WBASE1 = 0x400807ffU; *(vulp)T2_WMASK1 = 0x3ff00000U; *(vulp)T2_TBASE1 = 0; +#endif /* T2_DIRECTMAP_2G */ + + /* WARNING!! must correspond to the SG arena/window params!!! */ + *(vulp)T2_WBASE2 = 0x008c000fU; + *(vulp)T2_WMASK2 = 0x00700000U; + *(vulp)T2_TBASE2 = virt_to_phys(hose->sg_isa->ptes) >> 1; - *(vulp)T2_WBASE2 = 0x0; *(vulp)T2_HBASE = 0x0; /* Zero HAE. */ @@ -334,26 +384,28 @@ t2_init_arch(void) *(vulp)T2_HAE_2 = 0; mb(); *(vulp)T2_HAE_3 = 0; mb(); #if 0 - *(vulp)T2_HAE_4 = 0; mb(); /* do not touch this */ + *(vulp)T2_HAE_4 = 0; mb(); /* DO NOT TOUCH THIS!!! */ #endif - /* - * Create our single hose. - */ + t2_pci_tbi(hose, 0, -1); /* flush TLB all */ +} - pci_isa_hose = hose = alloc_pci_controller(); - hose->io_space = &ioport_resource; - hose->mem_space = &iomem_resource; - hose->index = 0; +void +t2_pci_tbi(struct pci_controller *hose, dma_addr_t start, dma_addr_t end) +{ + unsigned long t2_iocsr; - hose->sparse_mem_base = T2_SPARSE_MEM - IDENT_ADDR; - hose->dense_mem_base = T2_DENSE_MEM - IDENT_ADDR; - hose->sparse_io_base = T2_IO - IDENT_ADDR; - hose->dense_io_base = 0; + t2_iocsr = *(vulp)T2_IOCSR; - hose->sg_isa = hose->sg_pci = NULL; - __direct_map_base = 0x40000000; - __direct_map_size = 0x40000000; + /* set the TLB Clear bit */ + *(vulp)T2_IOCSR = t2_iocsr | (0x1UL << 28); + mb(); + *(vulp)T2_IOCSR; /* read it back to make sure */ + + /* clear the TLB Clear bit */ + *(vulp)T2_IOCSR = t2_iocsr & ~(0x1UL << 28); + mb(); + *(vulp)T2_IOCSR; /* read it back to make sure */ } #define SIC_SEIC (1UL << 33) /* System Event Clear */ diff --git a/arch/alpha/kernel/core_tsunami.c b/arch/alpha/kernel/core_tsunami.c index c1e7e7d866d4..7628bc241085 100644 --- a/arch/alpha/kernel/core_tsunami.c +++ b/arch/alpha/kernel/core_tsunami.c @@ -317,10 +317,17 @@ tsunami_init_one_pchip(tsunami_pchip *pchip, int index) * Window 0 is scatter-gather 8MB at 8MB (for isa) * Window 1 is scatter-gather (up to) 1GB at 1GB * Window 2 is direct access 2GB at 2GB + * + * NOTE: we need the align_entry settings for Acer devices on ES40, + * specifically floppy and IDE when memory is larger than 2GB. */ hose->sg_isa = iommu_arena_new(hose, 0x00800000, 0x00800000, 0); + /* Initially set for 4 PTEs, but will be overridden to 64K for ISA. */ + hose->sg_isa->align_entry = 4; + hose->sg_pci = iommu_arena_new(hose, 0x40000000, size_for_memory(0x40000000), 0); + hose->sg_pci->align_entry = 4; /* Tsunami caches 4 PTEs at a time */ __direct_map_base = 0x80000000; __direct_map_size = 0x80000000; diff --git a/arch/alpha/kernel/pci.c b/arch/alpha/kernel/pci.c index c6cda4e39dae..cb74c9705cad 100644 --- a/arch/alpha/kernel/pci.c +++ b/arch/alpha/kernel/pci.c @@ -97,15 +97,22 @@ quirk_cypress(struct pci_dev *dev) way to turn this off. The bridge also supports several extended BIOS ranges (disabled after power-up), and some consoles do turn them on. So if we use a large direct-map window, or a large SG - window, we must avoid entire 0xfff00000-0xffffffff region. */ + window, we must avoid the entire 0xfff00000-0xffffffff region. */ else if (dev->class >> 8 == PCI_CLASS_BRIDGE_ISA) { - if (__direct_map_base + __direct_map_size >= 0xfff00000) - __direct_map_size = 0xfff00000 - __direct_map_base; - else { +#define DMAPSZ (max_low_pfn << PAGE_SHIFT) /* memory size, not window size */ + if ((__direct_map_base + DMAPSZ - 1) >= 0xfff00000UL) { + __direct_map_size = 0xfff00000UL - __direct_map_base; + printk("%s: adjusting direct map size to 0x%x\n", + __FUNCTION__, __direct_map_size); + } else { struct pci_controller *hose = dev->sysdata; struct pci_iommu_arena *pci = hose->sg_pci; - if (pci && pci->dma_base + pci->size >= 0xfff00000) - pci->size = 0xfff00000 - pci->dma_base; + if (pci && + (pci->dma_base + pci->size - 1) >= 0xfff00000UL) { + pci->size = 0xfff00000UL - pci->dma_base; + printk("%s: adjusting PCI S/G size to 0x%x\n", + __FUNCTION__, pci->size); + } } } } diff --git a/arch/alpha/kernel/pci_impl.h b/arch/alpha/kernel/pci_impl.h index e850b911789d..7139e6c2da71 100644 --- a/arch/alpha/kernel/pci_impl.h +++ b/arch/alpha/kernel/pci_impl.h @@ -52,15 +52,16 @@ struct pci_iommu_arena; #define APECS_AND_LCA_DEFAULT_MEM_BASE ((16+2)*1024*1024) /* - * Because the MCPCIA core logic supports more bits for physical addresses, - * it should allow an expanded range of SPARSE memory addresses. - * However, we do not use them all, in order to avoid the HAE manipulation - * that would be needed. + * Because MCPCIA and T2 core logic support more bits for + * physical addresses, they should allow an expanded range of SPARSE + * memory addresses. However, we do not use them all, in order to + * avoid the HAE manipulation that would be needed. */ #define MCPCIA_DEFAULT_MEM_BASE ((32+2)*1024*1024) +#define T2_DEFAULT_MEM_BASE ((16+1)*1024*1024) /* - * Because CIA and PYXIS and T2 have more bits for physical addresses, + * Because CIA and PYXIS have more bits for physical addresses, * they support an expanded range of SPARSE memory addresses. */ #define DEFAULT_MEM_BASE ((128+16)*1024*1024) @@ -157,8 +158,6 @@ extern struct resource *alloc_resource(void); extern struct pci_iommu_arena *iommu_arena_new(struct pci_controller *, dma_addr_t, unsigned long, unsigned long); -extern long iommu_arena_alloc(struct pci_iommu_arena *arena, long n); - extern const char *const pci_io_names[]; extern const char *const pci_mem_names[]; extern const char pci_hae0_name[]; diff --git a/arch/alpha/kernel/pci_iommu.c b/arch/alpha/kernel/pci_iommu.c index f85e4bfb5f52..72f574168a00 100644 --- a/arch/alpha/kernel/pci_iommu.c +++ b/arch/alpha/kernel/pci_iommu.c @@ -30,6 +30,9 @@ #define DEBUG_NODIRECT 0 #define DEBUG_FORCEDAC 0 +/* Most Alphas support 32-bit ISA DMA. Exceptions are XL, Ruffian, + Nautilus, Sable, and Alcor (see asm-alpha/dma.h for details). */ +#define ISA_DMA_MASK (MAX_DMA_ADDRESS - IDENT_ADDR - 1) static inline unsigned long mk_iommu_pte(unsigned long paddr) @@ -129,8 +132,8 @@ iommu_arena_find_pages(struct pci_iommu_arena *arena, long n, long mask) return p; } -long -iommu_arena_alloc(struct pci_iommu_arena *arena, long n) +static long +iommu_arena_alloc(struct pci_iommu_arena *arena, long n, unsigned int align) { unsigned long flags; unsigned long *ptes; @@ -140,7 +143,7 @@ iommu_arena_alloc(struct pci_iommu_arena *arena, long n) /* Search for N empty ptes */ ptes = arena->ptes; - mask = arena->align_entry - 1; + mask = max(align, arena->align_entry) - 1; p = iommu_arena_find_pages(arena, n, mask); if (p < 0) { spin_unlock_irqrestore(&arena->lock, flags); @@ -181,7 +184,7 @@ pci_map_single_1(struct pci_dev *pdev, void *cpu_addr, size_t size, int dac_allowed) { struct pci_controller *hose = pdev ? pdev->sysdata : pci_isa_hose; - dma_addr_t max_dma = pdev ? pdev->dma_mask : 0x00ffffff; + dma_addr_t max_dma = pdev ? pdev->dma_mask : ISA_DMA_MASK; struct pci_iommu_arena *arena; long npages, dma_ofs, i; unsigned long paddr; @@ -232,7 +235,8 @@ pci_map_single_1(struct pci_dev *pdev, void *cpu_addr, size_t size, arena = hose->sg_isa; npages = calc_npages((paddr & ~PAGE_MASK) + size); - dma_ofs = iommu_arena_alloc(arena, npages); + /* Force allocation to 64KB boundary for all ISA devices. */ + dma_ofs = iommu_arena_alloc(arena, npages, pdev ? 8 : 0); if (dma_ofs < 0) { printk(KERN_WARNING "pci_map_single failed: " "could not allocate dma page tables\n"); @@ -499,7 +503,7 @@ sg_fill(struct scatterlist *leader, struct scatterlist *end, paddr &= ~PAGE_MASK; npages = calc_npages(paddr + size); - dma_ofs = iommu_arena_alloc(arena, npages); + dma_ofs = iommu_arena_alloc(arena, npages, 0); if (dma_ofs < 0) { /* If we attempted a direct map above but failed, die. */ if (leader->dma_address == 0) @@ -588,7 +592,7 @@ pci_map_sg(struct pci_dev *pdev, struct scatterlist *sg, int nents, /* Second, figure out where we're going to map things. */ if (alpha_mv.mv_pci_tbi) { hose = pdev ? pdev->sysdata : pci_isa_hose; - max_dma = pdev ? pdev->dma_mask : 0x00ffffff; + max_dma = pdev ? pdev->dma_mask : ISA_DMA_MASK; arena = hose->sg_pci; if (!arena || arena->dma_base + arena->size - 1 > max_dma) arena = hose->sg_isa; @@ -651,7 +655,7 @@ pci_unmap_sg(struct pci_dev *pdev, struct scatterlist *sg, int nents, return; hose = pdev ? pdev->sysdata : pci_isa_hose; - max_dma = pdev ? pdev->dma_mask : 0x00ffffff; + max_dma = pdev ? pdev->dma_mask : ISA_DMA_MASK; arena = hose->sg_pci; if (!arena || arena->dma_base + arena->size - 1 > max_dma) arena = hose->sg_isa; diff --git a/arch/alpha/kernel/proto.h b/arch/alpha/kernel/proto.h index 746869cb1145..f27e767155c3 100644 --- a/arch/alpha/kernel/proto.h +++ b/arch/alpha/kernel/proto.h @@ -59,7 +59,7 @@ extern void polaris_machine_check(u64, u64, struct pt_regs *); extern struct pci_ops t2_pci_ops; extern void t2_init_arch(void); extern void t2_machine_check(u64, u64, struct pt_regs *); -#define t2_pci_tbi ((void *)0) +extern void t2_pci_tbi(struct pci_controller *, dma_addr_t, dma_addr_t); /* core_titan.c */ extern struct pci_ops titan_pci_ops; diff --git a/arch/alpha/kernel/sys_alcor.c b/arch/alpha/kernel/sys_alcor.c index 1b17a6a0e364..fa32465ab44f 100644 --- a/arch/alpha/kernel/sys_alcor.c +++ b/arch/alpha/kernel/sys_alcor.c @@ -251,7 +251,7 @@ struct alpha_machine_vector alcor_mv __initmv = { DO_CIA_IO, DO_CIA_BUS, machine_check: cia_machine_check, - max_dma_address: ALPHA_MAX_DMA_ADDRESS, + max_dma_address: ALPHA_ALCOR_MAX_DMA_ADDRESS, min_io_address: EISA_DEFAULT_IO_BASE, min_mem_address: CIA_DEFAULT_MEM_BASE, diff --git a/arch/alpha/kernel/sys_sable.c b/arch/alpha/kernel/sys_sable.c index 6255f9cab307..dc35fe7ea125 100644 --- a/arch/alpha/kernel/sys_sable.c +++ b/arch/alpha/kernel/sys_sable.c @@ -290,9 +290,9 @@ struct alpha_machine_vector sable_mv __initmv = { DO_T2_IO, DO_T2_BUS, machine_check: t2_machine_check, - max_dma_address: ALPHA_MAX_DMA_ADDRESS, + max_dma_address: ALPHA_SABLE_MAX_DMA_ADDRESS, min_io_address: EISA_DEFAULT_IO_BASE, - min_mem_address: DEFAULT_MEM_BASE, + min_mem_address: T2_DEFAULT_MEM_BASE, nr_irqs: 40, device_interrupt: sable_srm_device_interrupt, @@ -322,9 +322,9 @@ struct alpha_machine_vector sable_gamma_mv __initmv = { DO_T2_IO, DO_T2_BUS, machine_check: t2_machine_check, - max_dma_address: ALPHA_MAX_DMA_ADDRESS, + max_dma_address: ALPHA_SABLE_MAX_DMA_ADDRESS, min_io_address: EISA_DEFAULT_IO_BASE, - min_mem_address: DEFAULT_MEM_BASE, + min_mem_address: T2_DEFAULT_MEM_BASE, nr_irqs: 40, device_interrupt: sable_srm_device_interrupt, diff --git a/arch/alpha/kernel/time.c b/arch/alpha/kernel/time.c index 93a569828d70..00ee0c01b001 100644 --- a/arch/alpha/kernel/time.c +++ b/arch/alpha/kernel/time.c @@ -185,8 +185,8 @@ validate_cc_value(unsigned long cc) unsigned int min, max; } cpu_hz[] __initdata = { [EV3_CPU] = { 50000000, 200000000 }, /* guess */ - [EV4_CPU] = { 150000000, 300000000 }, - [LCA4_CPU] = { 150000000, 300000000 }, /* guess */ + [EV4_CPU] = { 100000000, 300000000 }, + [LCA4_CPU] = { 100000000, 300000000 }, /* guess */ [EV45_CPU] = { 200000000, 300000000 }, [EV5_CPU] = { 250000000, 433000000 }, [EV56_CPU] = { 333000000, 667000000 }, @@ -257,12 +257,12 @@ calibrate_cc_with_pic(void) cc = rpcc(); do { - count++; + count+=100; /* by 1 takes too long to timeout from 0 */ } while ((inb(0x61) & 0x20) == 0 && count > 0); cc = rpcc() - cc; /* Error: ECTCNEVERSET or ECPUTOOFAST. */ - if (count <= 1) + if (count <= 100) return 0; /* Error: ECPUTOOSLOW. */ diff --git a/arch/alpha/kernel/traps.c b/arch/alpha/kernel/traps.c index a7542ecac525..c90a631a8720 100644 --- a/arch/alpha/kernel/traps.c +++ b/arch/alpha/kernel/traps.c @@ -29,6 +29,7 @@ */ static int opDEC_testing = 0; static int opDEC_fix = 0; +static int opDEC_checked = 0; static unsigned long opDEC_test_pc = 0; static void @@ -36,6 +37,8 @@ opDEC_check(void) { unsigned long test_pc; + if (opDEC_checked) return; + lock_kernel(); opDEC_testing = 1; @@ -48,6 +51,7 @@ opDEC_check(void) : ); opDEC_testing = 0; + opDEC_checked = 1; unlock_kernel(); } diff --git a/include/asm-alpha/core_t2.h b/include/asm-alpha/core_t2.h index 007cf43baf10..fdaa57aa2c14 100644 --- a/include/asm-alpha/core_t2.h +++ b/include/asm-alpha/core_t2.h @@ -19,7 +19,7 @@ * */ -#define T2_MEM_R1_MASK 0x03ffffff /* Mem sparse region 1 mask is 26 bits */ +#define T2_MEM_R1_MASK 0x07ffffff /* Mem sparse region 1 mask is 26 bits */ /* GAMMA-SABLE is a SABLE with EV5-based CPUs */ #define _GAMMA_BIAS 0x8000000000UL @@ -402,13 +402,17 @@ __EXTERN_INLINE void t2_outl(u32 b, unsigned long addr) * */ +#define t2_set_hae { \ + msb = addr >> 27; \ + addr &= T2_MEM_R1_MASK; \ + set_hae(msb); \ +} + __EXTERN_INLINE u8 t2_readb(unsigned long addr) { unsigned long result, msb; - msb = addr & 0xE0000000; - addr &= T2_MEM_R1_MASK; - set_hae(msb); + t2_set_hae; result = *(vip) ((addr << 5) + T2_SPARSE_MEM + 0x00); return __kernel_extbl(result, addr & 3); @@ -418,9 +422,7 @@ __EXTERN_INLINE u16 t2_readw(unsigned long addr) { unsigned long result, msb; - msb = addr & 0xE0000000; - addr &= T2_MEM_R1_MASK; - set_hae(msb); + t2_set_hae; result = *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x08); return __kernel_extwl(result, addr & 3); @@ -431,9 +433,7 @@ __EXTERN_INLINE u32 t2_readl(unsigned long addr) { unsigned long msb; - msb = addr & 0xE0000000; - addr &= T2_MEM_R1_MASK; - set_hae(msb); + t2_set_hae; return *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x18); } @@ -442,9 +442,7 @@ __EXTERN_INLINE u64 t2_readq(unsigned long addr) { unsigned long r0, r1, work, msb; - msb = addr & 0xE0000000; - addr &= T2_MEM_R1_MASK; - set_hae(msb); + t2_set_hae; work = (addr << 5) + T2_SPARSE_MEM + 0x18; r0 = *(vuip)(work); @@ -456,9 +454,7 @@ __EXTERN_INLINE void t2_writeb(u8 b, unsigned long addr) { unsigned long msb, w; - msb = addr & 0xE0000000; - addr &= T2_MEM_R1_MASK; - set_hae(msb); + t2_set_hae; w = __kernel_insbl(b, addr & 3); *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x00) = w; @@ -468,9 +464,7 @@ __EXTERN_INLINE void t2_writew(u16 b, unsigned long addr) { unsigned long msb, w; - msb = addr & 0xE0000000; - addr &= T2_MEM_R1_MASK; - set_hae(msb); + t2_set_hae; w = __kernel_inswl(b, addr & 3); *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x08) = w; @@ -481,9 +475,7 @@ __EXTERN_INLINE void t2_writel(u32 b, unsigned long addr) { unsigned long msb; - msb = addr & 0xE0000000; - addr &= T2_MEM_R1_MASK; - set_hae(msb); + t2_set_hae; *(vuip) ((addr << 5) + T2_SPARSE_MEM + 0x18) = b; } @@ -492,9 +484,7 @@ __EXTERN_INLINE void t2_writeq(u64 b, unsigned long addr) { unsigned long msb, work; - msb = addr & 0xE0000000; - addr &= T2_MEM_R1_MASK; - set_hae(msb); + t2_set_hae; work = (addr << 5) + T2_SPARSE_MEM + 0x18; *(vuip)work = b; diff --git a/include/asm-alpha/dma.h b/include/asm-alpha/dma.h index e6d667144b50..97daf7d786aa 100644 --- a/include/asm-alpha/dma.h +++ b/include/asm-alpha/dma.h @@ -75,34 +75,49 @@ #define MAX_DMA_CHANNELS 8 -/* The maximum address that we can perform a DMA transfer to on Alpha XL, - due to a hardware SIO (PCI<->ISA bus bridge) chip limitation, is 64MB. - See for more info. +/* + ISA DMA limitations on Alpha platforms, + + These may be due to SIO (PCI<->ISA bridge) chipset limitation, or + just a wiring limit. */ -/* The maximum address that we can perform a DMA transfer to on RUFFIAN, - due to a hardware SIO (PCI<->ISA bus bridge) chip limitation, is 16MB. - See for more info. + +/* The maximum address for ISA DMA transfer on Alpha XL, due to an + hardware SIO limitation, is 64MB. +*/ +#define ALPHA_XL_MAX_DMA_ADDRESS (IDENT_ADDR+0x04000000UL) + +/* The maximum address for ISA DMA transfer on RUFFIAN and NAUTILUS, + due to an hardware SIO limitation, is 16MB. */ -/* NOTE: we must define the maximum as something less than 64Mb, to prevent - virt_to_bus() from returning an address in the first window, for a - data area that goes beyond the 64Mb first DMA window. Sigh... - We MUST coordinate the maximum with for consistency. - For now, this limit is set to 48Mb... +#define ALPHA_RUFFIAN_MAX_DMA_ADDRESS (IDENT_ADDR+0x01000000UL) +#define ALPHA_NAUTILUS_MAX_DMA_ADDRESS (IDENT_ADDR+0x01000000UL) + +/* The maximum address for ISA DMA transfer on SABLE, and some ALCORs, + due to an hardware SIO chip limitation, is 2GB. +*/ +#define ALPHA_SABLE_MAX_DMA_ADDRESS (IDENT_ADDR+0x80000000UL) +#define ALPHA_ALCOR_MAX_DMA_ADDRESS (IDENT_ADDR+0x80000000UL) + +/* + Maximum address for all the others is the complete 32-bit bus + address space. */ -#define ALPHA_XL_MAX_DMA_ADDRESS (IDENT_ADDR+0x3000000UL) -#define ALPHA_RUFFIAN_MAX_DMA_ADDRESS (IDENT_ADDR+0x1000000UL) -#define ALPHA_NAUTILUS_MAX_DMA_ADDRESS (IDENT_ADDR+0x1000000UL) -#define ALPHA_MAX_DMA_ADDRESS (~0UL) +#define ALPHA_MAX_DMA_ADDRESS (IDENT_ADDR+0x100000000UL) #ifdef CONFIG_ALPHA_GENERIC # define MAX_DMA_ADDRESS (alpha_mv.max_dma_address) #else -# ifdef CONFIG_ALPHA_XL +# if defined(CONFIG_ALPHA_XL) # define MAX_DMA_ADDRESS ALPHA_XL_MAX_DMA_ADDRESS # elif defined(CONFIG_ALPHA_RUFFIAN) # define MAX_DMA_ADDRESS ALPHA_RUFFIAN_MAX_DMA_ADDRESS # elif defined(CONFIG_ALPHA_NAUTILUS) # define MAX_DMA_ADDRESS ALPHA_NAUTILUS_MAX_DMA_ADDRESS +# elif defined(CONFIG_ALPHA_SABLE) +# define MAX_DMA_ADDRESS ALPHA_SABLE_MAX_DMA_ADDRESS +# elif defined(CONFIG_ALPHA_ALCOR) +# define MAX_DMA_ADDRESS ALPHA_ALCOR_MAX_DMA_ADDRESS # else # define MAX_DMA_ADDRESS ALPHA_MAX_DMA_ADDRESS # endif diff --git a/include/asm-alpha/floppy.h b/include/asm-alpha/floppy.h index 58d053db1a7f..88049a927ddd 100644 --- a/include/asm-alpha/floppy.h +++ b/include/asm-alpha/floppy.h @@ -97,25 +97,22 @@ static int FDC2 = -1; /* * Most Alphas have no problems with floppy DMA crossing 64k borders, - * except for XL and RUFFIAN. They are also the only one with DMA - * limits, so we use that to test in the generic kernel. + * except for certain ones, like XL and RUFFIAN. + * + * However, the test is simple and fast, and this *is* floppy, after all, + * so we do it for all platforms, just to make sure. + * + * This is advantageous in other circumstances as well, as in moving + * about the PCI DMA windows and forcing the floppy to start doing + * scatter-gather when it never had before, and there *is* a problem + * on that platform... ;-} */ -#define __CROSS_64KB(a,s) \ +#define CROSS_64KB(a,s) \ ({ unsigned long __s64 = (unsigned long)(a); \ unsigned long __e64 = __s64 + (unsigned long)(s) - 1; \ (__s64 ^ __e64) & ~0xfffful; }) -#ifdef CONFIG_ALPHA_GENERIC -# define CROSS_64KB(a,s) (__CROSS_64KB(a,s) && ~alpha_mv.max_dma_address) -#else -# if defined(CONFIG_ALPHA_XL) || defined(CONFIG_ALPHA_RUFFIAN) || defined(CONFIG_ALPHA_NAUTILUS) -# define CROSS_64KB(a,s) __CROSS_64KB(a,s) -# else -# define CROSS_64KB(a,s) (0) -# endif -#endif - #define EXTRA_FLOPPY_PARAMS #endif /* __ASM_ALPHA_FLOPPY_H */ -- cgit v1.2.3 From b315226781b180732abb0aa4ead6322b8c7827c6 Mon Sep 17 00:00:00 2001 From: Alexander Viro Date: Sat, 7 Sep 2002 03:03:26 -0700 Subject: [PATCH] (1/25) Unexporting helper functions wipe_partitions() and driverfs_register_partitions(..., 1) (i.e. unregistering them) pulled into del_gendisk() and removed from callers. grok_partitions() merged with register_disk(). devfs_register_partitions(), grok_partitions() and wipe_partitions() not exported anymore. --- drivers/block/cciss.c | 2 -- drivers/block/cpqarray.c | 1 - drivers/block/genhd.c | 14 ++++++++------ drivers/block/umem.c | 4 +--- drivers/message/i2o/i2o_block.c | 2 -- drivers/mtd/ftl.c | 1 - drivers/s390/block/dasd_genhd.c | 8 -------- drivers/scsi/sd.c | 3 --- fs/partitions/check.c | 10 +--------- include/linux/blkdev.h | 1 - kernel/ksyms.c | 3 --- 11 files changed, 10 insertions(+), 39 deletions(-) (limited to 'include') diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index db3d25ebfd35..df336db3a336 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c @@ -742,7 +742,6 @@ static int revalidate_allvol(kdev_t dev) for(i=0; i< NWD; i++) { struct gendisk *disk = &hba[ctlr]->gendisk[i]; if (disk->major_name) { - wipe_partitions(mk_kdev(disk->major, disk->first_minor)); del_gendisk(disk); disk->major_name = NULL; } @@ -802,7 +801,6 @@ static int deregister_disk(int ctlr, int logvol) /* invalidate the devices and deregister the disk */ if (disk->major_name) { - wipe_partitions(mk_kdev(disk->major, disk->first_minor)); del_gendisk(disk); disk->major_name = NULL; } diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c index b9dfeb902e3c..aba33e13c9a6 100644 --- a/drivers/block/cpqarray.c +++ b/drivers/block/cpqarray.c @@ -1461,7 +1461,6 @@ static int revalidate_allvol(kdev_t dev) struct gendisk *disk = ida_gendisk + ctlr*NWD + i; if (!disk->major_name) continue; - wipe_partitions(mk_kdev(disk->major, disk->first_minor)); del_gendisk(disk); disk->major_name = NULL; } diff --git a/drivers/block/genhd.c b/drivers/block/genhd.c index e17207282c98..4535038fe435 100644 --- a/drivers/block/genhd.c +++ b/drivers/block/genhd.c @@ -77,17 +77,19 @@ EXPORT_SYMBOL(add_gendisk); * with the kernel. */ void -del_gendisk(struct gendisk *gp) +del_gendisk(struct gendisk *disk) { - struct gendisk **gpp; + struct gendisk **p; + wipe_partitions(mk_kdev(disk->major, disk->first_minor)); write_lock(&gendisk_lock); - for (gpp = &gendisk_head; *gpp; gpp = &((*gpp)->next)) - if (*gpp == gp) + for (p = &gendisk_head; *p; p = &((*p)->next)) + if (*p == disk) break; - if (*gpp) - *gpp = (*gpp)->next; + if (*p) + *p = (*p)->next; write_unlock(&gendisk_lock); + devfs_register_partitions(disk, disk->first_minor, 1); } EXPORT_SYMBOL(del_gendisk); diff --git a/drivers/block/umem.c b/drivers/block/umem.c index 482aa8634984..b326b6df938b 100644 --- a/drivers/block/umem.c +++ b/drivers/block/umem.c @@ -1222,10 +1222,8 @@ void __exit mm_cleanup(void) del_battery_timer(); - for (i=0; i < num_cards ; i++) { - devfs_register_partitions(mm_gendisk + i, i<>4]; - wipe_partitions(mk_kdev(MAJOR_NR, unit)); del_gendisk(p); for(i = unit; i <= unit+15; i++) blk_queue_max_sectors(i2ob_dev[i].req_queue, 0); @@ -1616,7 +1615,6 @@ void i2ob_del_device(struct i2o_controller *c, struct i2o_device *d) * This will force errors when i2ob_get_queue() is called * by the kenrel. */ - wipe_partitions(mk_kdev(MAJOR_NR, unit)); del_gendisk(&i2o_disk[unit>>4]); i2ob_dev[unit].req_queue = NULL; for(i = unit; i <= unit+15; i++) diff --git a/drivers/mtd/ftl.c b/drivers/mtd/ftl.c index 83e5ba3c3f7f..268f8e363a90 100644 --- a/drivers/mtd/ftl.c +++ b/drivers/mtd/ftl.c @@ -1298,7 +1298,6 @@ static void ftl_notify_remove(struct mtd_info *mtd) ftl_freepart(myparts[i]); myparts[i]->state = 0; - wipe_partitions(mk_kdev(MAJOR_NR, i<<4)); del_gendisk(myparts[i]->disk); kfree(myparts[i]->disk->name); kfree(myparts[i]->disk); diff --git a/drivers/s390/block/dasd_genhd.c b/drivers/s390/block/dasd_genhd.c index 5733d3f466f5..2becf7eb8567 100644 --- a/drivers/s390/block/dasd_genhd.c +++ b/drivers/s390/block/dasd_genhd.c @@ -284,14 +284,6 @@ dasd_destroy_partitions(dasd_device_t * device) if (disk == NULL) return; - wipe_partitions(device->kdev); - - /* - * This is confusing. The funcions is devfs_register_partitions - * but the 1 as third parameter makes it do an unregister... - * FIXME: there must be a better way to get rid of the devfs entries - */ - devfs_register_partitions(disk, minor(device->kdev), 1); del_gendisk(disk); } diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 09f49e427f16..8c1e5d9ef3b4 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1426,9 +1426,6 @@ static void sd_detach(Scsi_Device * sdp) sdkp->has_been_registered = 0; dev = MKDEV_SD(dsk_nr); driverfs_remove_partitions(sd_disks[dsk_nr], minor(dev)); - wipe_partitions(dev); - devfs_register_partitions (sd_disks[dsk_nr], minor(dev), 1); - /* unregister_disk() */ del_gendisk(sd_disks[dsk_nr]); } sdp->attached--; diff --git a/fs/partitions/check.c b/fs/partitions/check.c index 907cb1faf056..5c3bc6cdd864 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c @@ -414,18 +414,10 @@ void devfs_register_partitions (struct gendisk *dev, int minor, int unregister) * done */ -void register_disk(struct gendisk *gdev, kdev_t dev, unsigned minors, +void register_disk(struct gendisk *g, kdev_t dev, unsigned minors, struct block_device_operations *ops, long size) -{ - if (!gdev) - return; - grok_partitions(dev, size); -} - -void grok_partitions(kdev_t dev, long size) { struct block_device *bdev; - struct gendisk *g = get_gendisk(dev); struct hd_struct *p; if (!g) diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 9f1ac6d07fe8..e0fd1bbd5520 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -281,7 +281,6 @@ struct sec_size { extern struct sec_size * blk_sec[MAX_BLKDEV]; extern struct blk_dev_struct blk_dev[MAX_BLKDEV]; -extern void grok_partitions(kdev_t dev, long size); extern int wipe_partitions(kdev_t dev); extern void register_disk(struct gendisk *dev, kdev_t first, unsigned minors, struct block_device_operations *ops, long size); extern void check_partition(struct gendisk *disk, struct block_device *bdev); diff --git a/kernel/ksyms.c b/kernel/ksyms.c index ad618a550f86..df1b2e47e919 100644 --- a/kernel/ksyms.c +++ b/kernel/ksyms.c @@ -335,17 +335,14 @@ EXPORT_SYMBOL(blk_dev); EXPORT_SYMBOL(bdev_read_only); EXPORT_SYMBOL(set_device_ro); EXPORT_SYMBOL(bmap); -EXPORT_SYMBOL(devfs_register_partitions); EXPORT_SYMBOL(driverfs_remove_partitions); EXPORT_SYMBOL(blkdev_open); EXPORT_SYMBOL(blkdev_get); EXPORT_SYMBOL(blkdev_put); EXPORT_SYMBOL(ioctl_by_bdev); -EXPORT_SYMBOL(grok_partitions); EXPORT_SYMBOL(register_disk); EXPORT_SYMBOL(read_dev_sector); EXPORT_SYMBOL(init_buffer); -EXPORT_SYMBOL(wipe_partitions); EXPORT_SYMBOL_GPL(generic_file_direct_IO); /* tty routines */ -- cgit v1.2.3 From 4e49388694356ae25d69772092ade844fac54e61 Mon Sep 17 00:00:00 2001 From: Alexander Viro Date: Sat, 7 Sep 2002 03:03:31 -0700 Subject: [PATCH] (2/25) Removing ->nr_real Since ->nr_real is always 1 now, we can remove that field completely. Removed the last remnants of switch in disk_name() (it could be killed a long time ago, I just forgot to remove the last two cases when md and i2o got converted). Collapsed several instances of disk->part[minor - disk->first_minor] - in cases when we know that we deal with disk->part[0]. --- drivers/acorn/block/mfmhd.c | 1 - drivers/block/DAC960.c | 1 - drivers/block/acsi.c | 1 - drivers/block/cciss.c | 1 - drivers/block/cpqarray.c | 1 - drivers/block/genhd.c | 5 ++--- drivers/block/paride/pd.c | 1 - drivers/block/ps2esdi.c | 2 -- drivers/block/umem.c | 1 - drivers/block/xd.c | 2 -- drivers/ide/hd.c | 1 - drivers/ide/ide-probe.c | 1 - drivers/md/md.c | 1 - drivers/message/i2o/i2o_block.c | 1 - drivers/mtd/ftl.c | 1 - drivers/mtd/nftlcore.c | 1 - drivers/s390/block/dasd_genhd.c | 1 - drivers/scsi/sd.c | 1 - fs/block_dev.c | 3 +-- fs/partitions/check.c | 43 +++++++++++------------------------------ include/linux/genhd.h | 2 -- 21 files changed, 14 insertions(+), 58 deletions(-) (limited to 'include') diff --git a/drivers/acorn/block/mfmhd.c b/drivers/acorn/block/mfmhd.c index d1f952e1643b..38f7dfc9e82e 100644 --- a/drivers/acorn/block/mfmhd.c +++ b/drivers/acorn/block/mfmhd.c @@ -1280,7 +1280,6 @@ static void mfm_geninit (void) outw(0x80, mfm_irqenable); /* Required to enable IRQs from MFM podule */ for (i = 0; i < mfm_drives; i++) { - mfm_gendisk[i].nr_real = 1; add_gendisk(mfm_gendisk + i); mfm_geometry (i); register_disk(mfm_gendisk + i, mk_kdev(MAJOR_NR,i<<6), 1<<6, diff --git a/drivers/block/DAC960.c b/drivers/block/DAC960.c index 4256cbb35e78..72d50aa7b8f2 100644 --- a/drivers/block/DAC960.c +++ b/drivers/block/DAC960.c @@ -1973,7 +1973,6 @@ static boolean DAC960_RegisterBlockDevice(DAC960_Controller_T *Controller) disk->first_minor = n << DAC960_MaxPartitionsBits; disk->major_name = names + 9 * n; disk->minor_shift = DAC960_MaxPartitionsBits; - disk->nr_real = 1; disk->fops = &DAC960_BlockDeviceOperations; add_gendisk(disk); } diff --git a/drivers/block/acsi.c b/drivers/block/acsi.c index ff0480293480..e333d4d375c7 100644 --- a/drivers/block/acsi.c +++ b/drivers/block/acsi.c @@ -1704,7 +1704,6 @@ static void acsi_geninit(void) disk->minor_shift = (acsi_info[i].type==HARDDISK)?4:0; disk->part = acsi_part + (i<<4); disk->fops = &acsi_fops; - disk->nr_real = 1; add_gendisk(disk); register_disk(disk, mk_kdev(disk->major, disk->first_minor), 1<minor_shift, diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index df336db3a336..73f5888010d2 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c @@ -2447,7 +2447,6 @@ static int __init cciss_init_one(struct pci_dev *pdev, disk->major_name = NULL; disk->minor_shift = NWD_SHIFT; disk->part = hba[i]->hd + (j << NWD_SHIFT); - disk->nr_real = 1; if( !(drv->nr_blocks)) continue; (BLK_DEFAULT_QUEUE(MAJOR_NR + i))->hardsect_size = drv->block_size; diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c index aba33e13c9a6..396a114b4e24 100644 --- a/drivers/block/cpqarray.c +++ b/drivers/block/cpqarray.c @@ -451,7 +451,6 @@ int __init cpqarray_init(void) disk->first_minor = j<minor_shift = NWD_SHIFT; disk->part = ida + i*256 + (j<nr_real = 1; disk->de_arr = &de_arr[i][j]; disk->fops = &ida_fops; if (!drv->nr_blks) diff --git a/drivers/block/genhd.c b/drivers/block/genhd.c index 4535038fe435..f30b605b71d3 100644 --- a/drivers/block/genhd.c +++ b/drivers/block/genhd.c @@ -162,9 +162,8 @@ static int show_partition(struct seq_file *part, void *v) seq_puts(part, "major minor #blocks name\n\n"); /* show the full disk and all non-0 size partitions of it */ - for (n = 0; n < (sgp->nr_real << sgp->minor_shift); n++) { - int minormask = (1<minor_shift) - 1; - if ((n & minormask) && sgp->part[n].nr_sects == 0) + for (n = 0; n < 1<minor_shift; n++) { + if (n && sgp->part[n].nr_sects == 0) continue; seq_printf(part, "%4d %4d %10ld %s\n", sgp->major, n + sgp->first_minor, diff --git a/drivers/block/paride/pd.c b/drivers/block/paride/pd.c index 6d6b1ab6a7c4..b100a1faf6b8 100644 --- a/drivers/block/paride/pd.c +++ b/drivers/block/paride/pd.c @@ -687,7 +687,6 @@ static int pd_detect( void ) PD.gd.major_name = PD.name; PD.gd.minor_shift = PD_BITS; PD.gd.fops = &pd_fops; - PD.gd.nr_real = 1; PD.gd.major = major; PD.gd.first_minor = unit << PD_BITS; PD.gd.part = pd_hd + (unit << PD_BITS); diff --git a/drivers/block/ps2esdi.c b/drivers/block/ps2esdi.c index c1076b2b65d0..0882dd30d940 100644 --- a/drivers/block/ps2esdi.c +++ b/drivers/block/ps2esdi.c @@ -154,7 +154,6 @@ static struct gendisk ps2esdi_gendisk[2] = { minor_shift: 6, part: ps2esdi, fops: &ps2esdi_fops, - nr_real: 1 },{ major: MAJOR_NR, first_minor: 64, @@ -162,7 +161,6 @@ static struct gendisk ps2esdi_gendisk[2] = { minor_shift: 6, part: ps2esdi+64, fops: &ps2esdi_fops, - nr_real: 1 } }; diff --git a/drivers/block/umem.c b/drivers/block/umem.c index b326b6df938b..c1c872a6e358 100644 --- a/drivers/block/umem.c +++ b/drivers/block/umem.c @@ -1193,7 +1193,6 @@ int __init mm_init(void) sprintf(mm_names + i*6, "umem%c", 'a'+i); spin_lock_init(&cards[i].lock); disk->part = mm_partitions + (i << MM_SHIFT); - disk->nr_real = 1; disk->major = major_nr; disk->first_minor = i << MM_SHIFT; disk->major_name = mm_names + i*6; diff --git a/drivers/block/xd.c b/drivers/block/xd.c index 6dc939a7a055..7f30d2df7506 100644 --- a/drivers/block/xd.c +++ b/drivers/block/xd.c @@ -135,7 +135,6 @@ static struct gendisk xd_gendisk[2] = { .minor_shift = 6, .part = xd_struct, .fops = &xd_fops, - .nr_real = 1 },{ .major = MAJOR_NR, .first_minor = 64, @@ -143,7 +142,6 @@ static struct gendisk xd_gendisk[2] = { .minor_shift = 6, .part = xd_struct + 64, .fops = &xd_fops, - .nr_real = 1 } }; diff --git a/drivers/ide/hd.c b/drivers/ide/hd.c index 81624ccfe02f..534983a99346 100644 --- a/drivers/ide/hd.c +++ b/drivers/ide/hd.c @@ -849,7 +849,6 @@ static void __init hd_geninit(void) } for(drive=0; drive < NR_HD; drive++) { - hd_gendisk[drive].nr_real = 1; add_gendisk(hd_gendisk + drive); register_disk(hd_gendisk + drive, mk_kdev(MAJOR_NR,drive<<6), 1<<6, diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 1b972998ea2f..cd9b76e89e46 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c @@ -861,7 +861,6 @@ static void init_gendisk (ide_hwif_t *hwif) sprintf(names + 4*unit, "hd%c",'a'+hwif->index*MAX_DRIVES+unit); gd[unit].major_name = names + 4*unit; gd[unit].minor_shift = PARTN_BITS; - gd[unit].nr_real = 1; gd[unit].fops = ide_fops; hwif->gd[unit] = gd + unit; } diff --git a/drivers/md/md.c b/drivers/md/md.c index 41b8c222a538..04dc32ea7ce2 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -1459,7 +1459,6 @@ static int do_md_run(mddev_t * mddev) sprintf(major_name, "md%d", mdidx(mddev)); disk->major_name = major_name; disk->part = md_hd_struct + mdidx(mddev); - disk->nr_real = 1; disk->fops = &md_fops; mddev->pers = pers[pnum]; diff --git a/drivers/message/i2o/i2o_block.c b/drivers/message/i2o/i2o_block.c index 15228d03a9af..a8cdfb80a95a 100644 --- a/drivers/message/i2o/i2o_block.c +++ b/drivers/message/i2o/i2o_block.c @@ -1773,7 +1773,6 @@ int i2o_block_init(void) disk->minor_shift = 4; disk->part = i2ob + (i<<4); disk->fops = &i2ob_fops; - disk->nr_real = 1; disk->major_name = i2o_names + i*8; sprintf(disk->major_name, "i2o/hd%c", 'a' + i); } diff --git a/drivers/mtd/ftl.c b/drivers/mtd/ftl.c index 268f8e363a90..4d50cf22fc58 100644 --- a/drivers/mtd/ftl.c +++ b/drivers/mtd/ftl.c @@ -1254,7 +1254,6 @@ static void ftl_notify_add(struct mtd_info *mtd) disk->minor_shift = PART_BITS; disk->part = ftl_hd + (device << 4); disk->fops = &ftl_blk_fops; - disk->nr_real = 1; partition->mtd = mtd; partition->disk = disk; diff --git a/drivers/mtd/nftlcore.c b/drivers/mtd/nftlcore.c index 2de5c0783fde..27cd8b48ca14 100644 --- a/drivers/mtd/nftlcore.c +++ b/drivers/mtd/nftlcore.c @@ -152,7 +152,6 @@ static void NFTL_setup(struct mtd_info *mtd) gd->minor_shift = NFTL_PARTN_BITS; gd->part = part_table + (firstfree << NFTL_PARTN_BITS); gd->major_name = name; - gd->nr_real = 1; nftl->disk = gd; add_gendisk(gd); register_disk(gd, mk_kdev(MAJOR_NR,firstfree<major = new_major; disk->first_minor = i << DASD_PARTN_BITS; disk->minor_shift = DASD_PARTN_BITS; - disk->nr_real = 1; disk->fops = &dasd_device_operations; disk->de_arr = mi->de_arr + i; disk->flags = mi->flags + i; diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 8c1e5d9ef3b4..ddff04c6d4b2 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1351,7 +1351,6 @@ static int sd_attach(Scsi_Device * sdp) } sd_template.nr_dev++; - gd->nr_real = 1; gd->de_arr[0] = sdp->de; gd->driverfs_dev_arr[0] = &sdp->sdev_driverfs_dev; gd->major = SD_MAJOR(dsk_nr>>4); diff --git a/fs/block_dev.c b/fs/block_dev.c index 56fec1317128..a7bd20a9dd48 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -602,8 +602,7 @@ static int do_open(struct block_device *bdev, struct inode *inode, struct file * struct gendisk *g = get_gendisk(dev); bdev->bd_contains = bdev; if (g) { - int shift = g->minor_shift; - unsigned minor0 = (minor >> shift) << shift; + unsigned minor0 = g->first_minor; if (minor != minor0) { struct block_device *disk; disk = bdget(MKDEV(major(dev), minor0)); diff --git a/fs/partitions/check.c b/fs/partitions/check.c index 5c3bc6cdd864..6b79a6f10f2c 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c @@ -89,14 +89,12 @@ static int (*check_part[])(struct parsed_partitions *, struct block_device *) = char *disk_name (struct gendisk *hd, int minor, char *buf) { - unsigned int unit = (minor >> hd->minor_shift); - unsigned int part = (minor & ((1 << hd->minor_shift) -1 )); - struct hd_struct *p = hd->part + minor - hd->first_minor; + unsigned int part = minor - hd->first_minor; + struct hd_struct *p = hd->part + part; char s[40]; const char *maj; - if ((((minor - hd->first_minor) >> hd->minor_shift) < hd->nr_real) && - p->de) { + if (part < 1<minor_shift && p->de) { int pos; pos = devfs_generate_path(p->de, buf, 64); @@ -104,23 +102,7 @@ char *disk_name (struct gendisk *hd, int minor, char *buf) return buf + pos; } - /* - * Yes, I know, ... in cases is gccism and not a pretty one. - * However, the first variant will eventually consume _all_ cases - * and switch will disappear. - */ - switch (hd->major) { - default: - maj = hd->major_name; - break; - case MD_MAJOR: - sprintf(s, "%s%d", "md", unit); - maj = s; - break; - case I2O_MAJOR: - sprintf(s, "%s%c", hd->major_name, unit + 'a'); - maj = s; - } + maj = hd->major_name; if (!part) sprintf(buf, "%s", maj); else if (isdigit(maj[strlen(maj)-1])) @@ -150,7 +132,6 @@ static DEVICE_ATTR(type,S_IRUGO,partition_device_type_read,NULL); void driverfs_create_partitions(struct gendisk *hd, int minor) { int pos = -1; - int devnum = (minor - hd->first_minor) >> hd->minor_shift; char dirname[256]; struct device *parent = 0; int max_p; @@ -160,13 +141,13 @@ void driverfs_create_partitions(struct gendisk *hd, int minor) /* get parent driverfs device structure */ if (hd->driverfs_dev_arr) - parent = hd->driverfs_dev_arr[devnum]; + parent = hd->driverfs_dev_arr[0]; else /* if driverfs not supported by subsystem, skip partitions */ return; /* get parent device node directory name */ if (hd->de_arr) { - dir = hd->de_arr[devnum]; + dir = hd->de_arr[0]; if (dir) pos = devfs_generate_path (dir, dirname, sizeof dirname); @@ -268,7 +249,7 @@ void check_partition(struct gendisk *hd, struct block_device *bdev) return; if (hd->de_arr) - de = hd->de_arr[(minor(dev)-hd->first_minor)>>hd->minor_shift]; + de = hd->de_arr[0]; i = devfs_generate_path (de, buf, sizeof buf); if (i >= 0) { printk(KERN_INFO " /dev/%s:", buf + i); @@ -315,7 +296,6 @@ out: #ifdef CONFIG_DEVFS_FS static void devfs_register_partition (struct gendisk *dev, int minor, int part) { - int devnum = (minor - dev->first_minor) >> dev->minor_shift; devfs_handle_t dir; unsigned int devfs_flags = DEVFS_FL_DEFAULT; struct hd_struct *p = dev->part + minor - dev->first_minor; @@ -326,7 +306,7 @@ static void devfs_register_partition (struct gendisk *dev, int minor, int part) dir = devfs_get_parent(p[0].de); if (!dir) return; - if ( dev->flags && (dev->flags[devnum] & GENHD_FL_REMOVABLE) ) + if ( dev->flags && (dev->flags[0] & GENHD_FL_REMOVABLE) ) devfs_flags |= DEVFS_FL_REMOVABLE; sprintf (devname, "part%d", part); p[part].de = devfs_register (dir, devname, devfs_flags, @@ -340,7 +320,6 @@ static struct unique_numspace disc_numspace = UNIQUE_NUMBERSPACE_INITIALISER; static void devfs_register_disc (struct gendisk *dev, int minor) { int pos = 0; - int devnum = (minor - dev->first_minor) >> dev->minor_shift; devfs_handle_t dir, slave; unsigned int devfs_flags = DEVFS_FL_DEFAULT; char dirname[64], symlink[16]; @@ -349,10 +328,10 @@ static void devfs_register_disc (struct gendisk *dev, int minor) if (p[0].de) return; - if ( dev->flags && (dev->flags[devnum] & GENHD_FL_REMOVABLE) ) + if ( dev->flags && (dev->flags[0] & GENHD_FL_REMOVABLE) ) devfs_flags |= DEVFS_FL_REMOVABLE; if (dev->de_arr) { - dir = dev->de_arr[devnum]; + dir = dev->de_arr[0]; if (!dir) /* Aware driver wants to block disc management */ return; pos = devfs_generate_path(dir, dirname + 3, sizeof dirname-3); @@ -362,7 +341,7 @@ static void devfs_register_disc (struct gendisk *dev, int minor) } else { /* Unaware driver: construct "real" directory */ sprintf(dirname, "../%s/disc%d", dev->major_name, - (dev->first_minor >> dev->minor_shift) + devnum); + dev->first_minor >> dev->minor_shift); dir = devfs_mk_dir(NULL, dirname + 3, NULL); } if (!devfs_handle) diff --git a/include/linux/genhd.h b/include/linux/genhd.h index fd9f5a8d7c06..304ebe48ec24 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -76,8 +76,6 @@ struct gendisk { get real minor */ struct hd_struct *part; /* [indexed by minor] */ - int nr_real; /* number of real devices */ - struct gendisk *next; struct block_device_operations *fops; -- cgit v1.2.3 From 36bd834b4b5c9e59afc45f863075b4687077ebab Mon Sep 17 00:00:00 2001 From: Alexander Viro Date: Sat, 7 Sep 2002 03:03:36 -0700 Subject: [PATCH] (3/25) Removing useless minor arguments driverfs_remove_partitions(), devfs_register_partitions(), driverfs_create_partitions(), devfs_register_partition(), devfs_register_disc(), had lost 'minor' argument - it's always disk->first_minor these days. disk_name() takes partition number instead of minor now. Callers of wipe_partitions() in fs/block_dev.c expanded. Remaining caller passes gendisk instead of kdev_t now. --- drivers/block/blkpg.c | 25 +++++------- drivers/block/genhd.c | 6 +-- drivers/md/md.c | 2 +- drivers/scsi/sd.c | 4 +- fs/block_dev.c | 42 ++++++++++++-------- fs/partitions/check.c | 102 +++++++++++++++++++------------------------------ include/linux/blkdev.h | 2 +- include/linux/genhd.h | 7 ++-- 8 files changed, 85 insertions(+), 105 deletions(-) (limited to 'include') diff --git a/drivers/block/blkpg.c b/drivers/block/blkpg.c index 1d13a84a9919..106df6b4644c 100644 --- a/drivers/block/blkpg.c +++ b/drivers/block/blkpg.c @@ -71,7 +71,6 @@ int add_partition(struct block_device *bdev, struct blkpg_partition *p) long pstart, plength; int i; kdev_t dev = to_kdev_t(bdev->bd_dev); - struct hd_struct *part; /* convert bytes to sectors, check for fit in a hd_struct */ ppstart = (p->start >> 9); @@ -86,7 +85,6 @@ int add_partition(struct block_device *bdev, struct blkpg_partition *p) g = get_gendisk(dev); if (!g) return -ENXIO; - part = g->part + minor(dev) - g->first_minor; /* existing drive? */ @@ -97,19 +95,19 @@ int add_partition(struct block_device *bdev, struct blkpg_partition *p) return -EINVAL; /* partition number in use? */ - if (part[p->pno].nr_sects != 0) + if (g->part[p->pno].nr_sects != 0) return -EBUSY; /* overlap? */ for (i = 1; i < (1<minor_shift); i++) - if (!(pstart+plength <= part[i].start_sect || - pstart >= part[i].start_sect + part[i].nr_sects)) + if (!(pstart+plength <= g->part[i].start_sect || + pstart >= g->part[i].start_sect + g->part[i].nr_sects)) return -EBUSY; /* all seems OK */ - part[p->pno].start_sect = pstart; - part[p->pno].nr_sects = plength; - devfs_register_partitions (g, minor(dev), 0); + g->part[p->pno].start_sect = pstart; + g->part[p->pno].nr_sects = plength; + devfs_register_partitions (g, 0); return 0; } @@ -128,22 +126,19 @@ int del_partition(struct block_device *bdev, struct blkpg_partition *p) kdev_t dev = to_kdev_t(bdev->bd_dev); struct gendisk *g; struct block_device *bdevp; - struct hd_struct *part; int holder; /* find the drive major */ g = get_gendisk(dev); if (!g) return -ENXIO; - part = g->part + minor(dev) - g->first_minor; - if (bdev != bdev->bd_contains) return -EINVAL; if (p->pno <= 0 || p->pno >= (1 << g->minor_shift)) return -EINVAL; /* existing drive and partition? */ - if (part[p->pno].nr_sects == 0) + if (g->part[p->pno].nr_sects == 0) return -ENXIO; /* partition in use? Incomplete check for now. */ @@ -159,9 +154,9 @@ int del_partition(struct block_device *bdev, struct blkpg_partition *p) fsync_bdev(bdevp); invalidate_bdev(bdevp, 0); - part[p->pno].start_sect = 0; - part[p->pno].nr_sects = 0; - devfs_register_partitions (g, minor(dev), 0); + g->part[p->pno].start_sect = 0; + g->part[p->pno].nr_sects = 0; + devfs_register_partitions (g, 0); bd_release(bdevp); bdput(bdevp); diff --git a/drivers/block/genhd.c b/drivers/block/genhd.c index f30b605b71d3..782017d52905 100644 --- a/drivers/block/genhd.c +++ b/drivers/block/genhd.c @@ -81,7 +81,7 @@ del_gendisk(struct gendisk *disk) { struct gendisk **p; - wipe_partitions(mk_kdev(disk->major, disk->first_minor)); + wipe_partitions(disk); write_lock(&gendisk_lock); for (p = &gendisk_head; *p; p = &((*p)->next)) if (*p == disk) @@ -89,7 +89,7 @@ del_gendisk(struct gendisk *disk) if (*p) *p = (*p)->next; write_unlock(&gendisk_lock); - devfs_register_partitions(disk, disk->first_minor, 1); + devfs_register_partitions(disk, 1); } EXPORT_SYMBOL(del_gendisk); @@ -168,7 +168,7 @@ static int show_partition(struct seq_file *part, void *v) seq_printf(part, "%4d %4d %10ld %s\n", sgp->major, n + sgp->first_minor, sgp->part[n].nr_sects >> 1 , - disk_name(sgp, n + sgp->first_minor, buf)); + disk_name(sgp, n, buf)); } return 0; diff --git a/drivers/md/md.c b/drivers/md/md.c index 04dc32ea7ce2..e50bfe391c01 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -276,7 +276,7 @@ char * partition_name(kdev_t dev) hd = get_gendisk (dev); dname->name = NULL; if (hd) - dname->name = disk_name (hd, minor(dev), dname->namebuf); + dname->name = disk_name(hd, minor(dev)-hd->first_minor, dname->namebuf); if (!dname->name) { sprintf (dname->namebuf, "[dev %s]", kdevname(dev)); dname->name = dname->namebuf; diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index ddff04c6d4b2..b8cdd54caaae 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -126,8 +126,6 @@ static void sd_rw_intr(Scsi_Cmnd * SCpnt); static Scsi_Disk * sd_get_sdisk(int index); -extern void driverfs_remove_partitions(struct gendisk *hd, int minor); - #if defined(CONFIG_PPC32) /** * sd_find_target - find kdev_t of first scsi disk that matches @@ -1424,7 +1422,7 @@ static void sd_detach(Scsi_Device * sdp) if (sdkp->has_been_registered) { sdkp->has_been_registered = 0; dev = MKDEV_SD(dsk_nr); - driverfs_remove_partitions(sd_disks[dsk_nr], minor(dev)); + driverfs_remove_partitions(sd_disks[dsk_nr]); del_gendisk(sd_disks[dsk_nr]); } sdp->attached--; diff --git a/fs/block_dev.c b/fs/block_dev.c index a7bd20a9dd48..637c6f0f387d 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -528,16 +528,21 @@ int check_disk_change(struct block_device *bdev) int full_check_disk_change(struct block_device *bdev) { int res; + if (bdev->bd_contains != bdev) + BUG(); down(&bdev->bd_sem); res = check_disk_change(bdev); if (bdev->bd_invalidated && !bdev->bd_part_count) { - struct gendisk *g = get_gendisk(to_kdev_t(bdev->bd_dev)); - struct hd_struct *part; - part = g->part + MINOR(bdev->bd_dev) - g->first_minor; + struct gendisk *disk = get_gendisk(to_kdev_t(bdev->bd_dev)); + int p; bdev->bd_invalidated = 0; - wipe_partitions(to_kdev_t(bdev->bd_dev)); - if (part[0].nr_sects) - check_partition(g, bdev); + for (p = 1; p < 1<minor_shift; p++) { + disk->part[p].start_sect = 0; + disk->part[p].nr_sects = 0; + } + res = invalidate_device(to_kdev_t(bdev->bd_dev), 1); + if (disk->part[0].nr_sects) + check_partition(disk, bdev); } up(&bdev->bd_sem); return res; @@ -650,11 +655,14 @@ static int do_open(struct block_device *bdev, struct inode *inode, struct file * bdev->bd_inode->i_data.backing_dev_info = bdi; } if (bdev->bd_invalidated && !bdev->bd_part_count) { - struct hd_struct *part; - part = g->part + minor(dev) - g->first_minor; + int p; bdev->bd_invalidated = 0; - wipe_partitions(dev); - if (part[0].nr_sects) + for (p = 1; p < 1<minor_shift; p++) { + g->part[p].start_sect = 0; + g->part[p].nr_sects = 0; + } + invalidate_device(dev, 1); + if (g->part[0].nr_sects) check_partition(g, bdev); } } else { @@ -791,12 +799,10 @@ static int blkdev_reread_part(struct block_device *bdev) { kdev_t dev = to_kdev_t(bdev->bd_dev); struct gendisk *disk = get_gendisk(dev); - struct hd_struct *part; - int res; + int p, res; - if (!disk || !disk->minor_shift) + if (!disk || !disk->minor_shift || bdev != bdev->bd_contains) return -EINVAL; - part = disk->part + minor(dev) - disk->first_minor; if (!capable(CAP_SYS_ADMIN)) return -EACCES; if (down_trylock(&bdev->bd_sem)) @@ -805,11 +811,15 @@ static int blkdev_reread_part(struct block_device *bdev) up(&bdev->bd_sem); return -EBUSY; } - res = wipe_partitions(dev); + for (p = 1; p < 1 << disk->minor_shift; p++) { + disk->part[p].start_sect = 0; + disk->part[p].nr_sects = 0; + } + res = invalidate_device(dev, 1); if (!res) { if (bdev->bd_op->revalidate) bdev->bd_op->revalidate(dev); - if (part[0].nr_sects) + if (disk->part[0].nr_sects) check_partition(disk, bdev); } up(&bdev->bd_sem); diff --git a/fs/partitions/check.c b/fs/partitions/check.c index 6b79a6f10f2c..6dd2bb455c27 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c @@ -87,28 +87,21 @@ static int (*check_part[])(struct parsed_partitions *, struct block_device *) = * a pointer to that same buffer (for convenience). */ -char *disk_name (struct gendisk *hd, int minor, char *buf) +char *disk_name (struct gendisk *hd, int part, char *buf) { - unsigned int part = minor - hd->first_minor; - struct hd_struct *p = hd->part + part; - char s[40]; - const char *maj; - - if (part < 1<minor_shift && p->de) { + if (part < 1<minor_shift && hd->part[part].de) { int pos; - pos = devfs_generate_path(p->de, buf, 64); + pos = devfs_generate_path(hd->part[part].de, buf, 64); if (pos >= 0) return buf + pos; } - - maj = hd->major_name; if (!part) - sprintf(buf, "%s", maj); - else if (isdigit(maj[strlen(maj)-1])) - sprintf(buf, "%sp%d", maj, part); + sprintf(buf, "%s", hd->major_name); + else if (isdigit(hd->major_name[strlen(hd->major_name)-1])) + sprintf(buf, "%sp%d", hd->major_name, part); else - sprintf(buf, "%s%d", maj, part); + sprintf(buf, "%s%d", hd->major_name, part); return buf; } @@ -129,7 +122,7 @@ static ssize_t partition_device_type_read(struct device *driverfs_dev, } static DEVICE_ATTR(type,S_IRUGO,partition_device_type_read,NULL); -void driverfs_create_partitions(struct gendisk *hd, int minor) +static void driverfs_create_partitions(struct gendisk *hd) { int pos = -1; char dirname[256]; @@ -137,7 +130,7 @@ void driverfs_create_partitions(struct gendisk *hd, int minor) int max_p; int part; devfs_handle_t dir = 0; - struct hd_struct *p = hd->part + minor - hd->first_minor; + struct hd_struct *p = hd->part; /* get parent driverfs device structure */ if (hd->driverfs_dev_arr) @@ -154,7 +147,7 @@ void driverfs_create_partitions(struct gendisk *hd, int minor) } if (pos < 0) { - disk_name(hd, minor, dirname); + disk_name(hd, 0, dirname); pos = 0; } @@ -168,7 +161,7 @@ void driverfs_create_partitions(struct gendisk *hd, int minor) current_driverfs_dev->parent = parent; /* handle disc case */ current_driverfs_dev->driver_data = - (void *)(long)__mkdev(hd->major, minor+part); + (void *)(long)__mkdev(hd->major, hd->first_minor+part); if (part == 0) { if (parent) { sprintf(current_driverfs_dev->name, @@ -204,12 +197,12 @@ void driverfs_create_partitions(struct gendisk *hd, int minor) } } -void driverfs_remove_partitions(struct gendisk *hd, int minor) +void driverfs_remove_partitions(struct gendisk *hd) { int max_p; int part; struct device * current_driverfs_dev; - struct hd_struct *p = hd->part + minor - hd->first_minor; + struct hd_struct *p = hd->part; max_p=(1 << hd->minor_shift); @@ -225,10 +218,8 @@ void driverfs_remove_partitions(struct gendisk *hd, int minor) } } current_driverfs_dev = &p->hd_driverfs_dev; - device_remove_file(current_driverfs_dev, - &dev_attr_type); - device_remove_file(current_driverfs_dev, - &dev_attr_kdev); + device_remove_file(current_driverfs_dev, &dev_attr_type); + device_remove_file(current_driverfs_dev, &dev_attr_kdev); put_device(current_driverfs_dev); return; } @@ -256,7 +247,7 @@ void check_partition(struct gendisk *hd, struct block_device *bdev) sprintf(state->name, "p"); } else { unsigned n = hd->major; - disk_name(hd, minor(dev), state->name); + disk_name(hd, 0, state->name); printk(KERN_INFO " %s:", state->name); if (n - COMPAQ_SMART2_MAJOR <= 7 || n - COMPAQ_CISS_MAJOR <= 7) sprintf(state->name, "p"); @@ -274,7 +265,7 @@ void check_partition(struct gendisk *hd, struct block_device *bdev) printk(" unable to read partition table\n"); goto out; } - p = hd->part + minor(dev) - hd->first_minor; + p = hd->part; for (j = 1; j < state->limit; j++) { p[j].start_sect = state->parts[j].from; p[j].nr_sects = state->parts[j].size; @@ -289,16 +280,16 @@ void check_partition(struct gendisk *hd, struct block_device *bdev) printk(" unknown partition table\n"); out: - driverfs_create_partitions(hd, minor(dev)); - devfs_register_partitions (hd, minor(dev), 0); + driverfs_create_partitions(hd); + devfs_register_partitions(hd, 0); } #ifdef CONFIG_DEVFS_FS -static void devfs_register_partition (struct gendisk *dev, int minor, int part) +static void devfs_register_partition(struct gendisk *dev, int part) { devfs_handle_t dir; unsigned int devfs_flags = DEVFS_FL_DEFAULT; - struct hd_struct *p = dev->part + minor - dev->first_minor; + struct hd_struct *p = dev->part; char devname[16]; if (p[part].de) @@ -310,21 +301,21 @@ static void devfs_register_partition (struct gendisk *dev, int minor, int part) devfs_flags |= DEVFS_FL_REMOVABLE; sprintf (devname, "part%d", part); p[part].de = devfs_register (dir, devname, devfs_flags, - dev->major, minor + part, + dev->major, dev->first_minor + part, S_IFBLK | S_IRUSR | S_IWUSR, dev->fops, NULL); } static struct unique_numspace disc_numspace = UNIQUE_NUMBERSPACE_INITIALISER; -static void devfs_register_disc (struct gendisk *dev, int minor) +static void devfs_register_disc(struct gendisk *dev) { int pos = 0; devfs_handle_t dir, slave; unsigned int devfs_flags = DEVFS_FL_DEFAULT; char dirname[64], symlink[16]; static devfs_handle_t devfs_handle; - struct hd_struct *p = dev->part + minor - dev->first_minor; + struct hd_struct *p = dev->part; if (p[0].de) return; @@ -350,7 +341,8 @@ static void devfs_register_disc (struct gendisk *dev, int minor) sprintf(symlink, "disc%d", p[0].number); devfs_mk_symlink (devfs_handle, symlink, DEVFS_FL_DEFAULT, dirname + pos, &slave, NULL); - p[0].de = devfs_register (dir, "disc", devfs_flags, dev->major, minor, + p[0].de = devfs_register (dir, "disc", devfs_flags, + dev->major, dev->first_minor, S_IFBLK | S_IRUSR | S_IWUSR, dev->fops, NULL); devfs_auto_unregister(p[0].de, slave); if (!dev->de_arr) @@ -358,14 +350,14 @@ static void devfs_register_disc (struct gendisk *dev, int minor) } #endif /* CONFIG_DEVFS_FS */ -void devfs_register_partitions (struct gendisk *dev, int minor, int unregister) +void devfs_register_partitions (struct gendisk *dev, int unregister) { #ifdef CONFIG_DEVFS_FS int part, max_p; - struct hd_struct *p = dev->part + minor - dev->first_minor; + struct hd_struct *p = dev->part; if (!unregister) - devfs_register_disc (dev, minor); + devfs_register_disc(dev); max_p = (1 << dev->minor_shift); for (part = 1; part < max_p; part++) { if ( unregister || (p[part].nr_sects < 1) ) { @@ -373,7 +365,7 @@ void devfs_register_partitions (struct gendisk *dev, int minor, int unregister) p[part].de = NULL; continue; } - devfs_register_partition (dev, minor, part); + devfs_register_partition(dev, part); } if (unregister) { devfs_unregister(p[0].de); @@ -402,7 +394,7 @@ void register_disk(struct gendisk *g, kdev_t dev, unsigned minors, if (!g) return; - p = g->part + minor(dev) - g->first_minor; + p = g->part; p[0].nr_sects = size; /* No minors to use for partitions */ @@ -443,38 +435,24 @@ fail: return NULL; } -int wipe_partitions(kdev_t dev) +int wipe_partitions(struct gendisk *disk) { - struct gendisk *g; - kdev_t devp; - int p, major, minor, minor0, max_p, res; - struct hd_struct *part; - - g = get_gendisk(dev); - if (g == NULL) - return -EINVAL; - - max_p = 1 << g->minor_shift; - major = major(dev); - minor = minor(dev); - minor0 = minor & ~(max_p - 1); - if (minor0 != minor) /* for now only whole-disk reread */ - return -EINVAL; /* %%% later.. */ - - part = g->part + minor - g->first_minor; + int max_p = 1 << disk->minor_shift; + int p; + /* invalidate stuff */ for (p = max_p - 1; p >= 0; p--) { - minor = minor0 + p; - devp = mk_kdev(major,minor); + kdev_t devp = mk_kdev(disk->major,disk->first_minor + p); + int res; #if 0 /* %%% superfluous? */ - if (part[p].nr_sects == 0) + if (disk->part[p].nr_sects == 0) continue; #endif res = invalidate_device(devp, 1); if (res) return res; - part[p].start_sect = 0; - part[p].nr_sects = 0; + disk->part[p].start_sect = 0; + disk->part[p].nr_sects = 0; } return 0; } diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index e0fd1bbd5520..77fec95ff4b4 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -281,7 +281,7 @@ struct sec_size { extern struct sec_size * blk_sec[MAX_BLKDEV]; extern struct blk_dev_struct blk_dev[MAX_BLKDEV]; -extern int wipe_partitions(kdev_t dev); +extern int wipe_partitions(struct gendisk *disk); extern void register_disk(struct gendisk *dev, kdev_t first, unsigned minors, struct block_device_operations *ops, long size); extern void check_partition(struct gendisk *disk, struct block_device *bdev); extern void generic_make_request(struct bio *bio); diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 304ebe48ec24..dcff86342667 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -240,11 +240,10 @@ struct unixware_disklabel { #ifdef __KERNEL__ -char *disk_name (struct gendisk *hd, int minor, char *buf); +char *disk_name (struct gendisk *hd, int part, char *buf); -extern void devfs_register_partitions (struct gendisk *dev, int minor, - int unregister); -extern void driverfs_remove_partitions (struct gendisk *hd, int minor); +extern void devfs_register_partitions (struct gendisk *dev, int unregister); +extern void driverfs_remove_partitions (struct gendisk *hd); static inline unsigned int disk_index (kdev_t dev) { -- cgit v1.2.3 From ab3bfaa2cca8ffcc9df56e41ebd82ba2837f040c Mon Sep 17 00:00:00 2001 From: Alexander Viro Date: Sat, 7 Sep 2002 03:03:44 -0700 Subject: [PATCH] (5/25) Removing bogus arrays - ->flags[] Seeing that now disk->flags[] always consists of one element, we replace char *flags with int flags, remove the junk from places that used to allocate these "arrays" and do obvious updates of the code (s/->flags[0]/->flags/). --- drivers/ide/ide-cd.c | 3 +++ drivers/ide/ide-disk.c | 13 ++----------- drivers/ide/ide-floppy.c | 12 ++---------- drivers/ide/ide-probe.c | 9 --------- drivers/ide/ide.c | 2 -- drivers/s390/block/dasd_genhd.c | 2 -- drivers/scsi/sd.c | 5 +---- fs/partitions/check.c | 4 ++-- include/linux/genhd.h | 2 +- 9 files changed, 11 insertions(+), 41 deletions(-) (limited to 'include') diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index d6e7db8b7887..860f2436179d 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c @@ -3147,6 +3147,9 @@ static int ide_cdrom_reinit (ide_drive_t *drive) cdrom_read_toc(drive, &sense); g->minor_shift = 0; + /* probably bogus, but that's the old behaviour */ + g->de_arr[0] = NULL; + g->flags = 0; add_gendisk(g); register_disk(g, mk_kdev(g->major,g->first_minor), 1<minor_shift, ide_fops, diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index ce8e1a9e57b9..5fb72ddaf952 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c @@ -1516,8 +1516,6 @@ static void idedisk_add_settings(ide_drive_t *drive) static void idedisk_setup (ide_drive_t *drive) { - int i; - struct hd_driveid *id = drive->id; unsigned long capacity; @@ -1538,15 +1536,6 @@ static void idedisk_setup (ide_drive_t *drive) drive->doorlocking = 1; } } - for (i = 0; i < MAX_DRIVES; ++i) { - ide_hwif_t *hwif = HWIF(drive); - - if (drive != &hwif->drives[i]) continue; - hwif->gd[i]->de_arr[i] = drive->de; - if (drive->removable) - hwif->gd[i]->flags[i] |= GENHD_FL_REMOVABLE; - break; - } #if 1 (void) probe_lba_addressing(drive, 1); @@ -1714,6 +1703,8 @@ static int idedisk_reinit(ide_drive_t *drive) } DRIVER(drive)->busy--; g->minor_shift = PARTN_BITS; + g->de_arr[0] = drive->de; + g->flags = drive->removable ? GENHD_FL_REMOVABLE : 0; add_gendisk(g); register_disk(g, mk_kdev(g->major,g->first_minor), 1<minor_shift, ide_fops, diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index 24ef0f8ba412..94f57d4b5b9f 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c @@ -2065,7 +2065,6 @@ static void idefloppy_add_settings(ide_drive_t *drive) static void idefloppy_setup (ide_drive_t *drive, idefloppy_floppy_t *floppy) { struct idefloppy_id_gcw gcw; - int i; *((unsigned short *) &gcw) = drive->id->config; drive->driver_data = floppy; @@ -2108,15 +2107,6 @@ static void idefloppy_setup (ide_drive_t *drive, idefloppy_floppy_t *floppy) (void) idefloppy_get_capacity (drive); idefloppy_add_settings(drive); - for (i = 0; i < MAX_DRIVES; ++i) { - ide_hwif_t *hwif = HWIF(drive); - - if (drive != &hwif->drives[i]) continue; - hwif->gd[i]->de_arr[i] = drive->de; - if (drive->removable) - hwif->gd[i]->flags[i] |= GENHD_FL_REMOVABLE; - break; - } } static int idefloppy_cleanup (ide_drive_t *drive) @@ -2221,6 +2211,8 @@ static int idefloppy_reinit (ide_drive_t *drive) idefloppy_setup (drive, floppy); DRIVER(drive)->busy--; g->minor_shift = PARTN_BITS; + g->de_arr[0] = drive->de; + g->flags = drive->removable ? GENHD_FL_REMOVABLE : 0; add_gendisk(g); register_disk(g, mk_kdev(g->major,g->first_minor), 1<minor_shift, ide_fops, diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index cd9b76e89e46..9fc3488c111b 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c @@ -809,7 +809,6 @@ static void init_gendisk (ide_hwif_t *hwif) struct gendisk *gd; struct hd_struct *part; devfs_handle_t *de_arr; - char *flags; unsigned int unit, units, minors; extern devfs_handle_t ide_devfs_handle; char *names; @@ -841,11 +840,6 @@ static void init_gendisk (ide_hwif_t *hwif) goto err_kmalloc_gd_de_arr; memset(de_arr, 0, sizeof(devfs_handle_t) * MAX_DRIVES); - flags = kmalloc(sizeof(char) * MAX_DRIVES, GFP_KERNEL); - if (!flags) - goto err_kmalloc_gd_flags; - memset(flags, 0, sizeof(char) * MAX_DRIVES); - names = kmalloc (4 * MAX_DRIVES, GFP_KERNEL); if (!names) goto err_kmalloc_gd_names; @@ -854,7 +848,6 @@ static void init_gendisk (ide_hwif_t *hwif) for (unit = 0; unit < units; ++unit) { gd[unit].part = part + (unit << PARTN_BITS); gd[unit].de_arr = de_arr + unit; - gd[unit].flags = flags + unit; hwif->drives[unit].part = gd[unit].part; gd[unit].major = hwif->major; gd[unit].first_minor = unit << PARTN_BITS; @@ -891,8 +884,6 @@ static void init_gendisk (ide_hwif_t *hwif) return; err_kmalloc_gd_names: - kfree(names); -err_kmalloc_gd_flags: kfree(de_arr); err_kmalloc_gd_de_arr: kfree(part); diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index c81cbf3ae916..7c1ed4dd8f25 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c @@ -2064,8 +2064,6 @@ void ide_unregister (unsigned int index) kfree(gd->part); if (gd->de_arr) kfree (gd->de_arr); - if (gd->flags) - kfree (gd->flags); kfree(gd); for (i = 0; i < MAX_DRIVES; i++) hwif->gd[i] = NULL; diff --git a/drivers/s390/block/dasd_genhd.c b/drivers/s390/block/dasd_genhd.c index 056a917799a8..82d060ba4026 100644 --- a/drivers/s390/block/dasd_genhd.c +++ b/drivers/s390/block/dasd_genhd.c @@ -35,7 +35,6 @@ struct major_info { int major; struct gendisk disks[DASD_PER_MAJOR]; devfs_handle_t de_arr[DASD_PER_MAJOR]; - char flags[DASD_PER_MAJOR]; char names[DASD_PER_MAJOR * 8]; struct hd_struct part[1<minor_shift = DASD_PARTN_BITS; disk->fops = &dasd_device_operations; disk->de_arr = mi->de_arr + i; - disk->flags = mi->flags + i; disk->part = mi->part + (i << DASD_PARTN_BITS); } diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index b4edc9266a48..b1686243dccb 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1302,7 +1302,6 @@ static int sd_attach(Scsi_Device * sdp) struct gendisk disk; devfs_handle_t de; struct device *dev; - char flags; char name[5]; } *p; struct gendisk *gd; @@ -1316,7 +1315,6 @@ static int sd_attach(Scsi_Device * sdp) return 1; gd = &p->disk; gd->de_arr = &p->de; - gd->flags = &p->flags; gd->driverfs_dev_arr = &p->dev; SCSI_LOG_HLQUEUE(3, printk("sd_attach: scsi device: <%d,%d,%d,%d>\n", @@ -1361,8 +1359,7 @@ static int sd_attach(Scsi_Device * sdp) else sprintf(p->name, "sd%c", 'a'+dsk_nr%26); gd->major_name = p->name; - if (sdp->removable) - gd->flags[0] |= GENHD_FL_REMOVABLE; + gd->flags = sdp->removable ? GENHD_FL_REMOVABLE : 0; sd_disks[dsk_nr] = gd; sd_dskname(dsk_nr, diskname); printk(KERN_NOTICE "Attached scsi %sdisk %s at scsi%d, channel %d, " diff --git a/fs/partitions/check.c b/fs/partitions/check.c index fa248882183b..db8d2e8269a3 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c @@ -260,7 +260,7 @@ static void devfs_register_partition(struct gendisk *dev, int part) dir = devfs_get_parent(p[0].de); if (!dir) return; - if ( dev->flags && (dev->flags[0] & GENHD_FL_REMOVABLE) ) + if (dev->flags & GENHD_FL_REMOVABLE) devfs_flags |= DEVFS_FL_REMOVABLE; sprintf (devname, "part%d", part); p[part].de = devfs_register (dir, devname, devfs_flags, @@ -282,7 +282,7 @@ static void devfs_register_disc(struct gendisk *dev) if (p[0].de) return; - if ( dev->flags && (dev->flags[0] & GENHD_FL_REMOVABLE) ) + if (dev->flags & GENHD_FL_REMOVABLE) devfs_flags |= DEVFS_FL_REMOVABLE; if (dev->de_arr) { dir = dev->de_arr[0]; diff --git a/include/linux/genhd.h b/include/linux/genhd.h index dcff86342667..aa2f694ceb1a 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -81,7 +81,7 @@ struct gendisk { devfs_handle_t *de_arr; /* one per physical disc */ struct device **driverfs_dev_arr;/* support driverfs hierarchy */ - char *flags; /* one per physical disc */ + int flags; }; /* drivers/block/genhd.c */ -- cgit v1.2.3 From c5f45a700c4f2041ae99ed824c70c870b52e3f33 Mon Sep 17 00:00:00 2001 From: Alexander Viro Date: Sat, 7 Sep 2002 03:03:49 -0700 Subject: [PATCH] (6/25) Removing bogus arrays - ->driverfs_dev_arr[] disk->driverfs_dev_arr is either NULL or consists of exactly one element. Same change as above (struct device ** -> struct device *); old "is the pointer to array itself NULL or not?" replaced with a flag (in disk->flags). --- drivers/scsi/sd.c | 5 ++--- fs/partitions/check.c | 8 ++++---- include/linux/genhd.h | 3 ++- 3 files changed, 8 insertions(+), 8 deletions(-) (limited to 'include') diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index b1686243dccb..79deae0ef3f9 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1301,7 +1301,6 @@ static int sd_attach(Scsi_Device * sdp) struct { struct gendisk disk; devfs_handle_t de; - struct device *dev; char name[5]; } *p; struct gendisk *gd; @@ -1315,7 +1314,6 @@ static int sd_attach(Scsi_Device * sdp) return 1; gd = &p->disk; gd->de_arr = &p->de; - gd->driverfs_dev_arr = &p->dev; SCSI_LOG_HLQUEUE(3, printk("sd_attach: scsi device: <%d,%d,%d,%d>\n", sdp->host->host_no, sdp->channel, sdp->id, sdp->lun)); @@ -1348,7 +1346,6 @@ static int sd_attach(Scsi_Device * sdp) sd_template.nr_dev++; gd->de_arr[0] = sdp->de; - gd->driverfs_dev_arr[0] = &sdp->sdev_driverfs_dev; gd->major = SD_MAJOR(dsk_nr>>4); gd->first_minor = (dsk_nr & 15)<<4; gd->minor_shift = 4; @@ -1360,6 +1357,8 @@ static int sd_attach(Scsi_Device * sdp) sprintf(p->name, "sd%c", 'a'+dsk_nr%26); gd->major_name = p->name; gd->flags = sdp->removable ? GENHD_FL_REMOVABLE : 0; + gd->driverfs_dev = &sdp->sdev_driverfs_dev; + gd->flags |= GENHD_FL_DRIVERFS; sd_disks[dsk_nr] = gd; sd_dskname(dsk_nr, diskname); printk(KERN_NOTICE "Attached scsi %sdisk %s at scsi%d, channel %d, " diff --git a/fs/partitions/check.c b/fs/partitions/check.c index db8d2e8269a3..ce9ace5e4ebe 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c @@ -131,12 +131,12 @@ static void driverfs_create_partitions(struct gendisk *hd) struct device *dev, *parent; int part; - /* get parent driverfs device structure */ - if (hd->driverfs_dev_arr) - parent = hd->driverfs_dev_arr[0]; - else /* if driverfs not supported by subsystem, skip partitions */ + /* if driverfs not supported by subsystem, skip partitions */ + if (!(hd->flags & GENHD_FL_DRIVERFS)) return; + parent = hd->driverfs_dev; + if (parent) { sprintf(name, "%s", parent->name); sprintf(bus_id, "%s:", parent->bus_id); diff --git a/include/linux/genhd.h b/include/linux/genhd.h index aa2f694ceb1a..5d82071b483c 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -67,6 +67,7 @@ struct hd_struct { }; #define GENHD_FL_REMOVABLE 1 +#define GENHD_FL_DRIVERFS 2 struct gendisk { int major; /* major number of driver */ @@ -80,7 +81,7 @@ struct gendisk { struct block_device_operations *fops; devfs_handle_t *de_arr; /* one per physical disc */ - struct device **driverfs_dev_arr;/* support driverfs hierarchy */ + struct device *driverfs_dev; int flags; }; -- cgit v1.2.3 From db09b5fc07571729c8710696b96f708370dde976 Mon Sep 17 00:00:00 2001 From: Alexander Viro Date: Sat, 7 Sep 2002 03:03:53 -0700 Subject: [PATCH] (7/25) Removing bogus arrays - ->part[].number Each hd_struct used to have int number; in it. It's used _only_ in disk->part[0] - disk->part[n].number is never assigned/checked for any positive n. Moved from hd_struct to gendisk (disk->part[0].number to disk->number). --- fs/partitions/check.c | 6 +++--- include/linux/genhd.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'include') diff --git a/fs/partitions/check.c b/fs/partitions/check.c index ce9ace5e4ebe..30f35cc619ae 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c @@ -300,8 +300,8 @@ static void devfs_register_disc(struct gendisk *dev) } if (!devfs_handle) devfs_handle = devfs_mk_dir(NULL, "discs", NULL); - p[0].number = devfs_alloc_unique_number (&disc_numspace); - sprintf(symlink, "disc%d", p[0].number); + dev->number = devfs_alloc_unique_number (&disc_numspace); + sprintf(symlink, "disc%d", dev->number); devfs_mk_symlink (devfs_handle, symlink, DEVFS_FL_DEFAULT, dirname + pos, &slave, NULL); p[0].de = devfs_register (dir, "disc", devfs_flags, @@ -333,7 +333,7 @@ void devfs_register_partitions (struct gendisk *dev, int unregister) if (unregister) { devfs_unregister(p[0].de); p[0].de = NULL; - devfs_dealloc_unique_number(&disc_numspace, p[0].number); + devfs_dealloc_unique_number(&disc_numspace, dev->number); } #endif /* CONFIG_DEVFS_FS */ } diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 5d82071b483c..7ac93efcf99a 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -62,7 +62,6 @@ struct hd_struct { unsigned long start_sect; unsigned long nr_sects; devfs_handle_t de; /* primary (master) devfs entry */ - int number; /* stupid old code wastes space */ struct device hd_driverfs_dev; /* support driverfs hiearchy */ }; @@ -83,6 +82,7 @@ struct gendisk { devfs_handle_t *de_arr; /* one per physical disc */ struct device *driverfs_dev; int flags; + int number; /* devfs crap */ }; /* drivers/block/genhd.c */ -- cgit v1.2.3 From 06f55b095f81fd6e2113911d2e983d63c6f0ac86 Mon Sep 17 00:00:00 2001 From: Alexander Viro Date: Sat, 7 Sep 2002 03:03:58 -0700 Subject: [PATCH] (8/25) Removing bogus arrays - ->de_arr[] similar to ->flags and ->driverfs_dev_arr, ->de_arr[] got replaced with its (single) element + flag. --- drivers/block/cpqarray.c | 13 +++++-------- drivers/ide/ide-cd.c | 4 ++-- drivers/ide/ide-disk.c | 3 ++- drivers/ide/ide-floppy.c | 3 ++- drivers/ide/ide-probe.c | 9 --------- drivers/ide/ide.c | 2 -- drivers/s390/block/dasd.c | 4 ++-- drivers/s390/block/dasd_genhd.c | 3 +-- drivers/scsi/sd.c | 6 ++---- fs/partitions/check.c | 10 +++++----- include/linux/genhd.h | 3 ++- 11 files changed, 23 insertions(+), 37 deletions(-) (limited to 'include') diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c index 396a114b4e24..658f201efd0f 100644 --- a/drivers/block/cpqarray.c +++ b/drivers/block/cpqarray.c @@ -75,7 +75,6 @@ MODULE_LICENSE("GPL"); static int nr_ctlr; static ctlr_info_t *hba[MAX_CTLR]; -static devfs_handle_t de_arr[MAX_CTLR][NWD]; static int eisa[8]; @@ -451,7 +450,7 @@ int __init cpqarray_init(void) disk->first_minor = j<minor_shift = NWD_SHIFT; disk->part = ida + i*256 + (j<de_arr = &de_arr[i][j]; + disk->flags = GENHD_FL_DEVFS; disk->fops = &ida_fops; if (!drv->nr_blks) continue; @@ -1665,6 +1664,7 @@ static void getgeometry(int ctlr) (log_index < id_ctlr_buf->nr_drvs) && (log_unit < NWD); log_unit++) { + struct gendisk *disk = ida_gendisk + ctlr * NWD + log_unit; size = sizeof(sense_log_drv_stat_t); @@ -1729,13 +1729,10 @@ static void getgeometry(int ctlr) return; } - if (!de_arr[ctlr][log_unit]) { + if (!disk->de) { char txt[16]; - - sprintf(txt, "ida/c%dd%d", ctlr, - log_unit); - de_arr[ctlr][log_unit] = - devfs_mk_dir(NULL, txt, NULL); + sprintf(txt,"ida/c%dd%d",ctlr,log_unit); + disk->de = devfs_mk_dir(NULL,txt,NULL); } info_p->phys_drives = sense_config_buf->ctlr_phys_drv; diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 860f2436179d..216ec47a2b32 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c @@ -3148,8 +3148,8 @@ static int ide_cdrom_reinit (ide_drive_t *drive) cdrom_read_toc(drive, &sense); g->minor_shift = 0; /* probably bogus, but that's the old behaviour */ - g->de_arr[0] = NULL; - g->flags = 0; + g->de = NULL; + g->flags = GENHD_FL_DEVFS; add_gendisk(g); register_disk(g, mk_kdev(g->major,g->first_minor), 1<minor_shift, ide_fops, diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 5fb72ddaf952..144c0bb95155 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c @@ -1703,8 +1703,9 @@ static int idedisk_reinit(ide_drive_t *drive) } DRIVER(drive)->busy--; g->minor_shift = PARTN_BITS; - g->de_arr[0] = drive->de; + g->de = drive->de; g->flags = drive->removable ? GENHD_FL_REMOVABLE : 0; + g->flags |= GENHD_FL_DEVFS; add_gendisk(g); register_disk(g, mk_kdev(g->major,g->first_minor), 1<minor_shift, ide_fops, diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index 94f57d4b5b9f..5e2ca16310fa 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c @@ -2211,8 +2211,9 @@ static int idefloppy_reinit (ide_drive_t *drive) idefloppy_setup (drive, floppy); DRIVER(drive)->busy--; g->minor_shift = PARTN_BITS; - g->de_arr[0] = drive->de; + g->de = drive->de; g->flags = drive->removable ? GENHD_FL_REMOVABLE : 0; + g->flags |= GENHD_FL_DEVFS; add_gendisk(g); register_disk(g, mk_kdev(g->major,g->first_minor), 1<minor_shift, ide_fops, diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 9fc3488c111b..50e98a9e6066 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c @@ -808,7 +808,6 @@ static void init_gendisk (ide_hwif_t *hwif) { struct gendisk *gd; struct hd_struct *part; - devfs_handle_t *de_arr; unsigned int unit, units, minors; extern devfs_handle_t ide_devfs_handle; char *names; @@ -835,11 +834,6 @@ static void init_gendisk (ide_hwif_t *hwif) memset(part, 0, minors * sizeof(struct hd_struct)); - de_arr = kmalloc(sizeof(devfs_handle_t) * MAX_DRIVES, GFP_KERNEL); - if (!de_arr) - goto err_kmalloc_gd_de_arr; - memset(de_arr, 0, sizeof(devfs_handle_t) * MAX_DRIVES); - names = kmalloc (4 * MAX_DRIVES, GFP_KERNEL); if (!names) goto err_kmalloc_gd_names; @@ -847,7 +841,6 @@ static void init_gendisk (ide_hwif_t *hwif) for (unit = 0; unit < units; ++unit) { gd[unit].part = part + (unit << PARTN_BITS); - gd[unit].de_arr = de_arr + unit; hwif->drives[unit].part = gd[unit].part; gd[unit].major = hwif->major; gd[unit].first_minor = unit << PARTN_BITS; @@ -884,8 +877,6 @@ static void init_gendisk (ide_hwif_t *hwif) return; err_kmalloc_gd_names: - kfree(de_arr); -err_kmalloc_gd_de_arr: kfree(part); err_kmalloc_gd_part: kfree(gd); diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 7c1ed4dd8f25..08950237c5d6 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c @@ -2062,8 +2062,6 @@ void ide_unregister (unsigned int index) if (gd) { int i; kfree(gd->part); - if (gd->de_arr) - kfree (gd->de_arr); kfree(gd); for (i = 0; i < MAX_DRIVES; i++) hwif->gd[i] = NULL; diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 8f7670f944ed..422e6e6e9d3c 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c @@ -302,7 +302,7 @@ dasd_state_new_to_known(dasd_device_t *device) /* Add a proc directory and the dasd device entry to devfs. */ sprintf(buffer, "%04x", device->devinfo.devno); dir = devfs_mk_dir(dasd_devfs_handle, buffer, device); - gdp->de_arr[0] = dir; + gdp->de = dir; if (devmap->features & DASD_FEATURE_READONLY) devfs_perm = S_IFBLK | S_IRUSR; else @@ -328,7 +328,7 @@ dasd_state_known_to_new(dasd_device_t * device) return; /* Remove device entry and devfs directory. */ devfs_unregister(device->devfs_entry); - devfs_unregister(gdp->de_arr[0]); + devfs_unregister(gdp->de); /* Forget the discipline information. */ device->discipline = NULL; diff --git a/drivers/s390/block/dasd_genhd.c b/drivers/s390/block/dasd_genhd.c index 82d060ba4026..700285728e59 100644 --- a/drivers/s390/block/dasd_genhd.c +++ b/drivers/s390/block/dasd_genhd.c @@ -34,7 +34,6 @@ struct major_info { struct list_head list; int major; struct gendisk disks[DASD_PER_MAJOR]; - devfs_handle_t de_arr[DASD_PER_MAJOR]; char names[DASD_PER_MAJOR * 8]; struct hd_struct part[1<first_minor = i << DASD_PARTN_BITS; disk->minor_shift = DASD_PARTN_BITS; disk->fops = &dasd_device_operations; - disk->de_arr = mi->de_arr + i; + disk->flags = GENHD_FL_DEVFS; disk->part = mi->part + (i << DASD_PARTN_BITS); } diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 79deae0ef3f9..39112441f969 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -1300,7 +1300,6 @@ static int sd_attach(Scsi_Device * sdp) unsigned long iflags; struct { struct gendisk disk; - devfs_handle_t de; char name[5]; } *p; struct gendisk *gd; @@ -1313,7 +1312,6 @@ static int sd_attach(Scsi_Device * sdp) if (!p) return 1; gd = &p->disk; - gd->de_arr = &p->de; SCSI_LOG_HLQUEUE(3, printk("sd_attach: scsi device: <%d,%d,%d,%d>\n", sdp->host->host_no, sdp->channel, sdp->id, sdp->lun)); @@ -1345,7 +1343,7 @@ static int sd_attach(Scsi_Device * sdp) } sd_template.nr_dev++; - gd->de_arr[0] = sdp->de; + gd->de = sdp->de; gd->major = SD_MAJOR(dsk_nr>>4); gd->first_minor = (dsk_nr & 15)<<4; gd->minor_shift = 4; @@ -1358,7 +1356,7 @@ static int sd_attach(Scsi_Device * sdp) gd->major_name = p->name; gd->flags = sdp->removable ? GENHD_FL_REMOVABLE : 0; gd->driverfs_dev = &sdp->sdev_driverfs_dev; - gd->flags |= GENHD_FL_DRIVERFS; + gd->flags |= GENHD_FL_DRIVERFS | GENHD_FL_DEVFS; sd_disks[dsk_nr] = gd; sd_dskname(dsk_nr, diskname); printk(KERN_NOTICE "Attached scsi %sdisk %s at scsi%d, channel %d, " diff --git a/fs/partitions/check.c b/fs/partitions/check.c index 30f35cc619ae..0401913788df 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c @@ -203,8 +203,8 @@ void check_partition(struct gendisk *hd, struct block_device *bdev) if (!state) return; - if (hd->de_arr) - de = hd->de_arr[0]; + if (hd->flags & GENHD_FL_DEVFS) + de = hd->de; i = devfs_generate_path (de, buf, sizeof buf); if (i >= 0) { printk(KERN_INFO " /dev/%s:", buf + i); @@ -284,8 +284,8 @@ static void devfs_register_disc(struct gendisk *dev) return; if (dev->flags & GENHD_FL_REMOVABLE) devfs_flags |= DEVFS_FL_REMOVABLE; - if (dev->de_arr) { - dir = dev->de_arr[0]; + if (dev->flags & GENHD_FL_DEVFS) { + dir = dev->de; if (!dir) /* Aware driver wants to block disc management */ return; pos = devfs_generate_path(dir, dirname + 3, sizeof dirname-3); @@ -308,7 +308,7 @@ static void devfs_register_disc(struct gendisk *dev) dev->major, dev->first_minor, S_IFBLK | S_IRUSR | S_IWUSR, dev->fops, NULL); devfs_auto_unregister(p[0].de, slave); - if (!dev->de_arr) + if (!(dev->flags & GENHD_FL_DEVFS)) devfs_auto_unregister (slave, dir); } #endif /* CONFIG_DEVFS_FS */ diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 7ac93efcf99a..ee2d41d8bd4d 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -67,6 +67,7 @@ struct hd_struct { #define GENHD_FL_REMOVABLE 1 #define GENHD_FL_DRIVERFS 2 +#define GENHD_FL_DEVFS 4 struct gendisk { int major; /* major number of driver */ @@ -79,7 +80,7 @@ struct gendisk { struct gendisk *next; struct block_device_operations *fops; - devfs_handle_t *de_arr; /* one per physical disc */ + devfs_handle_t de; struct device *driverfs_dev; int flags; int number; /* devfs crap */ -- cgit v1.2.3 From 897c924ed245812b0fafc96da5b2eb0232697e00 Mon Sep 17 00:00:00 2001 From: Alexander Viro Date: Sat, 7 Sep 2002 03:04:02 -0700 Subject: [PATCH] (9/25) update_partition() new helper - update_partition(disk, partition_number); does the right thing wrt devfs and driverfs (un)registration of partition entries. BLKPG ioctls fixed - now they call that beast rather than calling only devfs side. New helper - rescan_partitions(disk, bdev); does all work with wiping/rereading/etc. and fs/block_dev.c now uses it instead of check_partition(). The latter became static. --- drivers/block/blkpg.c | 4 +- drivers/block/genhd.c | 19 +------ fs/block_dev.c | 48 +++------------- fs/partitions/check.c | 150 ++++++++++++++++++++++++++++++++----------------- include/linux/blkdev.h | 2 - include/linux/genhd.h | 5 +- 6 files changed, 115 insertions(+), 113 deletions(-) (limited to 'include') diff --git a/drivers/block/blkpg.c b/drivers/block/blkpg.c index 106df6b4644c..9fbfaafbea25 100644 --- a/drivers/block/blkpg.c +++ b/drivers/block/blkpg.c @@ -107,7 +107,7 @@ int add_partition(struct block_device *bdev, struct blkpg_partition *p) /* all seems OK */ g->part[p->pno].start_sect = pstart; g->part[p->pno].nr_sects = plength; - devfs_register_partitions (g, 0); + update_partition(g, p->pno); return 0; } @@ -156,7 +156,7 @@ int del_partition(struct block_device *bdev, struct blkpg_partition *p) g->part[p->pno].start_sect = 0; g->part[p->pno].nr_sects = 0; - devfs_register_partitions (g, 0); + update_partition(g, p->pno); bd_release(bdevp); bdput(bdevp); diff --git a/drivers/block/genhd.c b/drivers/block/genhd.c index d9e3c2052b21..589ae73d7366 100644 --- a/drivers/block/genhd.c +++ b/drivers/block/genhd.c @@ -67,22 +67,11 @@ out: } EXPORT_SYMBOL(add_gendisk); +EXPORT_SYMBOL(del_gendisk); - -/** - * del_gendisk - remove partitioning information from kernel list - * @gp: per-device partitioning information - * - * This function unregisters the partitioning information in @gp - * with the kernel. - */ -void -del_gendisk(struct gendisk *disk) +void unlink_gendisk(struct gendisk *disk) { struct gendisk **p; - - driverfs_remove_partitions(disk); - wipe_partitions(disk); write_lock(&gendisk_lock); for (p = &gendisk_head; *p; p = &((*p)->next)) if (*p == disk) @@ -90,12 +79,8 @@ del_gendisk(struct gendisk *disk) if (*p) *p = (*p)->next; write_unlock(&gendisk_lock); - devfs_register_partitions(disk, 1); } -EXPORT_SYMBOL(del_gendisk); - - /** * get_gendisk - get partitioning information for a given device * @dev: device to get partitioning information for diff --git a/fs/block_dev.c b/fs/block_dev.c index 637c6f0f387d..30e46a931b2f 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -527,22 +527,13 @@ int check_disk_change(struct block_device *bdev) int full_check_disk_change(struct block_device *bdev) { - int res; + int res = 0; if (bdev->bd_contains != bdev) BUG(); down(&bdev->bd_sem); - res = check_disk_change(bdev); - if (bdev->bd_invalidated && !bdev->bd_part_count) { - struct gendisk *disk = get_gendisk(to_kdev_t(bdev->bd_dev)); - int p; - bdev->bd_invalidated = 0; - for (p = 1; p < 1<minor_shift; p++) { - disk->part[p].start_sect = 0; - disk->part[p].nr_sects = 0; - } - res = invalidate_device(to_kdev_t(bdev->bd_dev), 1); - if (disk->part[0].nr_sects) - check_partition(disk, bdev); + if (check_disk_change(bdev)) { + rescan_partitions(get_gendisk(to_kdev_t(bdev->bd_dev)), bdev); + res = 1; } up(&bdev->bd_sem); return res; @@ -654,17 +645,8 @@ static int do_open(struct block_device *bdev, struct inode *inode, struct file * inode->i_data.backing_dev_info = bdi; bdev->bd_inode->i_data.backing_dev_info = bdi; } - if (bdev->bd_invalidated && !bdev->bd_part_count) { - int p; - bdev->bd_invalidated = 0; - for (p = 1; p < 1<minor_shift; p++) { - g->part[p].start_sect = 0; - g->part[p].nr_sects = 0; - } - invalidate_device(dev, 1); - if (g->part[0].nr_sects) - check_partition(g, bdev); - } + if (bdev->bd_invalidated) + rescan_partitions(g, bdev); } else { down(&bdev->bd_contains->bd_sem); bdev->bd_contains->bd_part_count++; @@ -799,7 +781,7 @@ static int blkdev_reread_part(struct block_device *bdev) { kdev_t dev = to_kdev_t(bdev->bd_dev); struct gendisk *disk = get_gendisk(dev); - int p, res; + int res = 0; if (!disk || !disk->minor_shift || bdev != bdev->bd_contains) return -EINVAL; @@ -807,21 +789,7 @@ static int blkdev_reread_part(struct block_device *bdev) return -EACCES; if (down_trylock(&bdev->bd_sem)) return -EBUSY; - if (bdev->bd_part_count) { - up(&bdev->bd_sem); - return -EBUSY; - } - for (p = 1; p < 1 << disk->minor_shift; p++) { - disk->part[p].start_sect = 0; - disk->part[p].nr_sects = 0; - } - res = invalidate_device(dev, 1); - if (!res) { - if (bdev->bd_op->revalidate) - bdev->bd_op->revalidate(dev); - if (disk->part[0].nr_sects) - check_partition(disk, bdev); - } + res = rescan_partitions(disk, bdev); up(&bdev->bd_sem); return res; } diff --git a/fs/partitions/check.c b/fs/partitions/check.c index 0401913788df..8927d25ef60d 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c @@ -149,29 +149,29 @@ static void driverfs_create_partitions(struct gendisk *hd) sprintf(dev->name, "%sdisc", name); sprintf(dev->bus_id, "%sdisc", bus_id); for (part=1; part < max_p; part++) { + dev = &p[part].hd_driverfs_dev; + sprintf(dev->name, "%spart%d", name, part); + sprintf(dev->bus_id, "%s:p%d", bus_id, part); if (!p[part].nr_sects) continue; - dev = &p[part].hd_driverfs_dev; dev->driver_data = (void *)(long)__mkdev(hd->major, hd->first_minor+part); - sprintf(dev->name, "%spart%d", name, part); - sprintf(dev->bus_id, "%s:p%d", bus_id, part); } for (part=0; part < max_p; part++) { dev = &p[part].hd_driverfs_dev; - if (!dev->driver_data) - continue; dev->parent = parent; if (parent) dev->bus = parent->bus; + if (!dev->driver_data) + continue; device_register(dev); device_create_file(dev, &dev_attr_type); device_create_file(dev, &dev_attr_kdev); } } -void driverfs_remove_partitions(struct gendisk *hd) +static void driverfs_remove_partitions(struct gendisk *hd) { int max_p = 1<minor_shift; struct hd_struct *p; @@ -188,10 +188,7 @@ void driverfs_remove_partitions(struct gendisk *hd) } } -/* - * DON'T EXPORT - */ -void check_partition(struct gendisk *hd, struct block_device *bdev) +static void check_partition(struct gendisk *hd, struct block_device *bdev) { devfs_handle_t de = NULL; dev_t dev = bdev->bd_dev; @@ -226,7 +223,7 @@ void check_partition(struct gendisk *hd, struct block_device *bdev) if (res < 0) { if (warn_no_part) printk(" unable to read partition table\n"); - goto out; + return; } p = hd->part; for (j = 1; j < state->limit; j++) { @@ -238,18 +235,14 @@ void check_partition(struct gendisk *hd, struct block_device *bdev) md_autodetect_dev(dev+j); #endif } - goto out; + return; } - printk(" unknown partition table\n"); -out: - driverfs_create_partitions(hd); - devfs_register_partitions(hd, 0); } -#ifdef CONFIG_DEVFS_FS static void devfs_register_partition(struct gendisk *dev, int part) { +#ifdef CONFIG_DEVFS_FS devfs_handle_t dir; unsigned int devfs_flags = DEVFS_FL_DEFAULT; struct hd_struct *p = dev->part; @@ -262,26 +255,29 @@ static void devfs_register_partition(struct gendisk *dev, int part) return; if (dev->flags & GENHD_FL_REMOVABLE) devfs_flags |= DEVFS_FL_REMOVABLE; - sprintf (devname, "part%d", part); + sprintf(devname, "part%d", part); p[part].de = devfs_register (dir, devname, devfs_flags, dev->major, dev->first_minor + part, S_IFBLK | S_IRUSR | S_IWUSR, dev->fops, NULL); +#endif } +#ifdef CONFIG_DEVFS_FS static struct unique_numspace disc_numspace = UNIQUE_NUMBERSPACE_INITIALISER; +#endif -static void devfs_register_disc(struct gendisk *dev) +static void devfs_create_partitions(struct gendisk *dev) { +#ifdef CONFIG_DEVFS_FS int pos = 0; devfs_handle_t dir, slave; unsigned int devfs_flags = DEVFS_FL_DEFAULT; char dirname[64], symlink[16]; static devfs_handle_t devfs_handle; + int part, max_p = 1<minor_shift; struct hd_struct *p = dev->part; - if (p[0].de) - return; if (dev->flags & GENHD_FL_REMOVABLE) devfs_flags |= DEVFS_FL_REMOVABLE; if (dev->flags & GENHD_FL_DEVFS) { @@ -304,38 +300,28 @@ static void devfs_register_disc(struct gendisk *dev) sprintf(symlink, "disc%d", dev->number); devfs_mk_symlink (devfs_handle, symlink, DEVFS_FL_DEFAULT, dirname + pos, &slave, NULL); - p[0].de = devfs_register (dir, "disc", devfs_flags, + p->de = devfs_register(dir, "disc", devfs_flags, dev->major, dev->first_minor, S_IFBLK | S_IRUSR | S_IWUSR, dev->fops, NULL); - devfs_auto_unregister(p[0].de, slave); + devfs_auto_unregister(p->de, slave); if (!(dev->flags & GENHD_FL_DEVFS)) devfs_auto_unregister (slave, dir); + for (part = 1, p++; part < max_p; part++, p++) + if (p->nr_sects) + devfs_register_partition(dev, part); +#endif } -#endif /* CONFIG_DEVFS_FS */ -void devfs_register_partitions (struct gendisk *dev, int unregister) +static void devfs_remove_partitions(struct gendisk *dev) { #ifdef CONFIG_DEVFS_FS - int part, max_p; - struct hd_struct *p = dev->part; - - if (!unregister) - devfs_register_disc(dev); - max_p = (1 << dev->minor_shift); - for (part = 1; part < max_p; part++) { - if ( unregister || (p[part].nr_sects < 1) ) { - devfs_unregister(p[part].de); - p[part].de = NULL; - continue; - } - devfs_register_partition(dev, part); - } - if (unregister) { - devfs_unregister(p[0].de); - p[0].de = NULL; - devfs_dealloc_unique_number(&disc_numspace, dev->number); + int part; + for (part = 1<minor_shift; part--; ) { + devfs_unregister(dev->part[part].de); + dev->part[part].de = NULL; } -#endif /* CONFIG_DEVFS_FS */ + devfs_dealloc_unique_number(&disc_numspace, dev->number); +#endif } /* @@ -348,20 +334,20 @@ void devfs_register_partitions (struct gendisk *dev, int unregister) * done */ -void register_disk(struct gendisk *g, kdev_t dev, unsigned minors, +void register_disk(struct gendisk *disk, kdev_t dev, unsigned minors, struct block_device_operations *ops, long size) { struct block_device *bdev; struct hd_struct *p; - if (!g) + if (!disk) return; - p = g->part; + p = disk->part; p[0].nr_sects = size; /* No minors to use for partitions */ - if (!g->minor_shift) + if (!disk->minor_shift) return; /* No such device (e.g., media were just removed) */ @@ -371,10 +357,66 @@ void register_disk(struct gendisk *g, kdev_t dev, unsigned minors, bdev = bdget(kdev_t_to_nr(dev)); if (blkdev_get(bdev, FMODE_READ, 0, BDEV_RAW) < 0) return; - check_partition(g, bdev); + check_partition(disk, bdev); + driverfs_create_partitions(disk); + devfs_create_partitions(disk); blkdev_put(bdev, BDEV_RAW); } +void update_partition(struct gendisk *disk, int part) +{ + struct hd_struct *p = disk->part + part; + struct device *dev = &p->hd_driverfs_dev; + + if (!p->nr_sects) { + if (p->de) { + devfs_unregister(p->de); + p->de = NULL; + } + if (dev->driver_data) { + device_remove_file(dev, &dev_attr_type); + device_remove_file(dev, &dev_attr_kdev); + put_device(dev); + dev->driver_data = NULL; + } + return; + } + if (!p->de) + devfs_register_partition(disk, part); + if (dev->driver_data || !(disk->flags & GENHD_FL_DRIVERFS)) + return; + dev->driver_data = + (void *)(long)__mkdev(disk->major, disk->first_minor+part); + device_register(dev); + device_create_file(dev, &dev_attr_type); + device_create_file(dev, &dev_attr_kdev); +} + +int rescan_partitions(struct gendisk *disk, struct block_device *bdev) +{ + kdev_t dev = to_kdev_t(bdev->bd_dev); + int p, res; + if (!bdev->bd_invalidated) + return 0; + if (bdev->bd_part_count) + return -EBUSY; + res = invalidate_device(dev, 1); + if (res) + return res; + bdev->bd_invalidated = 0; + for (p = 1; p < (1<minor_shift); p++) { + disk->part[p].start_sect = 0; + disk->part[p].nr_sects = 0; + } + if (bdev->bd_op->revalidate) + bdev->bd_op->revalidate(dev); + if (disk->part[0].nr_sects) + check_partition(disk, bdev); + for (p = 1; p < (1<minor_shift); p++) + update_partition(disk, p); + return res; +} + unsigned char *read_dev_sector(struct block_device *bdev, unsigned long n, Sector *p) { struct address_space *mapping = bdev->bd_inode->i_mapping; @@ -398,7 +440,7 @@ fail: return NULL; } -int wipe_partitions(struct gendisk *disk) +static int wipe_partitions(struct gendisk *disk) { int max_p = 1 << disk->minor_shift; int p; @@ -419,3 +461,11 @@ int wipe_partitions(struct gendisk *disk) } return 0; } + +void del_gendisk(struct gendisk *disk) +{ + driverfs_remove_partitions(disk); + wipe_partitions(disk); + unlink_gendisk(disk); + devfs_remove_partitions(disk); +} diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 77fec95ff4b4..a11b6181c76f 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -281,9 +281,7 @@ struct sec_size { extern struct sec_size * blk_sec[MAX_BLKDEV]; extern struct blk_dev_struct blk_dev[MAX_BLKDEV]; -extern int wipe_partitions(struct gendisk *disk); extern void register_disk(struct gendisk *dev, kdev_t first, unsigned minors, struct block_device_operations *ops, long size); -extern void check_partition(struct gendisk *disk, struct block_device *bdev); extern void generic_make_request(struct bio *bio); extern inline request_queue_t *bdev_get_queue(struct block_device *bdev); extern void blk_put_request(struct request *); diff --git a/include/linux/genhd.h b/include/linux/genhd.h index ee2d41d8bd4d..6474393eff5e 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -89,6 +89,7 @@ struct gendisk { /* drivers/block/genhd.c */ extern void add_gendisk(struct gendisk *gp); extern void del_gendisk(struct gendisk *gp); +extern void unlink_gendisk(struct gendisk *gp); extern struct gendisk *get_gendisk(kdev_t dev); static inline unsigned long get_start_sect(struct block_device *bdev) { @@ -244,8 +245,8 @@ struct unixware_disklabel { char *disk_name (struct gendisk *hd, int part, char *buf); -extern void devfs_register_partitions (struct gendisk *dev, int unregister); -extern void driverfs_remove_partitions (struct gendisk *hd); +extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev); +extern void update_partition(struct gendisk *disk, int part); static inline unsigned int disk_index (kdev_t dev) { -- cgit v1.2.3 From 07586b3328bc910bf2cc4c25f7eb2dea7555a69c Mon Sep 17 00:00:00 2001 From: Alexander Viro Date: Sat, 7 Sep 2002 03:05:04 -0700 Subject: [PATCH] (23/25) move pointer to gendisk from hwif to drive ide switched from hwif->gd[i] to hwif->drive[i]->disk - IOW, instead of array of two pointers to gendisks refered from hwif, we keep these pointers in relevant drives. Cleaned up. --- drivers/ide/ide-cd.c | 23 +++++++++-------------- drivers/ide/ide-disk.c | 8 ++------ drivers/ide/ide-floppy.c | 8 ++------ drivers/ide/ide-probe.c | 2 +- drivers/ide/ide.c | 9 +++------ include/linux/ide.h | 2 +- 6 files changed, 18 insertions(+), 34 deletions(-) (limited to 'include') diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 216ec47a2b32..81ca240c6be5 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c @@ -2593,9 +2593,8 @@ static int ide_cdrom_register (ide_drive_t *drive, int nslots) { struct cdrom_info *info = drive->driver_data; struct cdrom_device_info *devinfo = &info->devinfo; - int minor = (drive->select.b.unit) << PARTN_BITS; - devinfo->dev = mk_kdev(HWIF(drive)->major, minor); + devinfo->dev = mk_kdev(drive->disk->major, drive->disk->first_minor); devinfo->ops = &ide_cdrom_dops; devinfo->mask = 0; *(int *)&devinfo->speed = CDROM_STATE_FLAGS (drive)->current_speed; @@ -2622,7 +2621,8 @@ static int ide_cdrom_register (ide_drive_t *drive, int nslots) devinfo->mask |= CDC_CLOSE_TRAY; devinfo->de = devfs_register(drive->de, "cd", DEVFS_FL_DEFAULT, - HWIF(drive)->major, minor, + drive->disk->major, + drive->disk->first_minor, S_IFBLK | S_IRUGO | S_IWUGO, ide_fops, NULL); @@ -2823,13 +2823,12 @@ int ide_cdrom_setup (ide_drive_t *drive) { struct cdrom_info *info = drive->driver_data; struct cdrom_device_info *cdi = &info->devinfo; - int minor = drive->select.b.unit << PARTN_BITS; int nslots; /* * default to read-only always and fix latter at the bottom */ - set_device_ro(mk_kdev(HWIF(drive)->major, minor), 1); + set_device_ro(mk_kdev(drive->disk->major, drive->disk->first_minor), 1); blk_queue_hardsect_size(&drive->queue, CD_FRAMESIZE); blk_queue_prep_rq(&drive->queue, ll_10byte_cmd_build); @@ -2951,7 +2950,7 @@ int ide_cdrom_setup (ide_drive_t *drive) nslots = ide_cdrom_probe_capabilities (drive); if (CDROM_CONFIG_FLAGS(drive)->dvd_ram) - set_device_ro(mk_kdev(HWIF(drive)->major, minor), 0); + set_device_ro(mk_kdev(drive->disk->major, drive->disk->first_minor), 0); if (ide_cdrom_register (drive, nslots)) { printk ("%s: ide_cdrom_setup failed to register device with the cdrom driver.\n", drive->name); @@ -2998,8 +2997,8 @@ void ide_cdrom_release (struct inode *inode, struct file *file, static int ide_cdrom_check_media_change (ide_drive_t *drive) { - return cdrom_media_changed(mk_kdev(HWIF (drive)->major, - (drive->select.b.unit) << PARTN_BITS)); + return cdrom_media_changed(mk_kdev(drive->disk->major, + drive->disk->first_minor)); } static @@ -3025,9 +3024,7 @@ int ide_cdrom_cleanup(ide_drive_t *drive) { struct cdrom_info *info = drive->driver_data; struct cdrom_device_info *devinfo = &info->devinfo; - ide_hwif_t *hwif = HWIF(drive); - int unit = drive - hwif->drives; - struct gendisk *g = hwif->gd[unit]; + struct gendisk *g = drive->disk; if (ide_unregister_subdriver (drive)) return 1; @@ -3092,9 +3089,7 @@ MODULE_DESCRIPTION("ATAPI CD-ROM Driver"); static int ide_cdrom_reinit (ide_drive_t *drive) { struct cdrom_info *info; - ide_hwif_t *hwif = HWIF(drive); - int unit = drive - hwif->drives; - struct gendisk *g = hwif->gd[unit]; + struct gendisk *g = drive->disk; struct request_sense sense; if (!strstr("ide-cdrom", drive->driver_req)) diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 144c0bb95155..e8040b7626f7 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c @@ -1618,9 +1618,7 @@ static void idedisk_setup (ide_drive_t *drive) static int idedisk_cleanup (ide_drive_t *drive) { - ide_hwif_t *hwif = HWIF(drive); - int unit = drive - hwif->drives; - struct gendisk *g = hwif->gd[unit]; + struct gendisk *g = drive->disk; if ((drive->id->cfs_enable_2 & 0x3000) && drive->wcache) if (do_idedisk_flushcache(drive)) printk (KERN_INFO "%s: Write Cache FAILED Flushing!\n", @@ -1672,9 +1670,7 @@ MODULE_DESCRIPTION("ATA DISK Driver"); static int idedisk_reinit(ide_drive_t *drive) { - ide_hwif_t *hwif = HWIF(drive); - int unit = drive - hwif->drives; - struct gendisk *g = hwif->gd[unit]; + struct gendisk *g = drive->disk; /* strstr("foo", "") is non-NULL */ if (!strstr("ide-disk", drive->driver_req)) diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index 5e2ca16310fa..c20115bc35f1 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c @@ -2112,9 +2112,7 @@ static void idefloppy_setup (ide_drive_t *drive, idefloppy_floppy_t *floppy) static int idefloppy_cleanup (ide_drive_t *drive) { idefloppy_floppy_t *floppy = drive->driver_data; - ide_hwif_t *hwif = HWIF(drive); - int unit = drive - hwif->drives; - struct gendisk *g = hwif->gd[unit]; + struct gendisk *g = drive->disk; if (ide_unregister_subdriver (drive)) return 1; @@ -2181,9 +2179,7 @@ static ide_driver_t idefloppy_driver = { static int idefloppy_reinit (ide_drive_t *drive) { idefloppy_floppy_t *floppy; - ide_hwif_t *hwif = HWIF(drive); - int unit = drive - hwif->drives; - struct gendisk *g = hwif->gd[unit]; + struct gendisk *g = drive->disk; if (!strstr("ide-floppy", drive->driver_req)) goto failed; if (!drive->present) diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 50e98a9e6066..47336c9d408e 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c @@ -848,7 +848,7 @@ static void init_gendisk (ide_hwif_t *hwif) gd[unit].major_name = names + 4*unit; gd[unit].minor_shift = PARTN_BITS; gd[unit].fops = ide_fops; - hwif->gd[unit] = gd + unit; + hwif->drives[unit].disk = gd + unit; } for (unit = 0; unit < units; ++unit) { diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 08950237c5d6..52472f955262 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c @@ -1748,10 +1748,7 @@ int ide_do_drive_cmd (ide_drive_t *drive, struct request *rq, ide_action_t actio void ide_revalidate_drive (ide_drive_t *drive) { - ide_hwif_t *hwif = HWIF(drive); - int unit = drive - hwif->drives; - struct gendisk *g = hwif->gd[unit]; - g->part[0].nr_sects = current_capacity(drive); + drive->disk->part[0].nr_sects = current_capacity(drive); } /* @@ -2058,13 +2055,13 @@ void ide_unregister (unsigned int index) blk_dev[hwif->major].data = NULL; blk_dev[hwif->major].queue = NULL; blk_clear(hwif->major); - gd = hwif->gd[0]; + gd = hwif->drives[0].disk; if (gd) { int i; kfree(gd->part); kfree(gd); for (i = 0; i < MAX_DRIVES; i++) - hwif->gd[i] = NULL; + hwif->drives[i].disk = NULL; } old_hwif = *hwif; init_hwif_data (index); /* restore hwif data to pristine status */ diff --git a/include/linux/ide.h b/include/linux/ide.h index aacdaad8f594..501b97902799 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h @@ -530,6 +530,7 @@ typedef struct ide_drive_s { unsigned int failures; /* current failure count */ unsigned int max_failures; /* maximum allowed failure count */ struct list_head list; + struct gendisk *disk; } ide_drive_t; /* @@ -716,7 +717,6 @@ typedef struct hwif_s { */ hw_regs_t hw; /* Hardware info */ ide_drive_t drives[MAX_DRIVES]; /* drive info */ - struct gendisk *gd[MAX_DRIVES];/* gendisk structure */ int addressing; /* hosts addressing */ void (*tuneproc)(ide_drive_t *, byte); /* routine to tune PIO mode for drives */ int (*speedproc)(ide_drive_t *, byte); /* routine to retune DMA modes for drives */ -- cgit v1.2.3 From 3708de94cf8d66e46d5ab7d712da81684ff99bf7 Mon Sep 17 00:00:00 2001 From: Alexander Viro Date: Sat, 7 Sep 2002 03:05:09 -0700 Subject: [PATCH] (24/25) disk capacity helpers new helpers - get_capacity(gendisk)/set_capacity(gendisk, sectors). Drivers switched to these; that eliminates most of the accesses to disk->part[]... in the drivers (and makes code more readable, while we are at it). That had caught several bugs when minor had been used in place of minor>>minor_shift (acsi.c is especially nasty in that respect; I don't know if it had ever been used with multiple devices...) --- drivers/acorn/block/mfmhd.c | 67 ++++++++++++++++++----------------------- drivers/block/DAC960.c | 7 ++--- drivers/block/acsi.c | 26 +++++++--------- drivers/block/cciss.c | 5 ++- drivers/block/cpqarray.c | 2 +- drivers/block/paride/pd.c | 6 ++-- drivers/block/ps2esdi.c | 14 +++++---- drivers/block/umem.c | 2 +- drivers/block/xd.c | 8 +++-- drivers/ide/hd.c | 18 +++++------ drivers/ide/ide-cd.c | 4 +-- drivers/ide/ide-floppy.c | 6 ++-- drivers/ide/ide-geometry.c | 2 +- drivers/ide/ide.c | 10 +++--- drivers/md/md.c | 4 +-- drivers/message/i2o/i2o_block.c | 24 +++++++-------- drivers/mtd/ftl.c | 6 ++-- drivers/mtd/nftlcore.c | 4 +-- drivers/scsi/sd.c | 8 ++--- drivers/scsi/sr.c | 6 ++-- fs/partitions/check.c | 6 ++-- include/linux/genhd.h | 8 +++++ 22 files changed, 119 insertions(+), 124 deletions(-) (limited to 'include') diff --git a/drivers/acorn/block/mfmhd.c b/drivers/acorn/block/mfmhd.c index 38f7dfc9e82e..8989984b9bda 100644 --- a/drivers/acorn/block/mfmhd.c +++ b/drivers/acorn/block/mfmhd.c @@ -882,6 +882,22 @@ static void mfm_rerequest(void) mfm_request(); } +static struct gendisk mfm_gendisk[2] = { +{ + .major = MAJOR_NR, + .first_minor = 0, + .major_name = "mfma", + .minor_shift = 6, + .part = mfm, +}, +{ + .major = MAJOR_NR, + .first_minor = 64, + .major_name = "mfmb", + .minor_shift = 6, + .part = mfm + 64, +}; + static void mfm_request(void) { DBG("mfm_request CURRENT=%p Busy=%d\n", CURRENT, Busy); @@ -895,7 +911,7 @@ static void mfm_request(void) Busy = 1; while (1) { - unsigned int dev, block, nsect; + unsigned int dev, block, nsect, unit; DBG("mfm_request: loop start\n"); sti(); @@ -912,26 +928,26 @@ static void mfm_request(void) DBG("mfm_request: before arg extraction\n"); dev = minor(CURRENT->rq_dev); + unit = dev>>6; block = CURRENT->sector; nsect = CURRENT->nr_sectors; #ifdef DEBUG - /*if ((dev>>6)==1) */ console_printf("mfm_request: raw vals: dev=%d (block=512 bytes) block=%d nblocks=%d\n", dev, block, nsect); + /*if (unit==1) */ console_printf("mfm_request: raw vals: dev=%d (block=512 bytes) block=%d nblocks=%d\n", dev, block, nsect); #endif - if (dev >= (mfm_drives << 6) || - block >= mfm[dev].nr_sects || ((block+nsect) > mfm[dev].nr_sects)) { - if (dev >= (mfm_drives << 6)) + if (unit >= mfm_drives || + block >= get_capacity(mfm_gendisk + unit) || + ((block+nsect) > get_capacity(mfm_gendisk + unit))) { + if (unit >= mfm_drives) printk("mfm: bad minor number: device=%s\n", kdevname(CURRENT->rq_dev)); else - printk("mfm%c: bad access: block=%d, count=%d, nr_sects=%ld\n", (dev >> 6)+'a', - block, nsect, mfm[dev].nr_sects); + printk("mfm%c: bad access: block=%d, count=%d, nr_sects=%ld\n", unit+'a', + block, nsect, get_capacity(mfm_gendisk+unit)); printk("mfm: continue 1\n"); end_request(CURRENT, 0); Busy = 0; continue; } - block += mfm[dev].start_sect; - /* DAG: Linux doesn't cope with this - even though it has an array telling it the hardware block size - silly */ block <<= 1; /* Now in 256 byte sectors */ @@ -1163,18 +1179,9 @@ static int mfm_initdrives(void) static int mfm_ioctl(struct inode *inode, struct file *file, u_int cmd, u_long arg) { struct hd_geometry *geo = (struct hd_geometry *) arg; - kdev_t dev; - int device, minor, err; - - if (!inode || !(dev = inode->i_rdev)) - return -EINVAL; - - minor = minor(dev); - - device = DEVICE_NR(minor(inode->i_rdev)), err; + int device = DEVICE_NR(minor(inode->i_rdev)); if (device >= mfm_drives) return -EINVAL; - if (cmd != HDIO_GETGEO) return -EINVAL; if (!arg) @@ -1185,7 +1192,8 @@ static int mfm_ioctl(struct inode *inode, struct file *file, u_int cmd, u_long a return -EFAULT; if (put_user (mfm_info[device].cylinders, &geo->cylinders)) return -EFAULT; - if (put_user (mfm[minor].start_sect, &geo->start)) + start = get_start_sect(inode->i_bdev); + if (put_user (get_start_sect(inode->i_bdev), &geo->start)) return -EFAULT; return 0; } @@ -1237,27 +1245,10 @@ void xd_set_geometry(struct block_device *bdev, unsigned char secsptrack, if (raw_cmd.dev == drive) mfm_specify (); mfm_geometry (drive); - mfm[drive << 6].start_sect = 0; - mfm[drive << 6].nr_sects = mfm_info[drive].cylinders * mfm_info[drive].heads * mfm_info[drive].sectors / 2; + set_capacity(&mfm_gendisk[drive], mfm_info[drive].cylinders * mfm_info[drive].heads * mfm_info[drive].sectors / 2); } } -static struct gendisk mfm_gendisk[2] = { -{ - .major = MAJOR_NR, - .first_minor = 0, - .major_name = "mfma", - .minor_shift = 6, - .part = mfm, -}, -{ - .major = MAJOR_NR, - .first_minor = 64, - .major_name = "mfmb", - .minor_shift = 6, - .part = mfm + 64, -}; - static struct block_device_operations mfm_fops = { .owner = THIS_MODULE, diff --git a/drivers/block/DAC960.c b/drivers/block/DAC960.c index 72d50aa7b8f2..58415a08c41b 100644 --- a/drivers/block/DAC960.c +++ b/drivers/block/DAC960.c @@ -2033,10 +2033,9 @@ static long disk_size(DAC960_Controller_T *Controller, int disk) static void DAC960_ComputeGenericDiskInfo(DAC960_Controller_T *Controller) { - struct gendisk *disks = Controller->disks; int disk; for (disk = 0; disk < DAC960_MaxLogicalDrives; disk++) - disks->part[0].nr_sects = disk_size(Controller, disk); + set_capacity(Controller->disks + disk, disk_size(Controller, disk)); } static int DAC960_revalidate(kdev_t dev) @@ -2044,7 +2043,7 @@ static int DAC960_revalidate(kdev_t dev) int ctlr = DAC960_ControllerNumber(dev); int disk = DAC960_LogicalDriveNumber(dev); DAC960_Controller_T *p = DAC960_Controllers[ctlr]; - p->disks[disk].part[0].nr_sects = disk_size(p, disk); + set_capacity(&p->disks[disk], disk_size(p, disk)); return 0; } @@ -5276,7 +5275,7 @@ static int DAC960_Open(Inode_T *Inode, File_T *File) DAC960_KernelDevice(Controller->ControllerNumber, LogicalDriveNumber, 0), DAC960_MaxPartitions, &DAC960_BlockDeviceOperations, size); } - if (Controller->disks[LogicalDriveNumber].part[0].nr_sects == 0) + if (!get_capacity(&Controller->disks[LogicalDriveNumber])) return -ENXIO; /* Increment Controller and Logical Drive Usage Counts. diff --git a/drivers/block/acsi.c b/drivers/block/acsi.c index e333d4d375c7..1197c8b3bb86 100644 --- a/drivers/block/acsi.c +++ b/drivers/block/acsi.c @@ -783,7 +783,7 @@ static void read_intr( void ) status = acsi_getstatus(); if (status != 0) { - int dev = minor(CURRENT->rq_dev); + int dev = DEVICE_NR(CURRENT->rq_dev); printk( KERN_ERR "ad%c: ", dev+'a' ); if (!acsi_reqsense( acsi_buffer, acsi_info[dev].target, acsi_info[dev].lun)) @@ -814,7 +814,7 @@ static void write_intr(void) status = acsi_getstatus(); if (status != 0) { - int dev = minor(CURRENT->rq_dev); + int dev = DEVICE_NR(CURRENT->rq_dev); printk( KERN_ERR "ad%c: ", dev+'a' ); if (!acsi_reqsense( acsi_buffer, acsi_info[dev].target, acsi_info[dev].lun)) @@ -973,15 +973,15 @@ static void redo_acsi_request( void ) panic(DEVICE_NAME ": block not locked"); } - dev = minor(CURRENT->rq_dev); + dev = DEVICE_NR(CURRENT->rq_dev); block = CURRENT->sector; if (dev >= NDevices || - block+CURRENT->nr_sectors >= acsi_part[dev].nr_sects) { + block+CURRENT->nr_sectors >= get_capacity(acsi_gendisk + dev)) { #ifdef DEBUG printk( "ad%c: attempted access for blocks %d...%ld past end of device at block %ld.\n", dev+'a', block, block + CURRENT->nr_sectors - 1, - acsi_part[dev].nr_sects); + get_capacity(acsi_gendisk + dev)); #endif end_request(CURRENT, 0); goto repeat; @@ -1088,11 +1088,7 @@ static void redo_acsi_request( void ) static int acsi_ioctl( struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg ) { - dev_t dev; - - if (!inode) - return -EINVAL; - dev = minor(inode->i_rdev); + int dev = DEVICE_NR(inode->i_rdev); if (dev >= NDevices) return -EINVAL; switch (cmd) { @@ -1140,7 +1136,7 @@ static int acsi_open( struct inode * inode, struct file * filp ) int device; struct acsi_info_struct *aip; - device = minor(inode->i_rdev); + device = DEVICE_NR(inode->i_rdev); if (device >= NDevices) return -ENXIO; aip = &acsi_info[device]; @@ -1176,7 +1172,7 @@ static int acsi_open( struct inode * inode, struct file * filp ) static int acsi_release( struct inode * inode, struct file * file ) { - int device = minor(inode->i_rdev); + int device = DEVICE_NR(inode->i_rdev); if (--access_count[device] == 0 && acsi_info[device].removable) acsi_prevent_removal(device, 0); return( 0 ); @@ -1204,7 +1200,7 @@ static void acsi_prevent_removal(int device, int flag) static int acsi_media_change (kdev_t dev) { - int device = minor(dev); + int device = DEVICE_NR(dev); struct acsi_info_struct *aip; aip = &acsi_info[device]; @@ -1807,7 +1803,7 @@ void cleanup_module(void) static int acsi_revalidate(kdev_t dev) { - int unit = DEVICE_NR(minor(dev)); + int unit = DEVICE_NR(dev); struct acsi_info_struct *aip = &acsi_info[unit]; stdma_lock( NULL, NULL ); if (acsi_devinit(aip) != DEV_SUPPORTED) { @@ -1821,6 +1817,6 @@ static int acsi_revalidate(kdev_t dev) ENABLE_IRQ(); stdma_release(); - acsi_part[minor(dev)].nr_sects = aip->size; + set_capacity(acsi_gendisk + unit, aip->size); return 0; } diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 73f5888010d2..969be47e8711 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c @@ -407,8 +407,7 @@ static int cciss_ioctl(struct inode *inode, struct file *filep, driver_geo.sectors = 0x3f; driver_geo.cylinders = hba[ctlr]->drv[dsk].nr_blocks / (0xff*0x3f); } - driver_geo.start= - hba[ctlr]->hd[minor(inode->i_rdev)].start_sect; + driver_geo.start= get_start_sect(inode->i_bdev); if (copy_to_user((void *) arg, &driver_geo, sizeof( struct hd_geometry))) return -EFAULT; @@ -705,7 +704,7 @@ static int cciss_revalidate(kdev_t dev) int ctlr = major(dev) - MAJOR_NR; int target = minor(dev) >> NWD_SHIFT; struct gendisk *disk = &hba[ctlr]->gendisk[target]; - disk->part[0].nr_sects = hba[ctlr]->drv[target].nr_blocks; + set_capacity(disk, hba[ctlr]->drv[target].nr_blocks); return 0; } diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c index 658f201efd0f..2d6ff7620e46 100644 --- a/drivers/block/cpqarray.c +++ b/drivers/block/cpqarray.c @@ -1497,7 +1497,7 @@ static int ida_revalidate(kdev_t dev) int ctlr = major(dev) - MAJOR_NR; int target = DEVICE_NR(dev); struct gendisk *gdev = &ida_gendisk[ctlr*NWD+target]; - gdev->part[minor(dev)].nr_sects = hba[ctlr]->drv[target].nr_blks; + set_capacity(gdev, hba[ctlr]->drv[target].nr_blks); return 0; } diff --git a/drivers/block/paride/pd.c b/drivers/block/paride/pd.c index b100a1faf6b8..bb9c23e6b364 100644 --- a/drivers/block/paride/pd.c +++ b/drivers/block/paride/pd.c @@ -438,9 +438,9 @@ static int pd_revalidate(kdev_t dev) if ((unit >= PD_UNITS) || !PD.present) return -ENODEV; if (pd_identify(unit)) - pd_hd[minor(dev)].nr_sects = PD.capacity; + set_capacity(&PD.gd, PD.capacity); else - pd_hd[minor(dev)].nr_sects = 0; + set_capacity(&PD.gd, 0); return 0; } @@ -727,7 +727,7 @@ repeat: pd_count = CURRENT->current_nr_sectors; if ((pd_dev >= PD_DEVS) || - ((pd_block+pd_count) > pd_hd[pd_dev].nr_sects)) { + ((pd_block+pd_count) > get_capacity(&pd[unit].gd))) { end_request(CURRENT, 0); goto repeat; } diff --git a/drivers/block/ps2esdi.c b/drivers/block/ps2esdi.c index 0882dd30d940..0afce2e2ab8f 100644 --- a/drivers/block/ps2esdi.c +++ b/drivers/block/ps2esdi.c @@ -487,6 +487,7 @@ static void __init ps2esdi_get_device_cfg(void) static void do_ps2esdi_request(request_queue_t * q) { u_int block, count; + int unit; /* since, this routine is called with interrupts cleared - they must be before it finishes */ @@ -503,18 +504,19 @@ static void do_ps2esdi_request(request_queue_t * q) if (blk_queue_empty(QUEUE)) return; + unit = DEVICE_NR(CURRENT->rq_dev); if (isa_virt_to_bus(CURRENT->buffer + CURRENT->current_nr_sectors * 512) > 16 * MB) { printk("%s: DMA above 16MB not supported\n", DEVICE_NAME); end_request(CURRENT, FAIL); } /* check for above 16Mb dmas */ - else if ((DEVICE_NR(CURRENT->rq_dev) < ps2esdi_drives) && + else if ((unit < ps2esdi_drives) && (CURRENT->sector + CURRENT->current_nr_sectors <= - ps2esdi[minor(CURRENT->rq_dev)].nr_sects) && + get_capacity(&ps2esdi_gendisk[unit])) && CURRENT->flags & REQ_CMD) { #if 0 printk("%s:got request. device : %d minor : %d command : %d sector : %ld count : %ld\n", DEVICE_NAME, - DEVICE_NR(CURRENT->rq_dev), minor(CURRENT->rq_dev), + unit, minor(CURRENT->rq_dev), CURRENT->cmd, CURRENT->sector, CURRENT->current_nr_sectors); #endif @@ -524,10 +526,10 @@ static void do_ps2esdi_request(request_queue_t * q) switch (rq_data_dir(CURRENT)) { case READ: - ps2esdi_readwrite(READ, DEVICE_NR(CURRENT->rq_dev), block, count); + ps2esdi_readwrite(READ, unit, block, count); break; case WRITE: - ps2esdi_readwrite(WRITE, DEVICE_NR(CURRENT->rq_dev), block, count); + ps2esdi_readwrite(WRITE, unit, block, count); break; default: printk("%s: Unknown command\n", DEVICE_NAME); @@ -538,7 +540,7 @@ static void do_ps2esdi_request(request_queue_t * q) /* is request is valid */ else { printk("Grrr. error. ps2esdi_drives: %d, %lu %lu\n", ps2esdi_drives, - CURRENT->sector, ps2esdi[minor(CURRENT->rq_dev)].nr_sects); + CURRENT->sector, get_capacity(&ps2esdi_gendisk[unit])); end_request(CURRENT, FAIL); } diff --git a/drivers/block/umem.c b/drivers/block/umem.c index c1c872a6e358..8e71ac89aa8c 100644 --- a/drivers/block/umem.c +++ b/drivers/block/umem.c @@ -812,7 +812,7 @@ static void del_battery_timer(void) static int mm_revalidate(kdev_t i_rdev) { int card_number = DEVICE_NR(i_rdev); - mm_partitions[minor(i_rdev)].nr_sects = cards[card_number].mm_size << 1; + set_capacity(mm_gendisk + card_number, cards[card_number].mm_size << 1); return 0; } /* diff --git a/drivers/block/xd.c b/drivers/block/xd.c index 7f30d2df7506..9d6bf0ada74d 100644 --- a/drivers/block/xd.c +++ b/drivers/block/xd.c @@ -279,15 +279,17 @@ static void do_xd_request (request_queue_t * q) return; while (1) { + int unit; code = 0; /* do some checking on the request structure */ if (blk_queue_empty(QUEUE)) return; - if (DEVICE_NR(CURRENT->rq_dev) < xd_drives + unit = DEVICE_NR(CURRENT->rq_dev); + if (unit < xd_drives && (CURRENT->flags & REQ_CMD) && CURRENT->sector + CURRENT->nr_sectors - <= xd_struct[minor(CURRENT->rq_dev)].nr_sects) { + <= get_capacity(xd_gendisk + unit)) { block = CURRENT->sector; count = CURRENT->nr_sectors; @@ -295,7 +297,7 @@ static void do_xd_request (request_queue_t * q) case READ: case WRITE: for (retry = 0; (retry < XD_RETRIES) && !code; retry++) - code = xd_readwrite(rq_data_dir(CURRENT),DEVICE_NR(CURRENT->rq_dev), + code = xd_readwrite(rq_data_dir(CURRENT),unit, CURRENT->buffer,block,count); break; default: diff --git a/drivers/ide/hd.c b/drivers/ide/hd.c index 534983a99346..1bf3df67d0dc 100644 --- a/drivers/ide/hd.c +++ b/drivers/ide/hd.c @@ -596,22 +596,21 @@ repeat: reset_hd(); return; } - dev = minor(CURRENT->rq_dev); + dev = DEVICE_NR(CURRENT->rq_dev); block = CURRENT->sector; nsect = CURRENT->nr_sectors; - if (dev >= (NR_HD<<6) || (dev & 0x3f) || - block >= hd[dev].nr_sects || ((block+nsect) > hd[dev].nr_sects)) { - if (dev >= (NR_HD<<6) || (dev & 0x3f)) + if (dev >= NR_HD || block >= get_capacity(hd_gendisk+dev) || + ((block+nsect) > get_capacity(hd_gendisk+unit))) { + if (dev >= NR_HD) printk("hd: bad minor number: device=%s\n", kdevname(CURRENT->rq_dev)); else printk("hd%c: bad access: block=%d, count=%d\n", - (minor(CURRENT->rq_dev)>>6)+'a', block, nsect); + dev+'a', block, nsect); end_request(CURRENT, 0); goto repeat; } - dev >>= 6; if (special_op[dev]) { if (do_special_op(dev)) goto repeat; @@ -819,10 +818,11 @@ static void __init hd_geninit(void) #endif for (drive=0 ; drive < NR_HD ; drive++) { - hd[drive<<6].nr_sects = hd_info[drive].head * + sector_t size = hd_info[drive].head * hd_info[drive].sect * hd_info[drive].cyl; - printk ("hd%c: %ldMB, CHS=%d/%d/%d\n", drive+'a', - hd[drive<<6].nr_sects / 2048, hd_info[drive].cyl, + set_capacity(hd_gendisk + drive, size); + printk ("%s: %ldMB, CHS=%d/%d/%d\n", hd_gendisk[drive].major_name, + size / 2048, hd_info[drive].cyl, hd_info[drive].head, hd_info[drive].sect); } if (!NR_HD) diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 81ca240c6be5..b293f3e92833 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c @@ -2138,7 +2138,7 @@ static int cdrom_read_toc(ide_drive_t *drive, struct request_sense *sense) if (stat) toc->capacity = 0x1fffff; - drive->part[0].nr_sects = toc->capacity * SECTORS_PER_FRAME; + set_capacity(drive->disk, toc->capacity * SECTORS_PER_FRAME); /* Remember that we've read this stuff. */ CDROM_STATE_FLAGS (drive)->toc_valid = 1; @@ -3148,7 +3148,7 @@ static int ide_cdrom_reinit (ide_drive_t *drive) add_gendisk(g); register_disk(g, mk_kdev(g->major,g->first_minor), 1<minor_shift, ide_fops, - g->part[0].nr_sects); + get_capacity(g)); return 0; failed: return 1; diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index c20115bc35f1..a2a25a29af58 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c @@ -1500,7 +1500,7 @@ static int idefloppy_get_capacity (ide_drive_t *drive) drive->bios_cyl = 0; drive->bios_head = drive->bios_sect = 0; floppy->blocks = floppy->bs_factor = 0; - drive->part[0].nr_sects = 0; + set_capacity(drive->disk, 0); idefloppy_create_read_capacity_cmd (&pc); if (idefloppy_queue_pc_tail (drive, &pc)) { @@ -1555,7 +1555,7 @@ static int idefloppy_get_capacity (ide_drive_t *drive) (void) idefloppy_get_flexible_disk_page (drive); } - drive->part[0].nr_sects = floppy->blocks * floppy->bs_factor; + set_capacity(drive->disk, floppy->blocks * floppy->bs_factor); return rc; } @@ -2213,7 +2213,7 @@ static int idefloppy_reinit (ide_drive_t *drive) add_gendisk(g); register_disk(g, mk_kdev(g->major,g->first_minor), 1<minor_shift, ide_fops, - g->part[0].nr_sects); + get_capacity(g)); return 0; failed: return 1; diff --git a/drivers/ide/ide-geometry.c b/drivers/ide/ide-geometry.c index 5f21651c1785..850419f2a0a7 100644 --- a/drivers/ide/ide-geometry.c +++ b/drivers/ide/ide-geometry.c @@ -214,7 +214,7 @@ int ide_xlate_1024 (kdev_t i_rdev, int xparm, int ptheads, const char *msg) ret = 1; } - drive->part[0].nr_sects = current_capacity(drive); + set_capacity(drive->disk, current_capacity(drive)); if (ret) printk("%s%s [%d/%d/%d]", msg, msg1, diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 52472f955262..c053036cc289 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c @@ -1661,7 +1661,7 @@ ide_drive_t *get_info_ptr (kdev_t i_rdev) if (unit < MAX_DRIVES) { ide_drive_t *drive = &hwif->drives[unit]; #if 0 - if ((drive->present) && (drive->part[minor].nr_sects)) + if (drive->present && get_capacity(drive->disk)) #else if (drive->present) #endif @@ -1748,7 +1748,7 @@ int ide_do_drive_cmd (ide_drive_t *drive, struct request *rq, ide_action_t actio void ide_revalidate_drive (ide_drive_t *drive) { - drive->disk->part[0].nr_sects = current_capacity(drive); + set_capacity(drive->disk, current_capacity(drive)); } /* @@ -1975,7 +1975,7 @@ void ide_unregister (unsigned int index) continue; minor = drive->select.b.unit << PARTN_BITS; for (p = 0; p < (1<part[p].nr_sects > 0) { + if (get_capacity(drive->disk)) { kdev_t devp = mk_kdev(hwif->major, minor+p); invalidate_device(devp, 0); } @@ -2523,7 +2523,7 @@ static int ide_ioctl (struct inode *inode, struct file *file, if (put_user(drive->bios_head, (byte *) &loc->heads)) return -EFAULT; if (put_user(drive->bios_sect, (byte *) &loc->sectors)) return -EFAULT; if (put_user(bios_cyl, (unsigned short *) &loc->cylinders)) return -EFAULT; - if (put_user((unsigned)drive->part[minor(inode->i_rdev)&PARTN_MASK].start_sect, + if (put_user((unsigned)get_start_sect(inode->i_bdev), (unsigned long *) &loc->start)) return -EFAULT; return 0; } @@ -2535,7 +2535,7 @@ static int ide_ioctl (struct inode *inode, struct file *file, if (put_user(drive->head, (byte *) &loc->heads)) return -EFAULT; if (put_user(drive->sect, (byte *) &loc->sectors)) return -EFAULT; if (put_user(drive->cyl, (unsigned int *) &loc->cylinders)) return -EFAULT; - if (put_user((unsigned)drive->part[minor(inode->i_rdev)&PARTN_MASK].start_sect, + if (put_user((unsigned)get_start_sect(inode->i_bdev), (unsigned long *) &loc->start)) return -EFAULT; return 0; } diff --git a/drivers/md/md.c b/drivers/md/md.c index e50bfe391c01..b903aa9d18e2 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -618,7 +618,7 @@ static void free_mddev(mddev_t *mddev) export_array(mddev); md_size[mdidx(mddev)] = 0; - md_hd_struct[mdidx(mddev)].nr_sects = 0; + set_capacity(disks[mdidx(mddev)], 0); } #undef BAD_CSUM @@ -2343,7 +2343,7 @@ static int md_ioctl(struct inode *inode, struct file *file, err = put_user (4, (char *) &loc->sectors); if (err) goto abort_unlock; - err = put_user (md_hd_struct[mdidx(mddev)].nr_sects/8, + err = put_user(get_capacity(disks[mdidx(mddev)])/8, (short *) &loc->cylinders); if (err) goto abort_unlock; diff --git a/drivers/message/i2o/i2o_block.c b/drivers/message/i2o/i2o_block.c index a8cdfb80a95a..3928e81ada4d 100644 --- a/drivers/message/i2o/i2o_block.c +++ b/drivers/message/i2o/i2o_block.c @@ -248,7 +248,7 @@ static u32 i2ob_get(struct i2ob_device *dev) * Turn a Linux block request into an I2O block read/write. */ -static int i2ob_send(u32 m, struct i2ob_device *dev, struct i2ob_request *ireq, u32 base, int unit) +static int i2ob_send(u32 m, struct i2ob_device *dev, struct i2ob_request *ireq, int unit) { struct i2o_controller *c = dev->controller; int tid = dev->tid; @@ -279,7 +279,7 @@ static int i2ob_send(u32 m, struct i2ob_device *dev, struct i2ob_request *ireq, /* This can be optimised later - just want to be sure its right for starters */ - offset = ((u64)(req->sector+base)) << 9; + offset = ((u64)req->sector) << 9; __raw_writel( offset & 0xFFFFFFFF, msg+24); __raw_writel(offset>>32, msg+28); mptr=msg+32; @@ -724,7 +724,7 @@ static int i2ob_evt(void *dummy) register_disk(p, mk_kdev(p->major, p->first_minor), 1<minor_shift, p->fops, - i2ob[unit].nr_sects); + get_capacity(p)); break; } @@ -768,7 +768,7 @@ static int i2ob_evt(void *dummy) i2ob_query_device(&i2ob_dev[unit], 0x0000, 4, &size, 8); spin_lock_irqsave(I2O_LOCK(unit), flags); - i2ob[unit].nr_sects = size>>9; + set_capacity(&i2o_disk[unit>>4], size>>9); spin_unlock_irqrestore(I2O_LOCK(unit), flags); break; } @@ -869,7 +869,7 @@ static int i2ob_backlog_request(struct i2o_controller *c, struct i2ob_device *de i2ob_backlog_tail[c->unit] = NULL; unit = minor(ireq->req->rq_dev); - i2ob_send(m, dev, ireq, i2ob[unit].start_sect, unit); + i2ob_send(m, dev, ireq, unit); } if(i2ob_backlog[c->unit]) return 1; @@ -969,7 +969,7 @@ static void i2ob_request(request_queue_t *q) i2ob_queues[dev->unit]->i2ob_qhead = ireq->next; ireq->req = req; - i2ob_send(m, dev, ireq, i2ob[unit].start_sect, (unit&0xF0)); + i2ob_send(m, dev, ireq, (unit&0xF0)); } } @@ -1038,7 +1038,7 @@ static int i2ob_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { struct hd_geometry g; - int u = minor(inode->i_rdev) & 0xF0; + int u = minor(inode->i_rdev) >> 4; /* Anyone capable of this syscall can do *real bad* things */ if (!capable(CAP_SYS_ADMIN)) @@ -1046,7 +1046,7 @@ static int i2ob_ioctl(struct inode *inode, struct file *file, if (cmd != HDIO_GETGEO) return -EINVAL; - i2o_block_biosparam(i2ob[u].nr_sects, + i2o_block_biosparam(get_capacity(&i2o_disk[u]), &g.cylinders, &g.heads, &g.sectors); g.start = get_start_sect(inode->i_bdev); return copy_to_user((void *)arg, &g, sizeof(g)) ? -EFAULT : 0; @@ -1222,7 +1222,7 @@ static int i2ob_install_device(struct i2o_controller *c, struct i2o_device *d, i i2ob_query_device(dev, 0x0000, 5, &flags, 4); i2ob_query_device(dev, 0x0000, 6, &status, 4); - i2ob[unit].nr_sects = size>>9; + set_capacity(&i2o_disk[unit>>4], size>>9); /* Set limit based on inbound frame size */ limit = (d->controller->status_block->inbound_frame_size - 8)/2; @@ -1326,7 +1326,7 @@ static int i2ob_install_device(struct i2o_controller *c, struct i2o_device *d, i i2o_event_register(c, d->lct_data.tid, i2ob_context, unit, (I2OB_EVENT_MASK & d->lct_data.event_capabilities)); - i2ob[unit].nr_sects = size>>9; + set_capacity(i2o_disk[unit>>4], size>>9); return 0; } @@ -1471,7 +1471,7 @@ static void i2ob_scan(int bios) register_disk(p, mk_kdev(p->major, p->first_minor), 1<minor_shift, p->fops, - i2ob[scan_unit].nr_sects); + get_capacity(p)); scan_unit+=16; i2ob_dev_count++; @@ -1564,7 +1564,7 @@ void i2ob_new_device(struct i2o_controller *c, struct i2o_device *d) register_disk(p, mk_kdev(p->major, p->first_minor), 1<minor_shift, p->fops, - i2ob[unit].nr_sects); + get_capacity(p)); i2ob_dev_count++; i2o_device_notify_on(d, &i2o_block_handler); } diff --git a/drivers/mtd/ftl.c b/drivers/mtd/ftl.c index 4d50cf22fc58..9b4758d19f12 100644 --- a/drivers/mtd/ftl.c +++ b/drivers/mtd/ftl.c @@ -846,7 +846,7 @@ static int ftl_open(struct inode *inode, struct file *file) if (partition->state != FTL_FORMATTED) return -ENXIO; - if (partition->disk->part[0].nr_sects == 0) + if (get_capacity(partition->disk) == 0) return -ENXIO; if (!get_mtd_device(partition->mtd, -1)) @@ -1132,8 +1132,8 @@ static int ftl_revalidate(kdev_t dev) int unit = minor(dev) >> 4; partition_t *part = myparts[unit]; scan_header(part); - part->disk->part[0].nr_sects = - le32_to_cpu(part->header.FormattedSize)/SECTOR_SIZE); + set_capacity(part->disk, + le32_to_cpu(part->header.FormattedSize)/SECTOR_SIZE)); return 0; } diff --git a/drivers/mtd/nftlcore.c b/drivers/mtd/nftlcore.c index 27cd8b48ca14..26be858d720b 100644 --- a/drivers/mtd/nftlcore.c +++ b/drivers/mtd/nftlcore.c @@ -846,10 +846,10 @@ void nftl_request(RQFUNC_ARG) down(&nftl->mutex); DEBUG(MTD_DEBUG_LEVEL3, "Got mutex\n"); - if (block + nsect > part_table[dev].nr_sects) { + if (block + nsect > get_capacity(nftl->disk)) { /* access past the end of device */ printk("nftl%c%d: bad access: block = %d, count = %d\n", - (minor(req->rq_dev)>>6)+'a', dev & 0xf, block, nsect); + unit+'a', dev & 0xf, block, nsect); up(&nftl->mutex); res = 0; /* fail */ goto repeat; diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 39112441f969..5bc2dd6e9517 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -286,6 +286,8 @@ static request_queue_t *sd_find_queue(kdev_t dev) return NULL; /* No such device */ } +static struct gendisk **sd_disks; + /** * sd_init_command - build a scsi (read or write) command from * information in the request structure. @@ -321,7 +323,7 @@ static int sd_init_command(Scsi_Cmnd * SCpnt) /* >>>>> this change is not in the lk 2.5 series */ if (part_nr >= (sd_template.dev_max << 4) || (part_nr & 0xf) || !sdp || !sdp->online || - block + SCpnt->request->nr_sectors > sd[part_nr].nr_sects) { + block + SCpnt->request->nr_sectors > get_capacity(sd_disks[dsk_nr])) { SCSI_LOG_HLQUEUE(2, printk("Finishing %ld sectors\n", SCpnt->request->nr_sectors)); SCSI_LOG_HLQUEUE(2, printk("Retry with 0x%p\n", SCpnt)); @@ -588,8 +590,6 @@ static struct block_device_operations sd_fops = revalidate: sd_revalidate }; -static struct gendisk **sd_disks; - /** * sd_rw_intr - bottom half handler: called when the lower level * driver has completed (successfully or otherwise) a scsi command. @@ -1374,7 +1374,7 @@ static int sd_revalidate(kdev_t dev) return -ENODEV; sd_init_onedisk(sdkp, dsk_nr); - sd_disks[dsk_nr]->part[0].nr_sects = sdkp->capacity; + set_capacity(sd_disks[dsk_nr], sdkp->capacity); return 0; } diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 2ced09b36ad5..e201e29df2dd 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c @@ -234,9 +234,9 @@ static void rw_intr(Scsi_Cmnd * SCpnt) * block. Therefore, if we hit a medium error within the last * 75 2K sectors, we decrease the saved size value. */ - if (error_sector < cd->disk->part[0].nr_sects && + if (error_sector < get_capacity(cd->disk) && cd->capacity - error_sector < 4 * 75) - cd->disk->part[0].nr_sects = error_sector; + set_capacity(cd->disk, error_sector); } /* @@ -555,7 +555,7 @@ static void get_sectorsize(Scsi_CD *cd) * what the device is capable of. */ cd->needs_sector_size = 0; - cd->disk->part[0].nr_sects = cd->capacity; + set_capacity(cd->disk, cd->capacity); } queue = &cd->device->request_queue; diff --git a/fs/partitions/check.c b/fs/partitions/check.c index 8927d25ef60d..67ce47f76946 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c @@ -338,13 +338,11 @@ void register_disk(struct gendisk *disk, kdev_t dev, unsigned minors, struct block_device_operations *ops, long size) { struct block_device *bdev; - struct hd_struct *p; if (!disk) return; - p = disk->part; - p[0].nr_sects = size; + set_capacity(disk, size); /* No minors to use for partitions */ if (!disk->minor_shift) @@ -410,7 +408,7 @@ int rescan_partitions(struct gendisk *disk, struct block_device *bdev) } if (bdev->bd_op->revalidate) bdev->bd_op->revalidate(dev); - if (disk->part[0].nr_sects) + if (get_capacity(disk)) check_partition(disk, bdev); for (p = 1; p < (1<minor_shift); p++) update_partition(disk, p); diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 6474393eff5e..0bd31339d6f5 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -95,6 +95,14 @@ static inline unsigned long get_start_sect(struct block_device *bdev) { return bdev->bd_offset; } +static inline sector_t get_capacity(struct gendisk *disk) +{ + return disk->part[0].nr_sects; +} +static inline void set_capacity(struct gendisk *disk, sector_t size) +{ + disk->part[0].nr_sects = size; +} #endif /* __KERNEL__ */ -- cgit v1.2.3 From e86a37861c8a0830d7410bf9ebe5ebaf5f6adc7f Mon Sep 17 00:00:00 2001 From: Alexander Viro Date: Sat, 7 Sep 2002 03:05:14 -0700 Subject: [PATCH] (25/25) more cleanups of struct gendisk. * we remove the paritition 0 from ->part[] and put the old contents of ->part[0] into gendisk itself; indexes are shifted, obviously. * ->part is allocated at add_gendisk() time and freed at del_gendisk() according to value of ->minor_shift; static arrays of hd_struct are gone from drivers, ditto for manual allocations a-la ide. As the matter of fact, none of the drivers know about struct hd_struct now. --- drivers/acorn/block/mfmhd.c | 4 -- drivers/block/DAC960.c | 1 - drivers/block/DAC960.h | 2 - drivers/block/acsi.c | 2 - drivers/block/blkpg.c | 14 +++--- drivers/block/cciss.c | 2 - drivers/block/cciss.h | 3 -- drivers/block/cpqarray.c | 10 +--- drivers/block/genhd.c | 26 ++++++++-- drivers/block/paride/pd.c | 3 -- drivers/block/ps2esdi.c | 3 -- drivers/block/umem.c | 4 -- drivers/block/xd.c | 4 -- drivers/ide/hd.c | 4 -- drivers/ide/ide-probe.c | 11 ---- drivers/ide/ide.c | 3 +- drivers/md/md.c | 9 +--- drivers/message/i2o/i2o_block.c | 2 - drivers/mtd/ftl.c | 3 -- drivers/mtd/nftlcore.c | 11 ---- drivers/s390/block/dasd_genhd.c | 2 - drivers/scsi/sd.c | 11 +--- drivers/scsi/sd.h | 2 - drivers/scsi/sr.c | 26 ++++------ fs/block_dev.c | 12 ++--- fs/partitions/check.c | 108 +++++++++++++++++++++++++++------------- include/linux/genhd.h | 11 ++-- include/linux/ide.h | 1 - include/linux/raid/md.h | 1 - 29 files changed, 127 insertions(+), 168 deletions(-) (limited to 'include') diff --git a/drivers/acorn/block/mfmhd.c b/drivers/acorn/block/mfmhd.c index 8989984b9bda..55df18f1a484 100644 --- a/drivers/acorn/block/mfmhd.c +++ b/drivers/acorn/block/mfmhd.c @@ -193,8 +193,6 @@ struct mfm_info { #define MFM_DRV_INFO mfm_info[raw_cmd.dev] -static struct hd_struct mfm[MFM_MAXDRIVES << 6]; - /* Stuff from the assembly routines */ extern unsigned int hdc63463_baseaddress; /* Controller base address */ extern unsigned int hdc63463_irqpolladdress; /* Address to read to test for int */ @@ -888,14 +886,12 @@ static struct gendisk mfm_gendisk[2] = { .first_minor = 0, .major_name = "mfma", .minor_shift = 6, - .part = mfm, }, { .major = MAJOR_NR, .first_minor = 64, .major_name = "mfmb", .minor_shift = 6, - .part = mfm + 64, }; static void mfm_request(void) diff --git a/drivers/block/DAC960.c b/drivers/block/DAC960.c index 58415a08c41b..989f13e46e8f 100644 --- a/drivers/block/DAC960.c +++ b/drivers/block/DAC960.c @@ -1968,7 +1968,6 @@ static boolean DAC960_RegisterBlockDevice(DAC960_Controller_T *Controller) struct gendisk *disk = &Controller->disks[n]; memset(disk, 0, sizeof(struct gendisk)); sprintf(names + 9 * n, "rd/c%dd%d", Controller->ControllerNumber, n); - disk->part = Controller->DiskPartitions + (n<major = MajorNumber; disk->first_minor = n << DAC960_MaxPartitionsBits; disk->major_name = names + 9 * n; diff --git a/drivers/block/DAC960.h b/drivers/block/DAC960.h index 53b4bcb47d5a..33b2822520e3 100644 --- a/drivers/block/DAC960.h +++ b/drivers/block/DAC960.h @@ -2196,7 +2196,6 @@ typedef struct file File_T; typedef struct block_device_operations BlockDeviceOperations_T; typedef struct completion Completion_T; typedef struct hd_geometry DiskGeometry_T; -typedef struct hd_struct DiskPartition_T; typedef struct inode Inode_T; typedef struct inode_operations InodeOperations_T; typedef kdev_t KernelDevice_T; @@ -2472,7 +2471,6 @@ typedef struct DAC960_Controller boolean LogicalDriveFoundDuringScan[DAC960_MaxLogicalDrives]; } V2; } FW; - DiskPartition_T DiskPartitions[DAC960_MinorCount]; unsigned char ProgressBuffer[DAC960_ProgressBufferSize]; unsigned char UserStatusBuffer[DAC960_UserMessageSize]; } diff --git a/drivers/block/acsi.c b/drivers/block/acsi.c index 1197c8b3bb86..3313f7cb0a3c 100644 --- a/drivers/block/acsi.c +++ b/drivers/block/acsi.c @@ -245,7 +245,6 @@ char *acsi_buffer; unsigned long phys_acsi_buffer; static int NDevices; -static struct hd_struct acsi_part[MAX_DEV<<4]; static char acsi_names[MAX_DEV*4]; static int access_count[MAX_DEV]; @@ -1698,7 +1697,6 @@ static void acsi_geninit(void) disk->first_minor = i << 4; disk->major_name = acsi_names + 4*i; disk->minor_shift = (acsi_info[i].type==HARDDISK)?4:0; - disk->part = acsi_part + (i<<4); disk->fops = &acsi_fops; add_gendisk(disk); register_disk(disk, mk_kdev(disk->major, disk->first_minor), diff --git a/drivers/block/blkpg.c b/drivers/block/blkpg.c index 9fbfaafbea25..941d1051d894 100644 --- a/drivers/block/blkpg.c +++ b/drivers/block/blkpg.c @@ -95,18 +95,18 @@ int add_partition(struct block_device *bdev, struct blkpg_partition *p) return -EINVAL; /* partition number in use? */ - if (g->part[p->pno].nr_sects != 0) + if (g->part[p->pno - 1].nr_sects != 0) return -EBUSY; /* overlap? */ - for (i = 1; i < (1<minor_shift); i++) + for (i = 0; i < (1<minor_shift) - 1; i++) if (!(pstart+plength <= g->part[i].start_sect || pstart >= g->part[i].start_sect + g->part[i].nr_sects)) return -EBUSY; /* all seems OK */ - g->part[p->pno].start_sect = pstart; - g->part[p->pno].nr_sects = plength; + g->part[p->pno - 1].start_sect = pstart; + g->part[p->pno - 1].nr_sects = plength; update_partition(g, p->pno); return 0; } @@ -138,7 +138,7 @@ int del_partition(struct block_device *bdev, struct blkpg_partition *p) return -EINVAL; /* existing drive and partition? */ - if (g->part[p->pno].nr_sects == 0) + if (g->part[p->pno - 1].nr_sects == 0) return -ENXIO; /* partition in use? Incomplete check for now. */ @@ -154,8 +154,8 @@ int del_partition(struct block_device *bdev, struct blkpg_partition *p) fsync_bdev(bdevp); invalidate_bdev(bdevp, 0); - g->part[p->pno].start_sect = 0; - g->part[p->pno].nr_sects = 0; + g->part[p->pno - 1].start_sect = 0; + g->part[p->pno - 1].nr_sects = 0; update_partition(g, p->pno); bd_release(bdevp); bdput(bdevp); diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 969be47e8711..0b8fb9a5c7a5 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c @@ -750,7 +750,6 @@ static int revalidate_allvol(kdev_t dev) * Set the partition and block size structures for all volumes * on this controller to zero. We will reread all of this data */ - memset(hba[ctlr]->hd, 0, sizeof(struct hd_struct) * 256); memset(hba[ctlr]->drv, 0, sizeof(drive_info_struct) * CISS_MAX_LUN); /* @@ -2445,7 +2444,6 @@ static int __init cciss_init_one(struct pci_dev *pdev, disk->first_minor = j << NWD_SHIFT; disk->major_name = NULL; disk->minor_shift = NWD_SHIFT; - disk->part = hba[i]->hd + (j << NWD_SHIFT); if( !(drv->nr_blocks)) continue; (BLK_DEFAULT_QUEUE(MAJOR_NR + i))->hardsect_size = drv->block_size; diff --git a/drivers/block/cciss.h b/drivers/block/cciss.h index 7192717a23fe..1baed4acef84 100644 --- a/drivers/block/cciss.h +++ b/drivers/block/cciss.h @@ -83,9 +83,6 @@ struct ctlr_info // Disk structures we need to pass back struct gendisk gendisk[NWD]; char names[12 * NWD]; - // indexed by minor numbers - struct hd_struct hd[256]; - int sizes[256]; #ifdef CONFIG_CISS_SCSI_TAPE void *scsi_ctlr; /* ptr to structure containing scsi related stuff */ #endif diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c index 2d6ff7620e46..aec445236fa0 100644 --- a/drivers/block/cpqarray.c +++ b/drivers/block/cpqarray.c @@ -102,7 +102,6 @@ static struct board_type products[] = { { 0x40580E11, "Smart Array 431", &smart4_access }, }; -static struct hd_struct * ida; static char *ida_names; static struct gendisk ida_gendisk[MAX_CTLR * NWD]; @@ -320,7 +319,6 @@ void cleanup_module(void) } devfs_find_and_unregister(NULL, "ida", 0, 0, 0, 0); remove_proc_entry("cpqarray", proc_root_driver); - kfree(ida); kfree(ida_names); } #endif /* MODULE */ @@ -346,15 +344,12 @@ int __init cpqarray_init(void) printk("Found %d controller(s)\n", nr_ctlr); /* allocate space for disk structs */ - ida = kmalloc(sizeof(struct hd_struct)*nr_ctlr*NWD*16, GFP_KERNEL); ida_names = kmalloc(nr_ctlr*NWD*10, GFP_KERNEL); - if (!ida || !ida_names) { + if (!ida_names) { printk( KERN_ERR "cpqarray: out of memory"); - kfree(ida); kfree(ida_names); return(num_cntlrs_reg); } - memset(ida, 0, sizeof(struct hd_struct)*nr_ctlr*NWD*16); /* * register block devices * Find disks and fill in structs @@ -407,7 +402,6 @@ int __init cpqarray_init(void) if (num_cntlrs_reg == 0) { - kfree(ida); kfree(ida_names); } return(num_cntlrs_reg); @@ -449,7 +443,6 @@ int __init cpqarray_init(void) disk->major = MAJOR_NR + i; disk->first_minor = j<minor_shift = NWD_SHIFT; - disk->part = ida + i*256 + (j<flags = GENHD_FL_DEVFS; disk->fops = &ida_fops; if (!drv->nr_blks) @@ -1462,7 +1455,6 @@ static int revalidate_allvol(kdev_t dev) del_gendisk(disk); disk->major_name = NULL; } - memset(ida+(ctlr*256), 0, sizeof(struct hd_struct)*NWD*16); memset(hba[ctlr]->drv, 0, sizeof(drv_info_t)*NWD); /* diff --git a/drivers/block/genhd.c b/drivers/block/genhd.c index 589ae73d7366..51b77476e95f 100644 --- a/drivers/block/genhd.c +++ b/drivers/block/genhd.c @@ -23,6 +23,7 @@ #include #include #include +#include static rwlock_t gendisk_lock; @@ -43,6 +44,19 @@ void add_gendisk(struct gendisk *gp) { struct gendisk *sgp; + struct hd_struct *p = NULL; + + if (gp->minor_shift) { + size_t size = sizeof(struct hd_struct)*((1<minor_shift)-1); + p = kmalloc(size, GFP_KERNEL); + if (!p) { + printk(KERN_ERR "out of memory; no partitions for %s\n", + gp->major_name); + gp->minor_shift = 0; + } else + memset(p, 0, size); + } + gp->part = p; write_lock(&gendisk_lock); @@ -148,13 +162,17 @@ static int show_partition(struct seq_file *part, void *v) seq_puts(part, "major minor #blocks name\n\n"); /* show the full disk and all non-0 size partitions of it */ - for (n = 0; n < 1<minor_shift; n++) { - if (n && sgp->part[n].nr_sects == 0) + seq_printf(part, "%4d %4d %10ld %s\n", + sgp->major, sgp->first_minor, + get_capacity(sgp) >> 1, + disk_name(sgp, 0, buf)); + for (n = 0; n < (1<minor_shift) - 1; n++) { + if (sgp->part[n].nr_sects == 0) continue; seq_printf(part, "%4d %4d %10ld %s\n", - sgp->major, n + sgp->first_minor, + sgp->major, n + 1 + sgp->first_minor, sgp->part[n].nr_sects >> 1 , - disk_name(sgp, n, buf)); + disk_name(sgp, n + 1, buf)); } return 0; diff --git a/drivers/block/paride/pd.c b/drivers/block/paride/pd.c index bb9c23e6b364..66e3300028a2 100644 --- a/drivers/block/paride/pd.c +++ b/drivers/block/paride/pd.c @@ -271,8 +271,6 @@ static void pd_doorlock(int unit, int func); static int pd_check_media(kdev_t dev); static void pd_eject( int unit); -static struct hd_struct pd_hd[PD_DEVS]; - #define PD_NAMELEN 8 struct pd_unit { @@ -689,7 +687,6 @@ static int pd_detect( void ) PD.gd.fops = &pd_fops; PD.gd.major = major; PD.gd.first_minor = unit << PD_BITS; - PD.gd.part = pd_hd + (unit << PD_BITS); add_gendisk(&PD.gd); register_disk(&PD.gd,mk_kdev(MAJOR_NR,unit<part = mm_partitions + (i << MM_SHIFT); disk->major = major_nr; disk->first_minor = i << MM_SHIFT; disk->major_name = mm_names + i*6; diff --git a/drivers/block/xd.c b/drivers/block/xd.c index 9d6bf0ada74d..97ec536e4756 100644 --- a/drivers/block/xd.c +++ b/drivers/block/xd.c @@ -121,8 +121,6 @@ static unsigned int xd_bases[] __initdata = 0xE0000 }; -static struct hd_struct xd_struct[XD_MAXDRIVES << 6]; - static spinlock_t xd_lock = SPIN_LOCK_UNLOCKED; extern struct block_device_operations xd_fops; @@ -133,14 +131,12 @@ static struct gendisk xd_gendisk[2] = { .first_minor = 0, .major_name = "xda", .minor_shift = 6, - .part = xd_struct, .fops = &xd_fops, },{ .major = MAJOR_NR, .first_minor = 64, .major_name = "xdb", .minor_shift = 6, - .part = xd_struct + 64, .fops = &xd_fops, } }; diff --git a/drivers/ide/hd.c b/drivers/ide/hd.c index 1bf3df67d0dc..714e27ff87b1 100644 --- a/drivers/ide/hd.c +++ b/drivers/ide/hd.c @@ -145,8 +145,6 @@ static struct hd_i_struct hd_info[MAX_HD]; static int NR_HD; #endif -static struct hd_struct hd[MAX_HD<<6]; - static struct timer_list device_timer; #define TIMEOUT_VALUE (6*HZ) @@ -706,14 +704,12 @@ static struct gendisk hd_gendisk[2] = { .first_minor = 0, .major_name = "hda", .minor_shift = 6, - .part = hd, .fops = &hd_fops, },{ .major = MAJOR_NR, .first_minor = 64, .major_name = "hdb", .minor_shift = 6, - .part = hd + 64, .fops = &hd_fops, } }; diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 47336c9d408e..f56203db719a 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c @@ -807,7 +807,6 @@ static int init_irq (ide_hwif_t *hwif) static void init_gendisk (ide_hwif_t *hwif) { struct gendisk *gd; - struct hd_struct *part; unsigned int unit, units, minors; extern devfs_handle_t ide_devfs_handle; char *names; @@ -828,20 +827,12 @@ static void init_gendisk (ide_hwif_t *hwif) goto err_kmalloc_gd; memset(gd, 0, MAX_DRIVES * sizeof(struct gendisk)); - part = kmalloc(minors * sizeof(struct hd_struct), GFP_KERNEL); - if (!part) - goto err_kmalloc_gd_part; - - memset(part, 0, minors * sizeof(struct hd_struct)); - names = kmalloc (4 * MAX_DRIVES, GFP_KERNEL); if (!names) goto err_kmalloc_gd_names; memset(names, 0, 4 * MAX_DRIVES); for (unit = 0; unit < units; ++unit) { - gd[unit].part = part + (unit << PARTN_BITS); - hwif->drives[unit].part = gd[unit].part; gd[unit].major = hwif->major; gd[unit].first_minor = unit << PARTN_BITS; sprintf(names + 4*unit, "hd%c",'a'+hwif->index*MAX_DRIVES+unit); @@ -877,8 +868,6 @@ static void init_gendisk (ide_hwif_t *hwif) return; err_kmalloc_gd_names: - kfree(part); -err_kmalloc_gd_part: kfree(gd); err_kmalloc_gd: printk(KERN_WARNING "(ide::init_gendisk) Out of memory\n"); diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index c053036cc289..8d37e3b3662f 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c @@ -2058,10 +2058,9 @@ void ide_unregister (unsigned int index) gd = hwif->drives[0].disk; if (gd) { int i; - kfree(gd->part); - kfree(gd); for (i = 0; i < MAX_DRIVES; i++) hwif->drives[i].disk = NULL; + kfree(gd); } old_hwif = *hwif; init_hwif_data (index); /* restore hwif data to pristine status */ diff --git a/drivers/md/md.c b/drivers/md/md.c index b903aa9d18e2..2df1961eb468 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -103,11 +103,6 @@ static ctl_table raid_root_table[] = { {0} }; -/* - * these have to be allocated separately because external - * subsystems want to have a pre-defined structure - */ -struct hd_struct md_hd_struct[MAX_MD_DEVS]; static void md_recover_arrays(void); static mdk_thread_t *md_recovery_thread; @@ -1458,7 +1453,6 @@ static int do_md_run(mddev_t * mddev) disk->minor_shift = 0; sprintf(major_name, "md%d", mdidx(mddev)); disk->major_name = major_name; - disk->part = md_hd_struct + mdidx(mddev); disk->fops = &md_fops; mddev->pers = pers[pnum]; @@ -3178,11 +3172,10 @@ int __init md_init(void) return (-1); } devfs_handle = devfs_mk_dir (NULL, "md", NULL); - /* we don't use devfs_register_series because we want to fill md_hd_struct */ for (minor=0; minor < MAX_MD_DEVS; ++minor) { char devname[128]; sprintf (devname, "%u", minor); - md_hd_struct[minor].de = devfs_register (devfs_handle, + devfs_register (devfs_handle, devname, DEVFS_FL_DEFAULT, MAJOR_NR, minor, S_IFBLK | S_IRUSR | S_IWUSR, &md_fops, NULL); } diff --git a/drivers/message/i2o/i2o_block.c b/drivers/message/i2o/i2o_block.c index 3928e81ada4d..ae7befdf574b 100644 --- a/drivers/message/i2o/i2o_block.c +++ b/drivers/message/i2o/i2o_block.c @@ -186,7 +186,6 @@ static struct i2ob_request *i2ob_backlog_tail[MAX_I2O_CONTROLLERS]; static struct i2ob_device i2ob_dev[MAX_I2OB<<4]; static int i2ob_dev_count = 0; -static struct hd_struct i2ob[MAX_I2OB<<4]; static struct gendisk i2o_disk[MAX_I2OB]; static char i2o_names[MAX_I2OB * 8]; @@ -1771,7 +1770,6 @@ int i2o_block_init(void) disk->major = MAJOR_NR; disk->first_minor = i<<4; disk->minor_shift = 4; - disk->part = i2ob + (i<<4); disk->fops = &i2ob_fops; disk->major_name = i2o_names + i*8; sprintf(disk->major_name, "i2o/hd%c", 'a' + i); diff --git a/drivers/mtd/ftl.c b/drivers/mtd/ftl.c index 9b4758d19f12..4ddc0d9337ec 100644 --- a/drivers/mtd/ftl.c +++ b/drivers/mtd/ftl.c @@ -175,8 +175,6 @@ static struct mtd_notifier ftl_notifier = { #define XFER_PREPARED 0x03 #define XFER_FAILED 0x04 -static struct hd_struct ftl_hd[MINOR_NR(MAX_DEV, 0, 0)]; - /*====================================================================*/ static int ftl_ioctl(struct inode *inode, struct file *file, @@ -1252,7 +1250,6 @@ static void ftl_notify_add(struct mtd_info *mtd) disk->first_minor = device << 4; disk->major_name = name; disk->minor_shift = PART_BITS; - disk->part = ftl_hd + (device << 4); disk->fops = &ftl_blk_fops; partition->mtd = mtd; partition->disk = disk; diff --git a/drivers/mtd/nftlcore.c b/drivers/mtd/nftlcore.c index 26be858d720b..c6fa25aeabf6 100644 --- a/drivers/mtd/nftlcore.c +++ b/drivers/mtd/nftlcore.c @@ -49,16 +49,6 @@ /* Linux-specific block device functions */ -/* I _HATE_ the Linux block device setup more than anything else I've ever - * encountered, except ... - */ - -/* .. for the Linux partition table handling. */ -/* So why didn't you fucking go and clean it up? -- AV */ -struct hd_struct part_table[256]; - -static struct block_device_operations nftl_fops; - struct NFTLrecord *NFTLs[MAX_NFTLS]; static void NFTL_setup(struct mtd_info *mtd) @@ -150,7 +140,6 @@ static void NFTL_setup(struct mtd_info *mtd) gd->major = MAJOR_NR; gd->first_minor = firstfree << NFTL_PARTN_BITS; gd->minor_shift = NFTL_PARTN_BITS; - gd->part = part_table + (firstfree << NFTL_PARTN_BITS); gd->major_name = name; nftl->disk = gd; add_gendisk(gd); diff --git a/drivers/s390/block/dasd_genhd.c b/drivers/s390/block/dasd_genhd.c index 700285728e59..6df129445724 100644 --- a/drivers/s390/block/dasd_genhd.c +++ b/drivers/s390/block/dasd_genhd.c @@ -35,7 +35,6 @@ struct major_info { int major; struct gendisk disks[DASD_PER_MAJOR]; char names[DASD_PER_MAJOR * 8]; - struct hd_struct part[1<minor_shift = DASD_PARTN_BITS; disk->fops = &dasd_device_operations; disk->flags = GENHD_FL_DEVFS; - disk->part = mi->part + (i << DASD_PARTN_BITS); } /* Setup block device pointers for the new major. */ diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index 5bc2dd6e9517..356952ba39e9 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -84,9 +84,6 @@ #define SD_DSK_ARR_LUMP 6 /* amount to over allocate sd_dsk_arr by */ - -struct hd_struct *sd; - static Scsi_Disk ** sd_dsk_arr; static rwlock_t sd_dsk_arr_lock = RW_LOCK_UNLOCKED; @@ -1195,12 +1192,10 @@ static int sd_init() init_mem_lth(sd_disks, sd_template.dev_max); if (sd_disks) zero_mem_lth(sd_disks, sd_template.dev_max); - init_mem_lth(sd, maxparts); - if (!sd_dsk_arr || !sd || !sd_disks) + if (!sd_dsk_arr || !sd_disks) goto cleanup_mem; - zero_mem_lth(sd, maxparts); return 0; #undef init_mem_lth @@ -1209,8 +1204,6 @@ static int sd_init() cleanup_mem: vfree(sd_disks); sd_disks = NULL; - vfree(sd); - sd = NULL; if (sd_dsk_arr) { for (k = 0; k < sd_template.dev_max; ++k) vfree(sd_dsk_arr[k]); @@ -1347,7 +1340,6 @@ static int sd_attach(Scsi_Device * sdp) gd->major = SD_MAJOR(dsk_nr>>4); gd->first_minor = (dsk_nr & 15)<<4; gd->minor_shift = 4; - gd->part = sd + (dsk_nr << 4); gd->fops = &sd_fops; if (dsk_nr > 26) sprintf(p->name, "sd%c%c", 'a'+dsk_nr/26-1, 'a'+dsk_nr%26); @@ -1465,7 +1457,6 @@ static void __exit exit_sd(void) vfree(sd_dsk_arr[k]); vfree(sd_dsk_arr); } - vfree((char *) sd); for (k = 0; k < N_USED_SD_MAJORS; k++) { blk_dev[SD_MAJOR(k)].queue = NULL; blk_clear(SD_MAJOR(k)); diff --git a/drivers/scsi/sd.h b/drivers/scsi/sd.h index e3eb4be41a26..5ba16cfec18c 100644 --- a/drivers/scsi/sd.h +++ b/drivers/scsi/sd.h @@ -20,8 +20,6 @@ #include #endif -extern struct hd_struct *sd; - typedef struct scsi_disk { unsigned capacity; /* size in 512-byte sectors */ Scsi_Device *device; diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index e201e29df2dd..4e68f16b14e7 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c @@ -744,31 +744,25 @@ void sr_finish() for (i = 0; i < sr_template.nr_dev; ++i) { struct gendisk *disk; - /* KLUDGE - will go away */ - struct { - struct gendisk disk; - struct hd_struct part; - } *p; Scsi_CD *cd = &scsi_CDs[i]; /* If we have already seen this, then skip it. Comes up * with loadable modules. */ if (cd->disk) continue; - p = kmalloc(sizeof(*p), GFP_KERNEL); - if (!p) + disk = kmalloc(sizeof(struct gendisk), GFP_KERNEL); + if (!disk) continue; if (cd->disk) { - kfree(p); + kfree(disk); continue; } - memset(p, 0, sizeof(*p)); - p->disk.part = &p->part; - p->disk.major = MAJOR_NR; - p->disk.first_minor = i; - p->disk.major_name = cd->cdi.name; - p->disk.minor_shift = 0; - p->disk.fops = &sr_bdops; - cd->disk = disk = &p->disk; + memset(disk, 0, sizeof(struct gendisk)); + disk->major = MAJOR_NR; + disk->first_minor = i; + disk->minor_shift = 0; + disk->major_name = cd->cdi.name; + disk->fops = &sr_bdops; + cd->disk = disk; cd->capacity = 0x1fffff; cd->device->sector_size = 2048;/* A guess, just in case */ cd->needs_sector_size = 1; diff --git a/fs/block_dev.c b/fs/block_dev.c index 30e46a931b2f..b4cdee9bf538 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -503,7 +503,6 @@ int check_disk_change(struct block_device *bdev) struct block_device_operations * bdops = bdev->bd_op; kdev_t dev = to_kdev_t(bdev->bd_dev); struct gendisk *disk; - struct hd_struct *part; if (bdops->check_media_change == NULL) return 0; @@ -517,7 +516,6 @@ int check_disk_change(struct block_device *bdev) printk("VFS: busy inodes on changed media.\n"); disk = get_gendisk(dev); - part = disk->part + minor(dev) - disk->first_minor; if (bdops->revalidate) bdops->revalidate(dev); if (disk && disk->minor_shift) @@ -632,11 +630,9 @@ static int do_open(struct block_device *bdev, struct inode *inode, struct file * sector_t sect = 0; bdev->bd_offset = 0; - if (g) { - struct hd_struct *p; - p = g->part + minor(dev) - g->first_minor; - sect = p->nr_sects; - } else if (blk_size[major(dev)]) + if (g) + sect = get_capacity(g); + else if (blk_size[major(dev)]) sect = blk_size[major(dev)][minor(dev)] << 1; bd_set_size(bdev, (loff_t)sect << 9); bdi = blk_get_backing_dev_info(bdev); @@ -653,7 +649,7 @@ static int do_open(struct block_device *bdev, struct inode *inode, struct file * if (!bdev->bd_openers) { struct gendisk *g = get_gendisk(dev); struct hd_struct *p; - p = g->part + minor(dev) - g->first_minor; + p = g->part + minor(dev) - g->first_minor - 1; inode->i_data.backing_dev_info = bdev->bd_inode->i_data.backing_dev_info = bdev->bd_contains->bd_inode->i_data.backing_dev_info; diff --git a/fs/partitions/check.c b/fs/partitions/check.c index 67ce47f76946..75f096ff1e9a 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c @@ -89,19 +89,25 @@ static int (*check_part[])(struct parsed_partitions *, struct block_device *) = char *disk_name(struct gendisk *hd, int part, char *buf) { - if (part < 1<minor_shift && hd->part[part].de) { - int pos; - - pos = devfs_generate_path(hd->part[part].de, buf, 64); - if (pos >= 0) - return buf + pos; - } - if (!part) + int pos; + if (!part) { + if (hd->disk_de) { + pos = devfs_generate_path(hd->disk_de, buf, 64); + if (pos >= 0) + return buf + pos; + } sprintf(buf, "%s", hd->major_name); - else if (isdigit(hd->major_name[strlen(hd->major_name)-1])) - sprintf(buf, "%sp%d", hd->major_name, part); - else - sprintf(buf, "%s%d", hd->major_name, part); + } else { + if (hd->part[part-1].de) { + pos = devfs_generate_path(hd->part[part-1].de, buf, 64); + if (pos >= 0) + return buf + pos; + } + if (isdigit(hd->major_name[strlen(hd->major_name)-1])) + sprintf(buf, "%sp%d", hd->major_name, part); + else + sprintf(buf, "%s%d", hd->major_name, part); + } return buf; } @@ -144,21 +150,29 @@ static void driverfs_create_partitions(struct gendisk *hd) *name = *bus_id = '\0'; } - dev = &p[0].hd_driverfs_dev; + dev = &hd->disk_dev; dev->driver_data = (void *)(long)__mkdev(hd->major, hd->first_minor); sprintf(dev->name, "%sdisc", name); sprintf(dev->bus_id, "%sdisc", bus_id); for (part=1; part < max_p; part++) { - dev = &p[part].hd_driverfs_dev; + dev = &p[part-1].hd_driverfs_dev; sprintf(dev->name, "%spart%d", name, part); sprintf(dev->bus_id, "%s:p%d", bus_id, part); - if (!p[part].nr_sects) + if (!p[part-1].nr_sects) continue; dev->driver_data = (void *)(long)__mkdev(hd->major, hd->first_minor+part); } - for (part=0; part < max_p; part++) { + dev = &hd->disk_dev; + dev->parent = parent; + if (parent) + dev->bus = parent->bus; + device_register(dev); + device_create_file(dev, &dev_attr_type); + device_create_file(dev, &dev_attr_kdev); + + for (part=0; part < max_p-1; part++) { dev = &p[part].hd_driverfs_dev; dev->parent = parent; if (parent) @@ -174,11 +188,12 @@ static void driverfs_create_partitions(struct gendisk *hd) static void driverfs_remove_partitions(struct gendisk *hd) { int max_p = 1<minor_shift; + struct device *dev; struct hd_struct *p; int part; - for (part=0, p = hd->part; part < max_p; part++, p++) { - struct device *dev = &p->hd_driverfs_dev; + for (part=1, p = hd->part; part < max_p; part++, p++) { + dev = &p->hd_driverfs_dev; if (dev->driver_data) { device_remove_file(dev, &dev_attr_type); device_remove_file(dev, &dev_attr_kdev); @@ -186,6 +201,13 @@ static void driverfs_remove_partitions(struct gendisk *hd) dev->driver_data = NULL; } } + dev = &hd->disk_dev; + if (dev->driver_data) { + device_remove_file(dev, &dev_attr_type); + device_remove_file(dev, &dev_attr_kdev); + put_device(dev); + dev->driver_data = NULL; + } } static void check_partition(struct gendisk *hd, struct block_device *bdev) @@ -227,10 +249,10 @@ static void check_partition(struct gendisk *hd, struct block_device *bdev) } p = hd->part; for (j = 1; j < state->limit; j++) { - p[j].start_sect = state->parts[j].from; - p[j].nr_sects = state->parts[j].size; + p[j-1].start_sect = state->parts[j].from; + p[j-1].nr_sects = state->parts[j].size; #if CONFIG_BLK_DEV_MD - if (!state->parts[j].flags) + if (!state->parts[j-1].flags) continue; md_autodetect_dev(dev+j); #endif @@ -248,15 +270,15 @@ static void devfs_register_partition(struct gendisk *dev, int part) struct hd_struct *p = dev->part; char devname[16]; - if (p[part].de) + if (p[part-1].de) return; - dir = devfs_get_parent(p[0].de); + dir = devfs_get_parent(dev->disk_de); if (!dir) return; if (dev->flags & GENHD_FL_REMOVABLE) devfs_flags |= DEVFS_FL_REMOVABLE; sprintf(devname, "part%d", part); - p[part].de = devfs_register (dir, devname, devfs_flags, + p[part-1].de = devfs_register (dir, devname, devfs_flags, dev->major, dev->first_minor + part, S_IFBLK | S_IRUSR | S_IWUSR, dev->fops, NULL); @@ -300,10 +322,10 @@ static void devfs_create_partitions(struct gendisk *dev) sprintf(symlink, "disc%d", dev->number); devfs_mk_symlink (devfs_handle, symlink, DEVFS_FL_DEFAULT, dirname + pos, &slave, NULL); - p->de = devfs_register(dir, "disc", devfs_flags, + dev->disk_de = devfs_register(dir, "disc", devfs_flags, dev->major, dev->first_minor, S_IFBLK | S_IRUSR | S_IWUSR, dev->fops, NULL); - devfs_auto_unregister(p->de, slave); + devfs_auto_unregister(dev->disk_de, slave); if (!(dev->flags & GENHD_FL_DEVFS)) devfs_auto_unregister (slave, dir); for (part = 1, p++; part < max_p; part++, p++) @@ -316,10 +338,12 @@ static void devfs_remove_partitions(struct gendisk *dev) { #ifdef CONFIG_DEVFS_FS int part; - for (part = 1<minor_shift; part--; ) { + for (part = (1<minor_shift)-1; part--; ) { devfs_unregister(dev->part[part].de); dev->part[part].de = NULL; } + devfs_unregister(dev->disk_de); + dev->disk_de = NULL; devfs_dealloc_unique_number(&disc_numspace, dev->number); #endif } @@ -363,7 +387,7 @@ void register_disk(struct gendisk *disk, kdev_t dev, unsigned minors, void update_partition(struct gendisk *disk, int part) { - struct hd_struct *p = disk->part + part; + struct hd_struct *p = disk->part + part - 1; struct device *dev = &p->hd_driverfs_dev; if (!p->nr_sects) { @@ -402,7 +426,7 @@ int rescan_partitions(struct gendisk *disk, struct block_device *bdev) if (res) return res; bdev->bd_invalidated = 0; - for (p = 1; p < (1<minor_shift); p++) { + for (p = 0; p < (1<minor_shift) - 1; p++) { disk->part[p].start_sect = 0; disk->part[p].nr_sects = 0; } @@ -441,22 +465,32 @@ fail: static int wipe_partitions(struct gendisk *disk) { int max_p = 1 << disk->minor_shift; + kdev_t devp; + int res; int p; /* invalidate stuff */ - for (p = max_p - 1; p >= 0; p--) { - kdev_t devp = mk_kdev(disk->major,disk->first_minor + p); - int res; + for (p = max_p - 1; p > 0; p--) { + devp = mk_kdev(disk->major,disk->first_minor + p); #if 0 /* %%% superfluous? */ - if (disk->part[p].nr_sects == 0) + if (disk->part[p-1].nr_sects == 0) continue; #endif res = invalidate_device(devp, 1); if (res) return res; - disk->part[p].start_sect = 0; - disk->part[p].nr_sects = 0; + disk->part[p-1].start_sect = 0; + disk->part[p-1].nr_sects = 0; } + devp = mk_kdev(disk->major,disk->first_minor); +#if 0 /* %%% superfluous? */ + if (disk->part[p].nr_sects == 0) + continue; +#endif + res = invalidate_device(devp, 1); + if (res) + return res; + disk->capacity = 0; return 0; } @@ -466,4 +500,8 @@ void del_gendisk(struct gendisk *disk) wipe_partitions(disk); unlink_gendisk(disk); devfs_remove_partitions(disk); + if (disk->part) { + kfree(disk->part); + disk->part = NULL; + } } diff --git a/include/linux/genhd.h b/include/linux/genhd.h index 0bd31339d6f5..ecd747fbe569 100644 --- a/include/linux/genhd.h +++ b/include/linux/genhd.h @@ -79,11 +79,14 @@ struct gendisk { struct hd_struct *part; /* [indexed by minor] */ struct gendisk *next; struct block_device_operations *fops; + sector_t capacity; - devfs_handle_t de; - struct device *driverfs_dev; int flags; int number; /* devfs crap */ + devfs_handle_t de; /* more of the same */ + devfs_handle_t disk_de; /* piled higher and deeper */ + struct device *driverfs_dev; + struct device disk_dev; }; /* drivers/block/genhd.c */ @@ -97,11 +100,11 @@ static inline unsigned long get_start_sect(struct block_device *bdev) } static inline sector_t get_capacity(struct gendisk *disk) { - return disk->part[0].nr_sects; + return disk->capacity; } static inline void set_capacity(struct gendisk *disk, sector_t size) { - disk->part[0].nr_sects = size; + disk->capacity = size; } #endif /* __KERNEL__ */ diff --git a/include/linux/ide.h b/include/linux/ide.h index 501b97902799..936a8eb9132d 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h @@ -508,7 +508,6 @@ typedef struct ide_drive_s { struct hwif_s *hwif; /* actually (ide_hwif_t *) */ wait_queue_head_t wqueue; /* used to wait for drive in open() */ struct hd_driveid *id; /* drive model identification info */ - struct hd_struct *part; /* drive partition table */ char name[4]; /* drive name, such as "hda" */ struct ide_driver_s *driver; /* (ide_driver_t *) */ void *driver_data; /* extra driver data */ diff --git a/include/linux/raid/md.h b/include/linux/raid/md.h index a9cca6e4da8f..f95cdf658a39 100644 --- a/include/linux/raid/md.h +++ b/include/linux/raid/md.h @@ -61,7 +61,6 @@ #define MD_PATCHLEVEL_VERSION 0 extern int md_size[MAX_MD_DEVS]; -extern struct hd_struct md_hd_struct[MAX_MD_DEVS]; extern char * partition_name (kdev_t dev); extern inline char * bdev_partition_name (struct block_device *bdev) -- cgit v1.2.3