Wiki¶
File source:libmultipath/print.c:
static int
snprint_hcil (char * buff, size_t len, struct path * pp)
{
if (pp->sg_id.host_no < 0)
return snprintf(buff, len, "#:#:#:#");
return snprintf(buff, len, "%i:%i:%i:%i",
pp->sg_id.host_no,
pp->sg_id.channel,
pp->sg_id.scsi_id,
pp->sg_id.lun);
}
hcil == host channel ID LUN
definiert inf struct path pp
, siehe
file source:libmultipath/structs.h:
struct sg_id {
int host_no;
int channel;
int scsi_id;
int lun;
short h_cmd_per_lun;
short d_queue_depth;
int unused1;
int unused2;
};
struct path {
char dev[FILE_NAME_SIZE];
char dev_t[BLK_DEV_SIZE];
struct scsi_idlun scsi_id;
struct sg_id sg_id;
char wwid[WWID_SIZE];
char vendor_id[SCSI_VENDOR_SIZE];
char product_id[SCSI_PRODUCT_SIZE];
char rev[SCSI_REV_SIZE];
char serial[SERIAL_SIZE];
char tgt_node_name[NODE_NAME_SIZE];
unsigned long long size;
unsigned int checkint;
unsigned int tick;
int bus;
int state;
int dmstate;
int failcount;
int priority;
int pgindex;
char * getuid;
char * getprio;
int getprio_selected;
struct checker checker;
struct multipath * mpp;
int fd;
/* configlet pointers */
struct hwentry * hwe;
};
Befuellt wird sg_id
in file source:libmultipath/discovery.c:
static int
scsi_sysfs_pathinfo (struct path * pp)
{
...
/*
* host / bus / target / lun
*/
if(safe_sprintf(attr_path, "%s/block/%s/device",
sysfs_path, pp->dev)) {
condlog(0, "attr_path too small");
return 1;
}
if (0 > sysfs_get_link(attr_path, attr_buff, sizeof(attr_buff)))
return 1;
basename(attr_buff, attr_path);
sscanf(attr_path, "%i:%i:%i:%i",
&pp->sg_id.host_no,
&pp->sg_id.channel,
&pp->sg_id.scsi_id,
&pp->sg_id.lun);
...
/*
* target node name
*/
if(safe_sprintf(attr_path,
"%s/class/fc_transport/target%i:%i:%i/node_name",
sysfs_path,
pp->sg_id.host_no,
pp->sg_id.channel,
pp->sg_id.scsi_id)) { ... }
...
}
basename() ist keine libc Funktion, sie ist in util.c definiert und kopiert string1 ab dem letzten Slash auf string2 um.
Interessant auch das File source:libmultipath/hwtable.c#L925:
/*
* NETAPP controller family
*
* Maintainer : Dave Wysochanski
* Mail : davidw@netapp.com
*/
{
.vendor = "NETAPP",
.product = "LUN.*",
.getuid = DEFAULT_GETUID,
.getprio = "/sbin/mpath_prio_netapp /dev/%n",
.features = "1 queue_if_no_path",
.hwhandler = DEFAULT_HWHANDLER,
.selector = DEFAULT_SELECTOR,
.pgpolicy = GROUP_BY_PRIO,
.pgfailback = -FAILBACK_IMMEDIATE,
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = 128,
.checker_name = READSECTOR0,
},