forked from mirrors/linux
		
	dm-mpath, scsi_dh: request scsi_dh modules in scsi_dh, not dm-mpath
This way we can reused the same code any attachment method, not just those requested from dm-mpath. [jejb: fixup checkpatch error] Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> Reviewed-by: Hannes Reinecke <hare@suse.de> Acked-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: James Bottomley <JBottomley@Odin.com>
This commit is contained in:
		
							parent
							
								
									1bab0de027
								
							
						
					
					
						commit
						566079c849
					
				
					 3 changed files with 19 additions and 28 deletions
				
			
		| 
						 | 
				
			
			@ -725,12 +725,6 @@ static int parse_hw_handler(struct dm_arg_set *as, struct multipath *m)
 | 
			
		|||
		return 0;
 | 
			
		||||
 | 
			
		||||
	m->hw_handler_name = kstrdup(dm_shift_arg(as), GFP_KERNEL);
 | 
			
		||||
	if (!try_then_request_module(scsi_dh_handler_exist(m->hw_handler_name),
 | 
			
		||||
				     "scsi_dh_%s", m->hw_handler_name)) {
 | 
			
		||||
		ti->error = "unknown hardware handler type";
 | 
			
		||||
		ret = -EINVAL;
 | 
			
		||||
		goto fail;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (hw_argc > 1) {
 | 
			
		||||
		char *p;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -29,7 +29,7 @@
 | 
			
		|||
static DEFINE_SPINLOCK(list_lock);
 | 
			
		||||
static LIST_HEAD(scsi_dh_list);
 | 
			
		||||
 | 
			
		||||
static struct scsi_device_handler *get_device_handler(const char *name)
 | 
			
		||||
static struct scsi_device_handler *__scsi_dh_lookup(const char *name)
 | 
			
		||||
{
 | 
			
		||||
	struct scsi_device_handler *tmp, *found = NULL;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -44,6 +44,19 @@ static struct scsi_device_handler *get_device_handler(const char *name)
 | 
			
		|||
	return found;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct scsi_device_handler *scsi_dh_lookup(const char *name)
 | 
			
		||||
{
 | 
			
		||||
	struct scsi_device_handler *dh;
 | 
			
		||||
 | 
			
		||||
	dh = __scsi_dh_lookup(name);
 | 
			
		||||
	if (!dh) {
 | 
			
		||||
		request_module(name);
 | 
			
		||||
		dh = __scsi_dh_lookup(name);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return dh;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * device_handler_match_function - Match a device handler to a device
 | 
			
		||||
 * @sdev - SCSI device to be tested
 | 
			
		||||
| 
						 | 
				
			
			@ -158,7 +171,8 @@ store_dh_state(struct device *dev, struct device_attribute *attr,
 | 
			
		|||
		/*
 | 
			
		||||
		 * Attach to a device handler
 | 
			
		||||
		 */
 | 
			
		||||
		if (!(scsi_dh = get_device_handler(buf)))
 | 
			
		||||
		scsi_dh = scsi_dh_lookup(buf);
 | 
			
		||||
		if (!scsi_dh)
 | 
			
		||||
			return err;
 | 
			
		||||
		err = scsi_dh_handler_attach(sdev, scsi_dh);
 | 
			
		||||
	} else {
 | 
			
		||||
| 
						 | 
				
			
			@ -322,8 +336,7 @@ static int scsi_dh_notifier_remove(struct device *dev, void *data)
 | 
			
		|||
 */
 | 
			
		||||
int scsi_register_device_handler(struct scsi_device_handler *scsi_dh)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	if (get_device_handler(scsi_dh->name))
 | 
			
		||||
	if (__scsi_dh_lookup(scsi_dh->name))
 | 
			
		||||
		return -EBUSY;
 | 
			
		||||
 | 
			
		||||
	if (!scsi_dh->attach || !scsi_dh->detach)
 | 
			
		||||
| 
						 | 
				
			
			@ -350,7 +363,7 @@ EXPORT_SYMBOL_GPL(scsi_register_device_handler);
 | 
			
		|||
int scsi_unregister_device_handler(struct scsi_device_handler *scsi_dh)
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
	if (!get_device_handler(scsi_dh->name))
 | 
			
		||||
	if (!__scsi_dh_lookup(scsi_dh->name))
 | 
			
		||||
		return -ENODEV;
 | 
			
		||||
 | 
			
		||||
	bus_for_each_dev(&scsi_bus_type, NULL, scsi_dh,
 | 
			
		||||
| 
						 | 
				
			
			@ -454,17 +467,6 @@ int scsi_dh_set_params(struct request_queue *q, const char *params)
 | 
			
		|||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(scsi_dh_set_params);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * scsi_dh_handler_exist - Return TRUE(1) if a device handler exists for
 | 
			
		||||
 *	the given name. FALSE(0) otherwise.
 | 
			
		||||
 * @name - name of the device handler.
 | 
			
		||||
 */
 | 
			
		||||
int scsi_dh_handler_exist(const char *name)
 | 
			
		||||
{
 | 
			
		||||
	return (get_device_handler(name) != NULL);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL_GPL(scsi_dh_handler_exist);
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * scsi_dh_attach - Attach device handler
 | 
			
		||||
 * @q - Request queue that is associated with the scsi_device
 | 
			
		||||
| 
						 | 
				
			
			@ -478,7 +480,7 @@ int scsi_dh_attach(struct request_queue *q, const char *name)
 | 
			
		|||
	struct scsi_device_handler *scsi_dh;
 | 
			
		||||
	int err = 0;
 | 
			
		||||
 | 
			
		||||
	scsi_dh = get_device_handler(name);
 | 
			
		||||
	scsi_dh = scsi_dh_lookup(name);
 | 
			
		||||
	if (!scsi_dh)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -57,7 +57,6 @@ enum {
 | 
			
		|||
};
 | 
			
		||||
#if defined(CONFIG_SCSI_DH) || defined(CONFIG_SCSI_DH_MODULE)
 | 
			
		||||
extern int scsi_dh_activate(struct request_queue *, activate_complete, void *);
 | 
			
		||||
extern int scsi_dh_handler_exist(const char *);
 | 
			
		||||
extern int scsi_dh_attach(struct request_queue *, const char *);
 | 
			
		||||
extern const char *scsi_dh_attached_handler_name(struct request_queue *, gfp_t);
 | 
			
		||||
extern int scsi_dh_set_params(struct request_queue *, const char *);
 | 
			
		||||
| 
						 | 
				
			
			@ -68,10 +67,6 @@ static inline int scsi_dh_activate(struct request_queue *req,
 | 
			
		|||
	fn(data, 0);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
static inline int scsi_dh_handler_exist(const char *name)
 | 
			
		||||
{
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
static inline int scsi_dh_attach(struct request_queue *req, const char *name)
 | 
			
		||||
{
 | 
			
		||||
	return SCSI_DH_NOSYS;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue