[Stgt-devel] [PATCH] add stgt_device_template example

Mike Christie michaelc at cs.wisc.edu
Tue Aug 23 19:14:14 CEST 2005


Ok I merged my patches with your fixes (but I used strdup
in that one patch). I did not merge your patch below becuase
I assumed it is part of your fileio work that you are going to
merge.


FUJITA Tomonori wrote:
> From: Mike Christie <michaelc at cs.wisc.edu>
> Subject: [Stgt-devel] [PATCH] add stgt_device_template example
> Date: Tue, 23 Aug 2005 00:59:16 -0500
> 
> 
>>This adds the beginings of a stgt_device_template for
>>passthrough commands. It will end up using the block
>>layer BLOCK_PC facility to pass the command to the
>>underlying device similar to how we do it for SG_IO
>>and dm-multipath hw_handlers like dm-emc.c.
>>
>>It is not completely hooked in yet. The command
>>handling needs to be done and so does the actual
>>device creation.
>>
>>This was built over my last patch.
> 
> 
> I've attached the patch to enable IET to use your new features. Now we
> can use 'Lun' in the IET configure file (/etc/ietd.conf) again.
> 
> For example, I put 'Lun 0 Path=/dev/hdb' line in my configuration
> file.
> 
> fujita at lily:/sys/class$ find stgt_*
> stgt_device
> stgt_device/device0
> stgt_device/device0/path
> stgt_target
> stgt_target/target0
> stgt_target/target0/queued_cmnds
> 
> fujita at lily:/sys/class$ cat stgt_device/device0/path
> /dev/hdb
> 
> 
> diff -x CVS -x .svn -x GPATH -x GRTAGS -x GSYMS -x GTAGS -x .config -u --new-file --recursive stgt.new/iscsi/kernel/config.c stgt.work/iscsi/kernel/config.c
> --- stgt.new/iscsi/kernel/config.c	2005-08-19 00:42:26.000000000 +0900
> +++ stgt.work/iscsi/kernel/config.c	2005-08-23 22:29:50.000000000 +0900
> @@ -170,8 +170,7 @@
>  	if ((err = copy_from_user(&info, (void *) ptr, sizeof(info))) < 0)
>  		return err;
>  
> -	return 0;
> -/* 	return volume_add(target, &info); */
> +	return volume_add(target, &info);
>  }
>  
>  static int del_volume(struct iscsi_target *target, unsigned long ptr)
> @@ -182,8 +181,7 @@
>  	if ((err = copy_from_user(&info, (void *) ptr, sizeof(info))) < 0)
>  		return err;
>  
> -	return 0;
> -/* 	return iscsi_volume_del(target, &info); */
> +	return volume_del(target, &info);
>  }
>  
>  static int iscsi_param_config(struct iscsi_target *target, unsigned long ptr, int set)
> diff -x CVS -x .svn -x GPATH -x GRTAGS -x GSYMS -x GTAGS -x .config -u --new-file --recursive stgt.new/iscsi/kernel/iscsi.h stgt.work/iscsi/kernel/iscsi.h
> --- stgt.new/iscsi/kernel/iscsi.h	2005-08-23 18:56:10.000000000 +0900
> +++ stgt.work/iscsi/kernel/iscsi.h	2005-08-23 22:48:38.000000000 +0900
> @@ -73,6 +73,7 @@
>  	struct iscsi_trgt_param trgt_param;
>  
>  	struct list_head session_list;
> +	struct list_head device_list;
>  
>  	struct network_thread_info nthread_info;
>  
> @@ -231,6 +232,8 @@
>  struct iscsi_target *target_lookup_by_id(u32);
>  extern int target_add(struct target_info *);
>  extern int target_del(u32 id);
> +extern int volume_del(struct iscsi_target *target, struct volume_info *info);
> +extern int volume_add(struct iscsi_target *target, struct volume_info *info);
>  
>  /* config.c */
>  extern int iet_procfs_init(void);
> diff -x CVS -x .svn -x GPATH -x GRTAGS -x GSYMS -x GTAGS -x .config -u --new-file --recursive stgt.new/iscsi/kernel/target.c stgt.work/iscsi/kernel/target.c
> --- stgt.new/iscsi/kernel/target.c	2005-08-23 18:56:10.000000000 +0900
> +++ stgt.work/iscsi/kernel/target.c	2005-08-23 23:25:50.000000000 +0900
> @@ -11,6 +11,7 @@
>  #include <iscsi_dbg.h>
>  #include <stgt.h>
>  #include <stgt_target.h>
> +#include <stgt_device.h>
>  
>  #define	MAX_NR_TARGETS	(1UL << 30)
>  
> @@ -151,6 +152,7 @@
>  	init_MUTEX(&target->target_sem);
>  
>  	INIT_LIST_HEAD(&target->session_list);
> +	INIT_LIST_HEAD(&target->device_list);
>  	list_add(&target->t_list, &target_list);
>  
>  	nthread_init(target);
> @@ -277,3 +279,79 @@
>  
>  	return 0;
>  }
> +
> +/*
> + * Temporary device code
> + */
> +
> +struct iscsi_device {
> +	uint64_t lun;
> +	struct list_head list;
> +	struct stgt_device *sd;
> +};
> +
> +struct iscsi_device *volume_lookup(struct iscsi_target *target, u32 lun)
> +{
> +	struct iscsi_device *device;
> +	list_for_each_entry(device, &target->device_list, list) {
> +		if (device->lun == lun)
> +			return device;
> +	}
> +	return NULL;
> +}
> +
> +int volume_add(struct iscsi_target *target, struct volume_info *info)
> +{
> +	char *path, *type, dtype[] = "stgt_sd";
> +	struct iscsi_device *device;
> +	struct stgt_device *sd;
> +
> +	eprintk("%u %s\n", info->lun, info->args);
> +
> +	if (volume_lookup(target, info->lun)) {
> +		eprintk("%u\n", info->lun);
> +		return -EEXIST;
> +	}
> +
> +	path = strstr(info->args, "Path=");
> +	if (!path)
> +		return -EINVAL;
> +	path += strlen("Path=");
> +
> +	device = kmalloc(sizeof(*device), GFP_KERNEL);
> +	if (!device)
> +		return -ENOMEM;
> +
> +	type = strstr(info->args, "Type=");
> +	if (type)
> +		type += strlen("Type=");
> +	else
> +		type = dtype;
> +
> +	eprintk("%u %s %s\n", info->lun, path, type);
> +	sd = stgt_device_create(target->stt, type, path, info->lun, 0);
> +	if (!sd)
> +		goto out;
> +
> +	device->sd = sd;
> +	device->lun = info->lun;
> +	list_add(&device->list, &target->device_list);
> +	return 0;
> +out:
> +	kfree(device);
> +	return -EINVAL;
> +}
> +
> +int volume_del(struct iscsi_target *target, struct volume_info *info)
> +{
> +	struct iscsi_device *device;
> +
> +	device = volume_lookup(target, info->lun);
> +	if (!device)
> +		return -ENOENT;
> +
> +	stgt_device_destroy(device->sd);
> +	list_del(&device->list);
> +	kfree(device);
> +	return 0;
> +}
> _______________________________________________
> Stgt-devel mailing list
> Stgt-devel at lists.berlios.de
> http://lists.berlios.de/mailman/listinfo/stgt-devel




More information about the stgt mailing list