scsi sd设备的设备文件名,如sda等,是在sd驱动加载时自动生成的。他在生成设备文件时,有一套文件名的生成规则。具体生成算法总的来说就是首先向系统申请一个ida,也就是唯一id。然后把id映射成设备文件名sdxxx。在设备释放时,该ida会被释放,以便以后使用。由于ida是由系统维护的全局量,所以可以保证生成的设备名的唯一性。
具体生成是在scsi sd设备被探测到后,调用sd_probe函数时进行的。首先获得一个可用的ida(sd驱动维护一个自己全局ida:static DEFINE_IDA(sd_index_ida)):
error = ida_get_new(&sd_index_ida, &index);
scsi sd设备的名称格式规定为sdxxx,sd后面的3个xxx表示26个小写字母的排列组合。也就是设备文件名最多只能有26+26*26+26*26*26种。因此如果获得的ida大于这个数字,就无法为设备生成设备文件名。
有了ida后,就可以根据ida来生成具体的设备文件名:
if (index < 26) {
  sprintf(gd->disk_name, "sd%c", 'a' + index % 26);
 } else if (index < (26 + 1) * 26) {
  sprintf(gd->disk_name, "sd%c%c",
   'a' + index / 26 - 1,'a' + index % 26);
 } else {
  const unsigned int m1 = (index / 26 - 1) / 26 - 1;
  const unsigned int m2 = (index / 26 - 1) % 26;
  const unsigned int m3 =  index % 26;
  sprintf(gd->disk_name, "sd%c%c%c",
   'a' + m1, 'a' + m2, 'a' + m3);
 }


同时,该ida会被存放在代表该sd块设备的scsi_disk结构的index字段中,以便以后使用。
当一个sd设备被释放后,会释放设备的ida,以便sd驱动能重复使用这些ida和设备文件名。ida的释放具体是在scsi_disk_release中调用的。当一个设备被释放时,会调用该函数。
Logo

更多推荐