@@ -250,7 +250,7 @@ static void null_free_device_storage(struct nullb_device *dev, bool is_cache);
250
250
251
251
static inline struct nullb_device * to_nullb_device (struct config_item * item )
252
252
{
253
- return item ? container_of (item , struct nullb_device , item ) : NULL ;
253
+ return item ? container_of (to_config_group ( item ) , struct nullb_device , group ) : NULL ;
254
254
}
255
255
256
256
static inline ssize_t nullb_device_uint_attr_show (unsigned int val , char * page )
@@ -593,8 +593,29 @@ static const struct config_item_type nullb_device_type = {
593
593
.ct_owner = THIS_MODULE ,
594
594
};
595
595
596
+ #ifdef CONFIG_BLK_DEV_NULL_BLK_FAULT_INJECTION
597
+
598
+ static void nullb_add_fault_config (struct nullb_device * dev )
599
+ {
600
+ fault_config_init (& dev -> timeout_config , "timeout_inject" );
601
+ fault_config_init (& dev -> requeue_config , "requeue_inject" );
602
+ fault_config_init (& dev -> init_hctx_fault_config , "init_hctx_fault_inject" );
603
+
604
+ configfs_add_default_group (& dev -> timeout_config .group , & dev -> group );
605
+ configfs_add_default_group (& dev -> requeue_config .group , & dev -> group );
606
+ configfs_add_default_group (& dev -> init_hctx_fault_config .group , & dev -> group );
607
+ }
608
+
609
+ #else
610
+
611
+ static void nullb_add_fault_config (struct nullb_device * dev )
612
+ {
613
+ }
614
+
615
+ #endif
616
+
596
617
static struct
597
- config_item * nullb_group_make_item (struct config_group * group , const char * name )
618
+ config_group * nullb_group_make_group (struct config_group * group , const char * name )
598
619
{
599
620
struct nullb_device * dev ;
600
621
@@ -605,9 +626,10 @@ config_item *nullb_group_make_item(struct config_group *group, const char *name)
605
626
if (!dev )
606
627
return ERR_PTR (- ENOMEM );
607
628
608
- config_item_init_type_name (& dev -> item , name , & nullb_device_type );
629
+ config_group_init_type_name (& dev -> group , name , & nullb_device_type );
630
+ nullb_add_fault_config (dev );
609
631
610
- return & dev -> item ;
632
+ return & dev -> group ;
611
633
}
612
634
613
635
static void
@@ -645,7 +667,7 @@ static struct configfs_attribute *nullb_group_attrs[] = {
645
667
};
646
668
647
669
static struct configfs_group_operations nullb_group_ops = {
648
- .make_item = nullb_group_make_item ,
670
+ .make_group = nullb_group_make_group ,
649
671
.drop_item = nullb_group_drop_item ,
650
672
};
651
673
@@ -676,6 +698,13 @@ static struct nullb_device *null_alloc_dev(void)
676
698
dev = kzalloc (sizeof (* dev ), GFP_KERNEL );
677
699
if (!dev )
678
700
return NULL ;
701
+
702
+ #ifdef CONFIG_BLK_DEV_NULL_BLK_FAULT_INJECTION
703
+ dev -> timeout_config .attr = null_timeout_attr ;
704
+ dev -> requeue_config .attr = null_requeue_attr ;
705
+ dev -> init_hctx_fault_config .attr = null_init_hctx_attr ;
706
+ #endif
707
+
679
708
INIT_RADIX_TREE (& dev -> data , GFP_ATOMIC );
680
709
INIT_RADIX_TREE (& dev -> cache , GFP_ATOMIC );
681
710
if (badblocks_init (& dev -> badblocks , 0 )) {
@@ -1515,24 +1544,48 @@ static void null_submit_bio(struct bio *bio)
1515
1544
null_handle_cmd (alloc_cmd (nq , bio ), sector , nr_sectors , bio_op (bio ));
1516
1545
}
1517
1546
1547
+ #ifdef CONFIG_BLK_DEV_NULL_BLK_FAULT_INJECTION
1548
+
1549
+ static bool should_timeout_request (struct request * rq )
1550
+ {
1551
+ struct nullb_cmd * cmd = blk_mq_rq_to_pdu (rq );
1552
+ struct nullb_device * dev = cmd -> nq -> dev ;
1553
+
1554
+ return should_fail (& dev -> timeout_config .attr , 1 );
1555
+ }
1556
+
1557
+ static bool should_requeue_request (struct request * rq )
1558
+ {
1559
+ struct nullb_cmd * cmd = blk_mq_rq_to_pdu (rq );
1560
+ struct nullb_device * dev = cmd -> nq -> dev ;
1561
+
1562
+ return should_fail (& dev -> requeue_config .attr , 1 );
1563
+ }
1564
+
1565
+ static bool should_init_hctx_fail (struct nullb_device * dev )
1566
+ {
1567
+ return should_fail (& dev -> init_hctx_fault_config .attr , 1 );
1568
+ }
1569
+
1570
+ #else
1571
+
1518
1572
static bool should_timeout_request (struct request * rq )
1519
1573
{
1520
- #ifdef CONFIG_BLK_DEV_NULL_BLK_FAULT_INJECTION
1521
- if (g_timeout_str [0 ])
1522
- return should_fail (& null_timeout_attr , 1 );
1523
- #endif
1524
1574
return false;
1525
1575
}
1526
1576
1527
1577
static bool should_requeue_request (struct request * rq )
1528
1578
{
1529
- #ifdef CONFIG_BLK_DEV_NULL_BLK_FAULT_INJECTION
1530
- if (g_requeue_str [0 ])
1531
- return should_fail (& null_requeue_attr , 1 );
1532
- #endif
1533
1579
return false;
1534
1580
}
1535
1581
1582
+ static bool should_init_hctx_fail (struct nullb_device * dev )
1583
+ {
1584
+ return false;
1585
+ }
1586
+
1587
+ #endif
1588
+
1536
1589
static void null_map_queues (struct blk_mq_tag_set * set )
1537
1590
{
1538
1591
struct nullb * nullb = set -> driver_data ;
@@ -1729,10 +1782,8 @@ static int null_init_hctx(struct blk_mq_hw_ctx *hctx, void *driver_data,
1729
1782
struct nullb * nullb = hctx -> queue -> queuedata ;
1730
1783
struct nullb_queue * nq ;
1731
1784
1732
- #ifdef CONFIG_BLK_DEV_NULL_BLK_FAULT_INJECTION
1733
- if (g_init_hctx_str [0 ] && should_fail (& null_init_hctx_attr , 1 ))
1785
+ if (should_init_hctx_fail (nullb -> dev ))
1734
1786
return - EFAULT ;
1735
- #endif
1736
1787
1737
1788
nq = & nullb -> queues [hctx_idx ];
1738
1789
hctx -> driver_data = nq ;
@@ -2052,9 +2103,6 @@ static int null_add_dev(struct nullb_device *dev)
2052
2103
if (rv )
2053
2104
goto out_cleanup_queues ;
2054
2105
2055
- if (!null_setup_fault ())
2056
- goto out_cleanup_tags ;
2057
-
2058
2106
nullb -> tag_set -> timeout = 5 * HZ ;
2059
2107
nullb -> disk = blk_mq_alloc_disk (nullb -> tag_set , nullb );
2060
2108
if (IS_ERR (nullb -> disk )) {
@@ -2116,10 +2164,10 @@ static int null_add_dev(struct nullb_device *dev)
2116
2164
2117
2165
null_config_discard (nullb );
2118
2166
2119
- if (config_item_name (& dev -> item )) {
2167
+ if (config_item_name (& dev -> group . cg_item )) {
2120
2168
/* Use configfs dir name as the device name */
2121
2169
snprintf (nullb -> disk_name , sizeof (nullb -> disk_name ),
2122
- "%s" , config_item_name (& dev -> item ));
2170
+ "%s" , config_item_name (& dev -> group . cg_item ));
2123
2171
} else {
2124
2172
sprintf (nullb -> disk_name , "nullb%d" , nullb -> index );
2125
2173
}
@@ -2219,6 +2267,9 @@ static int __init null_init(void)
2219
2267
g_home_node = NUMA_NO_NODE ;
2220
2268
}
2221
2269
2270
+ if (!null_setup_fault ())
2271
+ return - EINVAL ;
2272
+
2222
2273
if (g_queue_mode == NULL_Q_RQ ) {
2223
2274
pr_err ("legacy IO path is no longer available\n" );
2224
2275
return - EINVAL ;
0 commit comments