X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=module%2Fzfs%2Fzvol.c;h=b516156372448a286f8e68c761314048d8334ac4;hb=refs%2Fheads%2Frertzinger%2Ffeature-zpool-get--p;hp=43a7bb69f0bdd98f1da70193a473533f5061fac4;hpb=0a6bef26ec80ee4db5f5340bbc007a45311e0415;p=zfs.git diff --git a/module/zfs/zvol.c b/module/zfs/zvol.c index 43a7bb6..b516156 100644 --- a/module/zfs/zvol.c +++ b/module/zfs/zvol.c @@ -1024,7 +1024,11 @@ out_mutex: return (error); } +#ifdef HAVE_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID +static void +#else static int +#endif zvol_release(struct gendisk *disk, fmode_t mode) { zvol_state_t *zv = disk->private_data; @@ -1044,7 +1048,9 @@ zvol_release(struct gendisk *disk, fmode_t mode) if (drop_mutex) mutex_exit(&zvol_state_lock); +#ifndef HAVE_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID return (0); +#endif } static int @@ -1215,6 +1221,9 @@ zvol_alloc(dev_t dev, const char *name) zv = kmem_zalloc(sizeof (zvol_state_t), KM_SLEEP); + spin_lock_init(&zv->zv_lock); + list_link_init(&zv->zv_next); + zv->zv_queue = blk_init_queue(zvol_request, &zv->zv_lock); if (zv->zv_queue == NULL) goto out_kmem; @@ -1248,9 +1257,6 @@ zvol_alloc(dev_t dev, const char *name) sizeof (rl_t), offsetof(rl_t, r_node)); zv->zv_znode.z_is_zvol = TRUE; - spin_lock_init(&zv->zv_lock); - list_link_init(&zv->zv_next); - zv->zv_disk->major = zvol_major; zv->zv_disk->first_minor = (dev & MINORMASK); zv->zv_disk->fops = &zvol_ops; @@ -1561,30 +1567,36 @@ zvol_init(void) { int error; + list_create(&zvol_state_list, sizeof (zvol_state_t), + offsetof(zvol_state_t, zv_next)); + mutex_init(&zvol_state_lock, NULL, MUTEX_DEFAULT, NULL); + zvol_taskq = taskq_create(ZVOL_DRIVER, zvol_threads, maxclsyspri, zvol_threads, INT_MAX, TASKQ_PREPOPULATE); if (zvol_taskq == NULL) { printk(KERN_INFO "ZFS: taskq_create() failed\n"); - return (-ENOMEM); + error = -ENOMEM; + goto out1; } error = register_blkdev(zvol_major, ZVOL_DRIVER); if (error) { printk(KERN_INFO "ZFS: register_blkdev() failed %d\n", error); - taskq_destroy(zvol_taskq); - return (error); + goto out2; } blk_register_region(MKDEV(zvol_major, 0), 1UL << MINORBITS, THIS_MODULE, zvol_probe, NULL, NULL); - mutex_init(&zvol_state_lock, NULL, MUTEX_DEFAULT, NULL); - list_create(&zvol_state_list, sizeof (zvol_state_t), - offsetof(zvol_state_t, zv_next)); + return (0); - (void) zvol_create_minors(NULL); +out2: + taskq_destroy(zvol_taskq); +out1: + mutex_destroy(&zvol_state_lock); + list_destroy(&zvol_state_list); - return (0); + return (error); } void