Re: [PATCH] scsi_dh_rdac: avoid crash during rescan

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Hannes,

I love your patch! Yet something to improve:

[auto build test ERROR on mkp-scsi/for-next]
[also build test ERROR on v5.4-rc7 next-20191112]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]

url:    https://github.com/0day-ci/linux/commits/Hannes-Reinecke/scsi_dh_rdac-avoid-crash-during-rescan/20191113-021538
base:   https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next
config: x86_64-rhel-7.6-kasan (attached as .config)
compiler: gcc-7 (Debian 7.4.0-14) 7.4.0
reproduce:
        # save the attached .config to linux build tree
        make ARCH=x86_64 

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@xxxxxxxxx>

All errors (new ones prefixed by >>):

   drivers/scsi/device_handler/scsi_dh_rdac.c: In function 'check_ownership':
>> drivers/scsi/device_handler/scsi_dh_rdac.c:437:12: error: invalid storage class for function 'initialize_controller'
    static int initialize_controller(struct scsi_device *sdev,
               ^~~~~~~~~~~~~~~~~~~~~
   drivers/scsi/device_handler/scsi_dh_rdac.c:437:1: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
    static int initialize_controller(struct scsi_device *sdev,
    ^~~~~~
>> drivers/scsi/device_handler/scsi_dh_rdac.c:465:12: error: invalid storage class for function 'set_mode_select'
    static int set_mode_select(struct scsi_device *sdev, struct rdac_dh_data *h)
               ^~~~~~~~~~~~~~~
>> drivers/scsi/device_handler/scsi_dh_rdac.c:485:12: error: invalid storage class for function 'mode_select_handle_sense'
    static int mode_select_handle_sense(struct scsi_device *sdev,
               ^~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/scsi/device_handler/scsi_dh_rdac.c:527:13: error: invalid storage class for function 'send_mode_select'
    static void send_mode_select(struct work_struct *work)
                ^~~~~~~~~~~~~~~~
>> drivers/scsi/device_handler/scsi_dh_rdac.c:585:12: error: invalid storage class for function 'queue_mode_select'
    static int queue_mode_select(struct scsi_device *sdev,
               ^~~~~~~~~~~~~~~~~
>> drivers/scsi/device_handler/scsi_dh_rdac.c:611:12: error: invalid storage class for function 'rdac_activate'
    static int rdac_activate(struct scsi_device *sdev,
               ^~~~~~~~~~~~~
>> drivers/scsi/device_handler/scsi_dh_rdac.c:647:21: error: invalid storage class for function 'rdac_prep_fn'
    static blk_status_t rdac_prep_fn(struct scsi_device *sdev, struct request *req)
                        ^~~~~~~~~~~~
>> drivers/scsi/device_handler/scsi_dh_rdac.c:659:12: error: invalid storage class for function 'rdac_check_sense'
    static int rdac_check_sense(struct scsi_device *sdev,
               ^~~~~~~~~~~~~~~~
>> drivers/scsi/device_handler/scsi_dh_rdac.c:724:12: error: invalid storage class for function 'rdac_bus_attach'
    static int rdac_bus_attach(struct scsi_device *sdev)
               ^~~~~~~~~~~~~~~
>> drivers/scsi/device_handler/scsi_dh_rdac.c:771:13: error: invalid storage class for function 'rdac_bus_detach'
    static void rdac_bus_detach( struct scsi_device *sdev )
                ^~~~~~~~~~~~~~~
>> drivers/scsi/device_handler/scsi_dh_rdac.c:792:13: error: initializer element is not constant
     .prep_fn = rdac_prep_fn,
                ^~~~~~~~~~~~
   drivers/scsi/device_handler/scsi_dh_rdac.c:792:13: note: (near initialization for 'rdac_dh.prep_fn')
   drivers/scsi/device_handler/scsi_dh_rdac.c:793:17: error: initializer element is not constant
     .check_sense = rdac_check_sense,
                    ^~~~~~~~~~~~~~~~
   drivers/scsi/device_handler/scsi_dh_rdac.c:793:17: note: (near initialization for 'rdac_dh.check_sense')
   drivers/scsi/device_handler/scsi_dh_rdac.c:794:12: error: initializer element is not constant
     .attach = rdac_bus_attach,
               ^~~~~~~~~~~~~~~
   drivers/scsi/device_handler/scsi_dh_rdac.c:794:12: note: (near initialization for 'rdac_dh.attach')
   drivers/scsi/device_handler/scsi_dh_rdac.c:795:12: error: initializer element is not constant
     .detach = rdac_bus_detach,
               ^~~~~~~~~~~~~~~
   drivers/scsi/device_handler/scsi_dh_rdac.c:795:12: note: (near initialization for 'rdac_dh.detach')
   drivers/scsi/device_handler/scsi_dh_rdac.c:796:14: error: initializer element is not constant
     .activate = rdac_activate,
                 ^~~~~~~~~~~~~
   drivers/scsi/device_handler/scsi_dh_rdac.c:796:14: note: (near initialization for 'rdac_dh.activate')
>> drivers/scsi/device_handler/scsi_dh_rdac.c:799:19: error: invalid storage class for function 'rdac_init'
    static int __init rdac_init(void)
                      ^~~~~~~~~
>> drivers/scsi/device_handler/scsi_dh_rdac.c:823:20: error: invalid storage class for function 'rdac_exit'
    static void __exit rdac_exit(void)
                       ^~~~~~~~~
   In file included from include/linux/string.h:6:0,
                    from include/linux/scatterlist.h:5,
                    from include/scsi/scsi.h:10,
                    from drivers/scsi/device_handler/scsi_dh_rdac.c:22:
>> include/linux/compiler.h:302:44: error: initializer element is not constant
      __PASTE(__addressable_##sym, __LINE__) = (void *)&sym;
                                               ^
   include/linux/init.h:189:2: note: in expansion of macro '__ADDRESSABLE'
     __ADDRESSABLE(fn)     \
     ^~~~~~~~~~~~~
   include/linux/init.h:200:35: note: in expansion of macro '___define_initcall'
    #define __define_initcall(fn, id) ___define_initcall(fn, id, .initcall##id)
                                      ^~~~~~~~~~~~~~~~~~
   include/linux/init.h:229:30: note: in expansion of macro '__define_initcall'
    #define device_initcall(fn)  __define_initcall(fn, 6)
                                 ^~~~~~~~~~~~~~~~~
   include/linux/init.h:234:24: note: in expansion of macro 'device_initcall'
    #define __initcall(fn) device_initcall(fn)
                           ^~~~~~~~~~~~~~~
   include/linux/module.h:85:24: note: in expansion of macro '__initcall'
    #define module_init(x) __initcall(x);
                           ^~~~~~~~~~
   drivers/scsi/device_handler/scsi_dh_rdac.c:829:1: note: in expansion of macro 'module_init'
    module_init(rdac_init);
    ^~~~~~~~~~~
   In file included from include/linux/printk.h:6:0,
                    from include/linux/kernel.h:15,
                    from include/asm-generic/bug.h:19,
                    from arch/x86/include/asm/bug.h:83,
                    from include/linux/bug.h:5,
                    from include/linux/scatterlist.h:7,
                    from include/scsi/scsi.h:10,
                    from drivers/scsi/device_handler/scsi_dh_rdac.c:22:
   drivers/scsi/device_handler/scsi_dh_rdac.c:830:13: error: initializer element is not constant
    module_exit(rdac_exit);
                ^
   include/linux/init.h:237:50: note: in definition of macro '__exitcall'
     static exitcall_t __exitcall_##fn __exit_call = fn
                                                     ^~
   drivers/scsi/device_handler/scsi_dh_rdac.c:830:1: note: in expansion of macro 'module_exit'
    module_exit(rdac_exit);
    ^~~~~~~~~~~
   include/linux/init.h:237:2: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
     static exitcall_t __exitcall_##fn __exit_call = fn
     ^
   include/linux/module.h:97:24: note: in expansion of macro '__exitcall'
    #define module_exit(x) __exitcall(x);
                           ^~~~~~~~~~
   drivers/scsi/device_handler/scsi_dh_rdac.c:830:1: note: in expansion of macro 'module_exit'
    module_exit(rdac_exit);
    ^~~~~~~~~~~
   In file included from include/linux/module.h:18:0,
                    from drivers/scsi/device_handler/scsi_dh_rdac.c:27:
   include/linux/moduleparam.h:24:1: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
    static const char __UNIQUE_ID(name)[]       \
    ^
   include/linux/module.h:159:32: note: in expansion of macro '__MODULE_INFO'
    #define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info)
                                   ^~~~~~~~~~~~~
   include/linux/module.h:222:42: note: in expansion of macro 'MODULE_INFO'
    #define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description)
                                             ^~~~~~~~~~~
   drivers/scsi/device_handler/scsi_dh_rdac.c:832:1: note: in expansion of macro 'MODULE_DESCRIPTION'
    MODULE_DESCRIPTION("Multipath LSI/Engenio/NetApp E-Series RDAC driver");
    ^~~~~~~~~~~~~~~~~~
>> drivers/scsi/device_handler/scsi_dh_rdac.c:835:1: error: expected declaration or statement at end of input
    MODULE_LICENSE("GPL");
    ^~~~~~~~~~~~~~
   drivers/scsi/device_handler/scsi_dh_rdac.c: At top level:
   drivers/scsi/device_handler/scsi_dh_rdac.c:237:13: warning: 'send_mode_select' used but never defined
    static void send_mode_select(struct work_struct *work);
                ^~~~~~~~~~~~~~~~
   drivers/scsi/device_handler/scsi_dh_rdac.c:527:13: warning: 'send_mode_select' defined but not used [-Wunused-function]
    static void send_mode_select(struct work_struct *work)
                ^~~~~~~~~~~~~~~~
--
   drivers/scsi//device_handler/scsi_dh_rdac.c: In function 'check_ownership':
   drivers/scsi//device_handler/scsi_dh_rdac.c:437:12: error: invalid storage class for function 'initialize_controller'
    static int initialize_controller(struct scsi_device *sdev,
               ^~~~~~~~~~~~~~~~~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c:437:1: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
    static int initialize_controller(struct scsi_device *sdev,
    ^~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c:465:12: error: invalid storage class for function 'set_mode_select'
    static int set_mode_select(struct scsi_device *sdev, struct rdac_dh_data *h)
               ^~~~~~~~~~~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c:485:12: error: invalid storage class for function 'mode_select_handle_sense'
    static int mode_select_handle_sense(struct scsi_device *sdev,
               ^~~~~~~~~~~~~~~~~~~~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c:527:13: error: invalid storage class for function 'send_mode_select'
    static void send_mode_select(struct work_struct *work)
                ^~~~~~~~~~~~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c:585:12: error: invalid storage class for function 'queue_mode_select'
    static int queue_mode_select(struct scsi_device *sdev,
               ^~~~~~~~~~~~~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c:611:12: error: invalid storage class for function 'rdac_activate'
    static int rdac_activate(struct scsi_device *sdev,
               ^~~~~~~~~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c:647:21: error: invalid storage class for function 'rdac_prep_fn'
    static blk_status_t rdac_prep_fn(struct scsi_device *sdev, struct request *req)
                        ^~~~~~~~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c:659:12: error: invalid storage class for function 'rdac_check_sense'
    static int rdac_check_sense(struct scsi_device *sdev,
               ^~~~~~~~~~~~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c:724:12: error: invalid storage class for function 'rdac_bus_attach'
    static int rdac_bus_attach(struct scsi_device *sdev)
               ^~~~~~~~~~~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c:771:13: error: invalid storage class for function 'rdac_bus_detach'
    static void rdac_bus_detach( struct scsi_device *sdev )
                ^~~~~~~~~~~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c:792:13: error: initializer element is not constant
     .prep_fn = rdac_prep_fn,
                ^~~~~~~~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c:792:13: note: (near initialization for 'rdac_dh.prep_fn')
   drivers/scsi//device_handler/scsi_dh_rdac.c:793:17: error: initializer element is not constant
     .check_sense = rdac_check_sense,
                    ^~~~~~~~~~~~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c:793:17: note: (near initialization for 'rdac_dh.check_sense')
   drivers/scsi//device_handler/scsi_dh_rdac.c:794:12: error: initializer element is not constant
     .attach = rdac_bus_attach,
               ^~~~~~~~~~~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c:794:12: note: (near initialization for 'rdac_dh.attach')
   drivers/scsi//device_handler/scsi_dh_rdac.c:795:12: error: initializer element is not constant
     .detach = rdac_bus_detach,
               ^~~~~~~~~~~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c:795:12: note: (near initialization for 'rdac_dh.detach')
   drivers/scsi//device_handler/scsi_dh_rdac.c:796:14: error: initializer element is not constant
     .activate = rdac_activate,
                 ^~~~~~~~~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c:796:14: note: (near initialization for 'rdac_dh.activate')
   drivers/scsi//device_handler/scsi_dh_rdac.c:799:19: error: invalid storage class for function 'rdac_init'
    static int __init rdac_init(void)
                      ^~~~~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c:823:20: error: invalid storage class for function 'rdac_exit'
    static void __exit rdac_exit(void)
                       ^~~~~~~~~
   In file included from include/linux/string.h:6:0,
                    from include/linux/scatterlist.h:5,
                    from include/scsi/scsi.h:10,
                    from drivers/scsi//device_handler/scsi_dh_rdac.c:22:
>> include/linux/compiler.h:302:44: error: initializer element is not constant
      __PASTE(__addressable_##sym, __LINE__) = (void *)&sym;
                                               ^
   include/linux/init.h:189:2: note: in expansion of macro '__ADDRESSABLE'
     __ADDRESSABLE(fn)     \
     ^~~~~~~~~~~~~
   include/linux/init.h:200:35: note: in expansion of macro '___define_initcall'
    #define __define_initcall(fn, id) ___define_initcall(fn, id, .initcall##id)
                                      ^~~~~~~~~~~~~~~~~~
   include/linux/init.h:229:30: note: in expansion of macro '__define_initcall'
    #define device_initcall(fn)  __define_initcall(fn, 6)
                                 ^~~~~~~~~~~~~~~~~
   include/linux/init.h:234:24: note: in expansion of macro 'device_initcall'
    #define __initcall(fn) device_initcall(fn)
                           ^~~~~~~~~~~~~~~
   include/linux/module.h:85:24: note: in expansion of macro '__initcall'
    #define module_init(x) __initcall(x);
                           ^~~~~~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c:829:1: note: in expansion of macro 'module_init'
    module_init(rdac_init);
    ^~~~~~~~~~~
   In file included from include/linux/printk.h:6:0,
                    from include/linux/kernel.h:15,
                    from include/asm-generic/bug.h:19,
                    from arch/x86/include/asm/bug.h:83,
                    from include/linux/bug.h:5,
                    from include/linux/scatterlist.h:7,
                    from include/scsi/scsi.h:10,
                    from drivers/scsi//device_handler/scsi_dh_rdac.c:22:
   drivers/scsi//device_handler/scsi_dh_rdac.c:830:13: error: initializer element is not constant
    module_exit(rdac_exit);
                ^
   include/linux/init.h:237:50: note: in definition of macro '__exitcall'
     static exitcall_t __exitcall_##fn __exit_call = fn
                                                     ^~
   drivers/scsi//device_handler/scsi_dh_rdac.c:830:1: note: in expansion of macro 'module_exit'
    module_exit(rdac_exit);
    ^~~~~~~~~~~
   include/linux/init.h:237:2: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
     static exitcall_t __exitcall_##fn __exit_call = fn
     ^
   include/linux/module.h:97:24: note: in expansion of macro '__exitcall'
    #define module_exit(x) __exitcall(x);
                           ^~~~~~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c:830:1: note: in expansion of macro 'module_exit'
    module_exit(rdac_exit);
    ^~~~~~~~~~~
   In file included from include/linux/module.h:18:0,
                    from drivers/scsi//device_handler/scsi_dh_rdac.c:27:
   include/linux/moduleparam.h:24:1: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]
    static const char __UNIQUE_ID(name)[]       \
    ^
   include/linux/module.h:159:32: note: in expansion of macro '__MODULE_INFO'
    #define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info)
                                   ^~~~~~~~~~~~~
   include/linux/module.h:222:42: note: in expansion of macro 'MODULE_INFO'
    #define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description)
                                             ^~~~~~~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c:832:1: note: in expansion of macro 'MODULE_DESCRIPTION'
    MODULE_DESCRIPTION("Multipath LSI/Engenio/NetApp E-Series RDAC driver");
    ^~~~~~~~~~~~~~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c:835:1: error: expected declaration or statement at end of input
    MODULE_LICENSE("GPL");
    ^~~~~~~~~~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c: At top level:
   drivers/scsi//device_handler/scsi_dh_rdac.c:237:13: warning: 'send_mode_select' used but never defined
    static void send_mode_select(struct work_struct *work);
                ^~~~~~~~~~~~~~~~
   drivers/scsi//device_handler/scsi_dh_rdac.c:527:13: warning: 'send_mode_select' defined but not used [-Wunused-function]
    static void send_mode_select(struct work_struct *work)
                ^~~~~~~~~~~~~~~~

vim +/initialize_controller +437 drivers/scsi/device_handler/scsi_dh_rdac.c

fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  436  
ca9f0089867c9e Hannes Reinecke     2008-07-17 @437  static int initialize_controller(struct scsi_device *sdev,
a53becc9a9dbe4 Chandra Seetharaman 2011-07-20  438  		struct rdac_dh_data *h, char *array_name, u8 *array_id)
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  439  {
3278255741326b Hannes Reinecke     2016-11-03  440  	int err = SCSI_DH_IO, index;
3278255741326b Hannes Reinecke     2016-11-03  441  	struct c4_inquiry *inqp = &h->inq.c4;
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  442  
3278255741326b Hannes Reinecke     2016-11-03  443  	if (!scsi_get_vpd_page(sdev, 0xC4, (unsigned char *)inqp,
3278255741326b Hannes Reinecke     2016-11-03  444  			       sizeof(struct c4_inquiry))) {
a53becc9a9dbe4 Chandra Seetharaman 2011-07-20  445  		/* get the controller index */
a53becc9a9dbe4 Chandra Seetharaman 2011-07-20  446  		if (inqp->slot_id[1] == 0x31)
a53becc9a9dbe4 Chandra Seetharaman 2011-07-20  447  			index = 0;
a53becc9a9dbe4 Chandra Seetharaman 2011-07-20  448  		else
a53becc9a9dbe4 Chandra Seetharaman 2011-07-20  449  			index = 1;
3569e5374df66a Moger, Babu         2012-02-02  450  
3569e5374df66a Moger, Babu         2012-02-02  451  		spin_lock(&list_lock);
d6857595394f1f Chandra Seetharaman 2011-07-27  452  		h->ctlr = get_controller(index, array_name, array_id, sdev);
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  453  		if (!h->ctlr)
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  454  			err = SCSI_DH_RES_TEMP_UNAVAIL;
1a5dc166cd8843 Hannes Reinecke     2016-03-03  455  		else {
1a5dc166cd8843 Hannes Reinecke     2016-03-03  456  			list_add_rcu(&h->node, &h->ctlr->dh_list);
1a5dc166cd8843 Hannes Reinecke     2016-03-03  457  			h->sdev = sdev;
1a5dc166cd8843 Hannes Reinecke     2016-03-03  458  		}
3569e5374df66a Moger, Babu         2012-02-02  459  		spin_unlock(&list_lock);
3278255741326b Hannes Reinecke     2016-11-03  460  		err = SCSI_DH_OK;
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  461  	}
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  462  	return err;
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  463  }
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  464  
ca9f0089867c9e Hannes Reinecke     2008-07-17 @465  static int set_mode_select(struct scsi_device *sdev, struct rdac_dh_data *h)
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  466  {
3278255741326b Hannes Reinecke     2016-11-03  467  	int err = SCSI_DH_IO;
3278255741326b Hannes Reinecke     2016-11-03  468  	struct c2_inquiry *inqp = &h->inq.c2;
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  469  
3278255741326b Hannes Reinecke     2016-11-03  470  	if (!scsi_get_vpd_page(sdev, 0xC2, (unsigned char *)inqp,
3278255741326b Hannes Reinecke     2016-11-03  471  			       sizeof(struct c2_inquiry))) {
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  472  		/*
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  473  		 * If more than MODE6_MAX_LUN luns are supported, use
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  474  		 * mode select 10
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  475  		 */
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  476  		if (inqp->max_lun_supported >= MODE6_MAX_LUN)
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  477  			h->ctlr->use_ms10 = 1;
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  478  		else
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  479  			h->ctlr->use_ms10 = 0;
3278255741326b Hannes Reinecke     2016-11-03  480  		err = SCSI_DH_OK;
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  481  	}
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  482  	return err;
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  483  }
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  484  
ca9f0089867c9e Hannes Reinecke     2008-07-17 @485  static int mode_select_handle_sense(struct scsi_device *sdev,
3278255741326b Hannes Reinecke     2016-11-03  486  				    struct scsi_sense_hdr *sense_hdr)
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  487  {
3278255741326b Hannes Reinecke     2016-11-03  488  	int err = SCSI_DH_IO;
ee14c674e8fc57 Christoph Hellwig   2015-08-27  489  	struct rdac_dh_data *h = sdev->handler_data;
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  490  
3278255741326b Hannes Reinecke     2016-11-03  491  	if (!scsi_sense_valid(sense_hdr))
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  492  		goto done;
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  493  
3278255741326b Hannes Reinecke     2016-11-03  494  	switch (sense_hdr->sense_key) {
7687fb9209422d Chauhan, Vijay      2009-03-04  495  	case NO_SENSE:
7687fb9209422d Chauhan, Vijay      2009-03-04  496  	case ABORTED_COMMAND:
7687fb9209422d Chauhan, Vijay      2009-03-04  497  	case UNIT_ATTENTION:
7687fb9209422d Chauhan, Vijay      2009-03-04  498  		err = SCSI_DH_RETRY;
7687fb9209422d Chauhan, Vijay      2009-03-04  499  		break;
7687fb9209422d Chauhan, Vijay      2009-03-04  500  	case NOT_READY:
3278255741326b Hannes Reinecke     2016-11-03  501  		if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x01)
7687fb9209422d Chauhan, Vijay      2009-03-04  502  			/* LUN Not Ready and is in the Process of Becoming
7687fb9209422d Chauhan, Vijay      2009-03-04  503  			 * Ready
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  504  			 */
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  505  			err = SCSI_DH_RETRY;
7687fb9209422d Chauhan, Vijay      2009-03-04  506  		break;
7687fb9209422d Chauhan, Vijay      2009-03-04  507  	case ILLEGAL_REQUEST:
3278255741326b Hannes Reinecke     2016-11-03  508  		if (sense_hdr->asc == 0x91 && sense_hdr->ascq == 0x36)
7687fb9209422d Chauhan, Vijay      2009-03-04  509  			/*
7687fb9209422d Chauhan, Vijay      2009-03-04  510  			 * Command Lock contention
7687fb9209422d Chauhan, Vijay      2009-03-04  511  			 */
d2d06d4fe0f2cc Hannes Reinecke     2016-01-22  512  			err = SCSI_DH_IMM_RETRY;
7687fb9209422d Chauhan, Vijay      2009-03-04  513  		break;
7687fb9209422d Chauhan, Vijay      2009-03-04  514  	default:
dd784edcfc080f Moger, Babu         2009-09-03  515  		break;
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  516  	}
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  517  
dd784edcfc080f Moger, Babu         2009-09-03  518  	RDAC_LOG(RDAC_LOG_FAILOVER, sdev, "array %s, ctlr %d, "
dd784edcfc080f Moger, Babu         2009-09-03  519  		"MODE_SELECT returned with sense %02x/%02x/%02x",
dd784edcfc080f Moger, Babu         2009-09-03  520  		(char *) h->ctlr->array_name, h->ctlr->index,
3278255741326b Hannes Reinecke     2016-11-03  521  		sense_hdr->sense_key, sense_hdr->asc, sense_hdr->ascq);
dd784edcfc080f Moger, Babu         2009-09-03  522  
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  523  done:
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  524  	return err;
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  525  }
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  526  
970f3f47e7c97c Chandra Seetharaman 2009-10-21 @527  static void send_mode_select(struct work_struct *work)
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  528  {
970f3f47e7c97c Chandra Seetharaman 2009-10-21  529  	struct rdac_controller *ctlr =
970f3f47e7c97c Chandra Seetharaman 2009-10-21  530  		container_of(work, struct rdac_controller, ms_work);
970f3f47e7c97c Chandra Seetharaman 2009-10-21  531  	struct scsi_device *sdev = ctlr->ms_sdev;
ee14c674e8fc57 Christoph Hellwig   2015-08-27  532  	struct rdac_dh_data *h = sdev->handler_data;
3278255741326b Hannes Reinecke     2016-11-03  533  	int err = SCSI_DH_OK, retry_cnt = RDAC_RETRY_COUNT;
970f3f47e7c97c Chandra Seetharaman 2009-10-21  534  	struct rdac_queue_data *tmp, *qdata;
970f3f47e7c97c Chandra Seetharaman 2009-10-21  535  	LIST_HEAD(list);
92eb506262a2a3 Stephen Kitt        2018-03-09  536  	unsigned char cdb[MAX_COMMAND_SIZE];
3278255741326b Hannes Reinecke     2016-11-03  537  	struct scsi_sense_hdr sshdr;
3278255741326b Hannes Reinecke     2016-11-03  538  	unsigned int data_size;
3278255741326b Hannes Reinecke     2016-11-03  539  	u64 req_flags = REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT |
3278255741326b Hannes Reinecke     2016-11-03  540  		REQ_FAILFAST_DRIVER;
970f3f47e7c97c Chandra Seetharaman 2009-10-21  541  
970f3f47e7c97c Chandra Seetharaman 2009-10-21  542  	spin_lock(&ctlr->ms_lock);
970f3f47e7c97c Chandra Seetharaman 2009-10-21  543  	list_splice_init(&ctlr->ms_head, &list);
970f3f47e7c97c Chandra Seetharaman 2009-10-21  544  	ctlr->ms_queued = 0;
970f3f47e7c97c Chandra Seetharaman 2009-10-21  545  	ctlr->ms_sdev = NULL;
970f3f47e7c97c Chandra Seetharaman 2009-10-21  546  	spin_unlock(&ctlr->ms_lock);
970f3f47e7c97c Chandra Seetharaman 2009-10-21  547  
c85f8cb9254e60 Chandra Seetharaman 2008-11-05  548   retry:
57adf5d4cfd319 Martin Wilck        2019-09-04  549  	memset(cdb, 0, sizeof(cdb));
57adf5d4cfd319 Martin Wilck        2019-09-04  550  
3278255741326b Hannes Reinecke     2016-11-03  551  	data_size = rdac_failover_get(ctlr, &list, cdb);
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  552  
dd784edcfc080f Moger, Babu         2009-09-03  553  	RDAC_LOG(RDAC_LOG_FAILOVER, sdev, "array %s, ctlr %d, "
dd784edcfc080f Moger, Babu         2009-09-03  554  		"%s MODE_SELECT command",
dd784edcfc080f Moger, Babu         2009-09-03  555  		(char *) h->ctlr->array_name, h->ctlr->index,
c85f8cb9254e60 Chandra Seetharaman 2008-11-05  556  		(retry_cnt == RDAC_RETRY_COUNT) ? "queueing" : "retrying");
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  557  
fcbfffe2c5cbec Christoph Hellwig   2017-02-23  558  	if (scsi_execute(sdev, cdb, DMA_TO_DEVICE, &h->ctlr->mode_select,
fcbfffe2c5cbec Christoph Hellwig   2017-02-23  559  			data_size, NULL, &sshdr, RDAC_TIMEOUT * HZ,
fcbfffe2c5cbec Christoph Hellwig   2017-02-23  560  			RDAC_RETRIES, req_flags, 0, NULL)) {
3278255741326b Hannes Reinecke     2016-11-03  561  		err = mode_select_handle_sense(sdev, &sshdr);
c85f8cb9254e60 Chandra Seetharaman 2008-11-05  562  		if (err == SCSI_DH_RETRY && retry_cnt--)
c85f8cb9254e60 Chandra Seetharaman 2008-11-05  563  			goto retry;
d2d06d4fe0f2cc Hannes Reinecke     2016-01-22  564  		if (err == SCSI_DH_IMM_RETRY)
d2d06d4fe0f2cc Hannes Reinecke     2016-01-22  565  			goto retry;
c85f8cb9254e60 Chandra Seetharaman 2008-11-05  566  	}
dd784edcfc080f Moger, Babu         2009-09-03  567  	if (err == SCSI_DH_OK) {
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  568  		h->state = RDAC_STATE_ACTIVE;
dd784edcfc080f Moger, Babu         2009-09-03  569  		RDAC_LOG(RDAC_LOG_FAILOVER, sdev, "array %s, ctlr %d, "
dd784edcfc080f Moger, Babu         2009-09-03  570  				"MODE_SELECT completed",
dd784edcfc080f Moger, Babu         2009-09-03  571  				(char *) h->ctlr->array_name, h->ctlr->index);
dd784edcfc080f Moger, Babu         2009-09-03  572  	}
ca9f0089867c9e Hannes Reinecke     2008-07-17  573  
970f3f47e7c97c Chandra Seetharaman 2009-10-21  574  	list_for_each_entry_safe(qdata, tmp, &list, entry) {
970f3f47e7c97c Chandra Seetharaman 2009-10-21  575  		list_del(&qdata->entry);
970f3f47e7c97c Chandra Seetharaman 2009-10-21  576  		if (err == SCSI_DH_OK)
970f3f47e7c97c Chandra Seetharaman 2009-10-21  577  			qdata->h->state = RDAC_STATE_ACTIVE;
970f3f47e7c97c Chandra Seetharaman 2009-10-21  578  		if (qdata->callback_fn)
970f3f47e7c97c Chandra Seetharaman 2009-10-21  579  			qdata->callback_fn(qdata->callback_data, err);
970f3f47e7c97c Chandra Seetharaman 2009-10-21  580  		kfree(qdata);
970f3f47e7c97c Chandra Seetharaman 2009-10-21  581  	}
970f3f47e7c97c Chandra Seetharaman 2009-10-21  582  	return;
970f3f47e7c97c Chandra Seetharaman 2009-10-21  583  }
970f3f47e7c97c Chandra Seetharaman 2009-10-21  584  
970f3f47e7c97c Chandra Seetharaman 2009-10-21 @585  static int queue_mode_select(struct scsi_device *sdev,
970f3f47e7c97c Chandra Seetharaman 2009-10-21  586  				activate_complete fn, void *data)
970f3f47e7c97c Chandra Seetharaman 2009-10-21  587  {
970f3f47e7c97c Chandra Seetharaman 2009-10-21  588  	struct rdac_queue_data *qdata;
970f3f47e7c97c Chandra Seetharaman 2009-10-21  589  	struct rdac_controller *ctlr;
970f3f47e7c97c Chandra Seetharaman 2009-10-21  590  
970f3f47e7c97c Chandra Seetharaman 2009-10-21  591  	qdata = kzalloc(sizeof(*qdata), GFP_KERNEL);
970f3f47e7c97c Chandra Seetharaman 2009-10-21  592  	if (!qdata)
970f3f47e7c97c Chandra Seetharaman 2009-10-21  593  		return SCSI_DH_RETRY;
970f3f47e7c97c Chandra Seetharaman 2009-10-21  594  
ee14c674e8fc57 Christoph Hellwig   2015-08-27  595  	qdata->h = sdev->handler_data;
970f3f47e7c97c Chandra Seetharaman 2009-10-21  596  	qdata->callback_fn = fn;
970f3f47e7c97c Chandra Seetharaman 2009-10-21  597  	qdata->callback_data = data;
970f3f47e7c97c Chandra Seetharaman 2009-10-21  598  
970f3f47e7c97c Chandra Seetharaman 2009-10-21  599  	ctlr = qdata->h->ctlr;
970f3f47e7c97c Chandra Seetharaman 2009-10-21  600  	spin_lock(&ctlr->ms_lock);
970f3f47e7c97c Chandra Seetharaman 2009-10-21  601  	list_add_tail(&qdata->entry, &ctlr->ms_head);
970f3f47e7c97c Chandra Seetharaman 2009-10-21  602  	if (!ctlr->ms_queued) {
970f3f47e7c97c Chandra Seetharaman 2009-10-21  603  		ctlr->ms_queued = 1;
970f3f47e7c97c Chandra Seetharaman 2009-10-21  604  		ctlr->ms_sdev = sdev;
970f3f47e7c97c Chandra Seetharaman 2009-10-21  605  		queue_work(kmpath_rdacd, &ctlr->ms_work);
970f3f47e7c97c Chandra Seetharaman 2009-10-21  606  	}
970f3f47e7c97c Chandra Seetharaman 2009-10-21  607  	spin_unlock(&ctlr->ms_lock);
970f3f47e7c97c Chandra Seetharaman 2009-10-21  608  	return SCSI_DH_OK;
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  609  }
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  610  
3ae31f6a7b6e44 Chandra Seetharaman 2009-10-21 @611  static int rdac_activate(struct scsi_device *sdev,
3ae31f6a7b6e44 Chandra Seetharaman 2009-10-21  612  			activate_complete fn, void *data)
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  613  {
ee14c674e8fc57 Christoph Hellwig   2015-08-27  614  	struct rdac_dh_data *h = sdev->handler_data;
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  615  	int err = SCSI_DH_OK;
3425fbfe229324 Moger, Babu         2011-04-08  616  	int act = 0;
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  617  
ca9f0089867c9e Hannes Reinecke     2008-07-17  618  	err = check_ownership(sdev, h);
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  619  	if (err != SCSI_DH_OK)
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  620  		goto done;
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  621  
3425fbfe229324 Moger, Babu         2011-04-08  622  	switch (h->mode) {
3425fbfe229324 Moger, Babu         2011-04-08  623  	case RDAC_MODE:
3425fbfe229324 Moger, Babu         2011-04-08  624  		if (h->lun_state == RDAC_LUN_UNOWNED)
3425fbfe229324 Moger, Babu         2011-04-08  625  			act = 1;
3425fbfe229324 Moger, Babu         2011-04-08  626  		break;
3425fbfe229324 Moger, Babu         2011-04-08  627  	case RDAC_MODE_IOSHIP:
3425fbfe229324 Moger, Babu         2011-04-08  628  		if ((h->lun_state == RDAC_LUN_UNOWNED) &&
3425fbfe229324 Moger, Babu         2011-04-08  629  		    (h->preferred == RDAC_PREFERRED))
3425fbfe229324 Moger, Babu         2011-04-08  630  			act = 1;
3425fbfe229324 Moger, Babu         2011-04-08  631  		break;
3425fbfe229324 Moger, Babu         2011-04-08  632  	default:
3425fbfe229324 Moger, Babu         2011-04-08  633  		break;
3425fbfe229324 Moger, Babu         2011-04-08  634  	}
3425fbfe229324 Moger, Babu         2011-04-08  635  
3425fbfe229324 Moger, Babu         2011-04-08  636  	if (act) {
970f3f47e7c97c Chandra Seetharaman 2009-10-21  637  		err = queue_mode_select(sdev, fn, data);
970f3f47e7c97c Chandra Seetharaman 2009-10-21  638  		if (err == SCSI_DH_OK)
970f3f47e7c97c Chandra Seetharaman 2009-10-21  639  			return 0;
970f3f47e7c97c Chandra Seetharaman 2009-10-21  640  	}
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  641  done:
3ae31f6a7b6e44 Chandra Seetharaman 2009-10-21  642  	if (fn)
3ae31f6a7b6e44 Chandra Seetharaman 2009-10-21  643  		fn(data, err);
3ae31f6a7b6e44 Chandra Seetharaman 2009-10-21  644  	return 0;
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  645  }
fbd7ab3eb53a3b Chandra Seetharaman 2008-05-01  646  

:::::: The code at line 437 was first introduced by commit
:::::: ca9f0089867c9e476cf2e6d4615d2aae887171b2 [SCSI] scsi_dh: Update RDAC device handler

:::::: TO: Hannes Reinecke <hare@xxxxxxx>
:::::: CC: James Bottomley <James.Bottomley@xxxxxxxxxxxxxxxxxxxxx>

---
0-DAY kernel test infrastructure                 Open Source Technology Center
https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx Intel Corporation

Attachment: .config.gz
Description: application/gzip


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux