]> git.proxmox.com Git - mirror_zfs.git/blobdiff - module/zfs/zvol.c
Fix "BUG: Bad page state" caused by writeback flag
[mirror_zfs.git] / module / zfs / zvol.c
index 8c43e198aca782b67a85d3738d9836e09ef61d9b..c9c8d2964933c78b586ea9436f18b5a471a9d47b 100644 (file)
@@ -764,7 +764,7 @@ zvol_request(struct request_queue *q)
                        continue;
                }
 
-               switch (rq_data_dir(req)) {
+               switch ((int)rq_data_dir(req)) {
                case READ:
                        zvol_dispatch(zvol_read, req);
                        break;
@@ -1055,11 +1055,11 @@ zvol_release(struct gendisk *disk, fmode_t mode)
                drop_mutex = 1;
        }
 
-       ASSERT3P(zv, !=, NULL);
-       ASSERT3U(zv->zv_open_count, >, 0);
-       zv->zv_open_count--;
-       if (zv->zv_open_count == 0)
-               zvol_last_close(zv);
+       if (zv->zv_open_count > 0) {
+               zv->zv_open_count--;
+               if (zv->zv_open_count == 0)
+                       zvol_last_close(zv);
+       }
 
        if (drop_mutex)
                mutex_exit(&zvol_state_lock);
@@ -1389,7 +1389,7 @@ __zvol_create_minor(const char *name, boolean_t ignore_snapdev)
 
        set_capacity(zv->zv_disk, zv->zv_volsize >> 9);
 
-       blk_queue_max_hw_sectors(zv->zv_queue, UINT_MAX);
+       blk_queue_max_hw_sectors(zv->zv_queue, DMU_MAX_ACCESS / 512);
        blk_queue_max_segments(zv->zv_queue, UINT16_MAX);
        blk_queue_max_segment_size(zv->zv_queue, UINT_MAX);
        blk_queue_physical_block_size(zv->zv_queue, zv->zv_volblocksize);
@@ -1632,7 +1632,7 @@ zvol_init(void)
        mutex_init(&zvol_state_lock, NULL, MUTEX_DEFAULT, NULL);
 
        zvol_taskq = taskq_create(ZVOL_DRIVER, zvol_threads, maxclsyspri,
-           zvol_threads, INT_MAX, TASKQ_PREPOPULATE);
+           zvol_threads * 2, INT_MAX, TASKQ_PREPOPULATE | TASKQ_DYNAMIC);
        if (zvol_taskq == NULL) {
                printk(KERN_INFO "ZFS: taskq_create() failed\n");
                error = -ENOMEM;