@@ -113,6 +113,13 @@ static struct ida zvol_ida;
113
113
/*
114
114
* The in-core state of each volume.
115
115
*/
116
+ struct zvol_state_os {
117
+ struct gendisk * zvo_disk ; /* generic disk */
118
+ struct request_queue * zvo_queue ; /* request queue */
119
+ dataset_kstats_t zvo_kstat ; /* zvol kstats */
120
+ dev_t zvo_dev ; /* device id */
121
+ };
122
+
116
123
struct zvol_state {
117
124
char zv_name [MAXNAMELEN ]; /* name */
118
125
uint64_t zv_volsize ; /* advertised space */
@@ -134,6 +141,7 @@ struct zvol_state {
134
141
kmutex_t zv_state_lock ; /* protects zvol_state_t */
135
142
atomic_t zv_suspend_ref ; /* refcount for suspend */
136
143
krwlock_t zv_suspend_lock ; /* suspend lock */
144
+ struct zvol_state_os * zv_zso ; /* private platform state */
137
145
};
138
146
139
147
typedef enum {
@@ -1686,6 +1694,7 @@ static zvol_state_t *
1686
1694
zvol_alloc (dev_t dev , const char * name )
1687
1695
{
1688
1696
zvol_state_t * zv ;
1697
+ struct zvol_state_os * zso ;
1689
1698
uint64_t volmode ;
1690
1699
1691
1700
if (dsl_prop_get_integer (name , "volmode" , & volmode , NULL ) != 0 )
@@ -1698,39 +1707,39 @@ zvol_alloc(dev_t dev, const char *name)
1698
1707
return (NULL );
1699
1708
1700
1709
zv = kmem_zalloc (sizeof (zvol_state_t ), KM_SLEEP );
1710
+ zso = kmem_zalloc (sizeof (struct zvol_state_os ), KM_SLEEP );
1711
+ zv -> zv_zso = zso ;
1701
1712
1702
1713
list_link_init (& zv -> zv_next );
1703
-
1704
1714
mutex_init (& zv -> zv_state_lock , NULL , MUTEX_DEFAULT , NULL );
1705
1715
1706
- zv -> zv_queue = blk_alloc_queue ( GFP_ATOMIC );
1707
- if (zv -> zv_queue == NULL )
1716
+ zso -> zvo_queue = blk_generic_alloc_queue ( zvol_request , NUMA_NO_NODE );
1717
+ if (zso -> zvo_queue == NULL )
1708
1718
goto out_kmem ;
1709
1719
1710
- blk_queue_make_request (zv -> zv_queue , zvol_request );
1711
- blk_queue_set_write_cache (zv -> zv_queue , B_TRUE , B_TRUE );
1720
+ blk_queue_set_write_cache (zso -> zvo_queue , B_TRUE , B_TRUE );
1712
1721
1713
1722
/* Limit read-ahead to a single page to prevent over-prefetching. */
1714
- blk_queue_set_read_ahead (zv -> zv_queue , 1 );
1723
+ blk_queue_set_read_ahead (zso -> zvo_queue , 1 );
1715
1724
1716
1725
/* Disable write merging in favor of the ZIO pipeline. */
1717
- blk_queue_flag_set (QUEUE_FLAG_NOMERGES , zv -> zv_queue );
1726
+ blk_queue_flag_set (QUEUE_FLAG_NOMERGES , zso -> zvo_queue );
1718
1727
1719
- zv -> zv_disk = alloc_disk (ZVOL_MINORS );
1720
- if (zv -> zv_disk == NULL )
1728
+ zso -> zvo_disk = alloc_disk (ZVOL_MINORS );
1729
+ if (zso -> zvo_disk == NULL )
1721
1730
goto out_queue ;
1722
1731
1723
- zv -> zv_queue -> queuedata = zv ;
1724
- zv -> zv_dev = dev ;
1732
+ zso -> zvo_queue -> queuedata = zv ;
1733
+ zso -> zvo_dev = dev ;
1725
1734
zv -> zv_open_count = 0 ;
1726
1735
strlcpy (zv -> zv_name , name , MAXNAMELEN );
1727
1736
1728
1737
zfs_rangelock_init (& zv -> zv_rangelock , NULL , NULL );
1729
1738
rw_init (& zv -> zv_suspend_lock , NULL , RW_DEFAULT , NULL );
1730
1739
1731
- zv -> zv_disk -> major = zvol_major ;
1740
+ zso -> zvo_disk -> major = zvol_major ;
1732
1741
#ifdef HAVE_BLOCK_DEVICE_OPERATIONS_CHECK_EVENTS
1733
- zv -> zv_disk -> events = DISK_EVENT_MEDIA_CHANGE ;
1742
+ zso -> zvo_disk -> events = DISK_EVENT_MEDIA_CHANGE ;
1734
1743
#endif
1735
1744
1736
1745
if (volmode == ZFS_VOLMODE_DEV ) {
@@ -1741,26 +1750,27 @@ zvol_alloc(dev_t dev, const char *name)
1741
1750
* and suppresses partition scanning (GENHD_FL_NO_PART_SCAN)
1742
1751
* setting gendisk->flags accordingly.
1743
1752
*/
1744
- zv -> zv_disk -> minors = 1 ;
1753
+ zso -> zvo_disk -> minors = 1 ;
1745
1754
#if defined(GENHD_FL_EXT_DEVT )
1746
- zv -> zv_disk -> flags &= ~GENHD_FL_EXT_DEVT ;
1755
+ zso -> zvo_disk -> flags &= ~GENHD_FL_EXT_DEVT ;
1747
1756
#endif
1748
1757
#if defined(GENHD_FL_NO_PART_SCAN )
1749
- zv -> zv_disk -> flags |= GENHD_FL_NO_PART_SCAN ;
1758
+ zso -> zvo_disk -> flags |= GENHD_FL_NO_PART_SCAN ;
1750
1759
#endif
1751
1760
}
1752
- zv -> zv_disk -> first_minor = (dev & MINORMASK );
1753
- zv -> zv_disk -> fops = & zvol_ops ;
1754
- zv -> zv_disk -> private_data = zv ;
1755
- zv -> zv_disk -> queue = zv -> zv_queue ;
1756
- snprintf (zv -> zv_disk -> disk_name , DISK_NAME_LEN , "%s%d" ,
1761
+ zso -> zvo_disk -> first_minor = (dev & MINORMASK );
1762
+ zso -> zvo_disk -> fops = & zvol_ops ;
1763
+ zso -> zvo_disk -> private_data = zv ;
1764
+ zso -> zvo_disk -> queue = zso -> zvo_queue ;
1765
+ snprintf (zso -> zvo_disk -> disk_name , DISK_NAME_LEN , "%s%d" ,
1757
1766
ZVOL_DEV_NAME , (dev & MINORMASK ));
1758
1767
1759
1768
return (zv );
1760
1769
1761
1770
out_queue :
1762
- blk_cleanup_queue (zv -> zv_queue );
1771
+ blk_cleanup_queue (zso -> zvo_queue );
1763
1772
out_kmem :
1773
+ kmem_free (zso , sizeof (struct zvol_state_os ));
1764
1774
kmem_free (zv , sizeof (zvol_state_t ));
1765
1775
1766
1776
return (NULL );
0 commit comments