Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

powerpc/axonram: Use only one block device major number

Axonram module registers one block device for each DDR2 DIMM found
on a system. This means that each DDR2 DIMM becomes its own block device
major number. This patch lets axonram module to register the only one
block device for all DDR2 DIMMs which also spares kernel resources.

Signed-off-by: Maxim Shchetynin <maxim@de.ibm.com>
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>

authored by

Maxim Shchetynin and committed by
Benjamin Herrenschmidt
9a23409b 18ad7a61

+15 -8
+15 -8
arch/powerpc/sysdev/axonram.c
··· 57 57 #define AXON_RAM_SECTOR_SIZE 1 << AXON_RAM_SECTOR_SHIFT 58 58 #define AXON_RAM_IRQ_FLAGS IRQF_SHARED | IRQF_TRIGGER_RISING 59 59 60 + static int azfs_major, azfs_minor; 61 + 60 62 struct axon_ram_bank { 61 63 struct of_device *device; 62 64 struct gendisk *disk; ··· 229 227 goto failed; 230 228 } 231 229 232 - bank->disk->first_minor = 0; 230 + bank->disk->major = azfs_major; 231 + bank->disk->first_minor = azfs_minor; 233 232 bank->disk->fops = &axon_ram_devops; 234 233 bank->disk->private_data = bank; 235 234 bank->disk->driverfs_dev = &device->dev; 236 235 237 236 sprintf(bank->disk->disk_name, "%s%d", 238 237 AXON_RAM_DEVICE_NAME, axon_ram_bank_id); 239 - bank->disk->major = register_blkdev(0, bank->disk->disk_name); 240 - if (bank->disk->major < 0) { 241 - dev_err(&device->dev, "Cannot register block device\n"); 242 - rc = -EFAULT; 243 - goto failed; 244 - } 245 238 246 239 bank->disk->queue = blk_alloc_queue(GFP_KERNEL); 247 240 if (bank->disk->queue == NULL) { ··· 273 276 goto failed; 274 277 } 275 278 279 + azfs_minor += bank->disk->minors; 280 + 276 281 return 0; 277 282 278 283 failed: ··· 309 310 310 311 device_remove_file(&device->dev, &dev_attr_ecc); 311 312 free_irq(bank->irq_id, device); 312 - unregister_blkdev(bank->disk->major, bank->disk->disk_name); 313 313 del_gendisk(bank->disk); 314 314 iounmap((void __iomem *) bank->io_addr); 315 315 kfree(bank); ··· 339 341 static int __init 340 342 axon_ram_init(void) 341 343 { 344 + azfs_major = register_blkdev(azfs_major, AXON_RAM_DEVICE_NAME); 345 + if (azfs_major < 0) { 346 + printk(KERN_ERR "%s cannot become block device major number\n", 347 + AXON_RAM_MODULE_NAME); 348 + return -EFAULT; 349 + } 350 + azfs_minor = 0; 351 + 342 352 return of_register_platform_driver(&axon_ram_driver); 343 353 } 344 354 ··· 357 351 axon_ram_exit(void) 358 352 { 359 353 of_unregister_platform_driver(&axon_ram_driver); 354 + unregister_blkdev(azfs_major, AXON_RAM_DEVICE_NAME); 360 355 } 361 356 362 357 module_init(axon_ram_init);