Opened 8 years ago

Closed 8 years ago

#252 closed enhancement (fixed)

add disks on megaraid sas controller to DEVICESCAN

Reported by: Alex Samorukov Owned by: Alex Samorukov
Priority: minor Milestone:
Component: all Version: 6.0
Keywords: linux, megaraid Cc:

Description (last modified by Alex Samorukov)

I decided to add autoscan functionality for drives on MegaSAS controllers. Main motivation for this was that devices on such controllers having random numbers, from 0 to ~250 and it is very annoying to write smartd configuration (i used shell + MegaCli? in the past). There is no ioctl documentation provided, so i did patch based on MegaCli? tool behavior (with strace and LD_PRELAOD for IOCTL) and FreeBSD driver sources which contain similar code. What this patch is doing:

  • In autoscan mode, if megaraid_sas_ioctl is found in /proc/devices it is trying to identify SCSI host number with megasas controllers using sysfs (/sys/class/scsi_host/hostN/proc_name). If sysfs is not mounted it scans first 16 buses. I believe that native tool do the same.
  • If controller is found i am getting device list using driver ioctl and adding them to device list

Code changes:

  • megaraid.h updated to include constant/structures to get drive list
  • set_fd added to linux_smart_device. I need this to override is_open check in megaraid.
  • -d megaraid allows to specify devices in pseudo /dev/bus/N format. We can`t easy get drive name from the bus number, and also it is possible that drive name is not exists at all (unconfigured RAID).
  • Added private functions get_dev_megasas, megasas_dcmd_cmd and megasas_pd_get_list to the linux_smart_interface.
  • I disabled "MegaRAID SAT layer is reportedly buggy" error. Everything was fixed after chk_cond check was added. I am unable to reproduce problem with different hardware.
  • I added set_info().dev_type = strprintf("megaraid,%d", tgt) to set device number in type. Without it --scan will show just -"d megaraid" devices. Not sure if this is correct.
  • scsiata.cpp - set device type as sat+<oldname> if scsidev->get_dev_type() is not "scsi".

Example:

[root@p2986890 smartmontools]# ./smartctl --scan
/dev/sda -d scsi # /dev/sda, SCSI device
/dev/bus/0 -d megaraid,5 # /dev/bus/0 [megaraid_disk_05], SCSI device
/dev/bus/0 -d megaraid,7 # /dev/bus/0 [megaraid_disk_07], SCSI device
[root@p2986890 smartmontools]# ./smartctl --scan-open
# /dev/sda -d scsi # /dev/sda, SCSI device open failed: DELL or MegaRaid controller, please try adding '-d megaraid,N'
/dev/bus/0 -d sat+megaraid,5 # /dev/bus/0 [megaraid_disk_05] [SAT], ATA device
/dev/bus/0 -d sat+megaraid,7 # /dev/bus/0 [megaraid_disk_07] [SAT], ATA device

[root@p2986890 smartmontools]# ./smartd -d 
smartd 6.1 2012-12-14 r3732M [x86_64-linux-2.6.32-279.14.1.el6.x86_64] (local build)
Copyright (C) 2002-12, Bruce Allen, Christian Franke, www.smartmontools.org

No configuration file /usr/local/etc/smartd.conf found, scanning devices
glob(3) found no matches for pattern /dev/hd[a-t]
glob(3) found no matches for pattern /dev/sd[a-c][a-z]
Device: /dev/sda, open() failed: DELL or MegaRaid controller, please try adding '-d megaraid,N'
Device: /dev/bus/0 [megaraid_disk_05], type changed from 'megaraid,5' to 'sat+megaraid,5'
Device: /dev/bus/0 [megaraid_disk_05] [SAT], opened
Device: /dev/bus/0 [megaraid_disk_05] [SAT], WDC WD1003FBYX-01Y7B1, S/N:WD-XXXX, WWN:XXXX, FW:01.01V02, 1.00 TB
Device: /dev/bus/0 [megaraid_disk_05] [SAT], found in smartd database: Western Digital RE4 Serial ATA
Device: /dev/bus/0 [megaraid_disk_05] [SAT], not capable of SMART Health Status check
Device: /dev/bus/0 [megaraid_disk_05] [SAT], is SMART capable. Adding to "monitor" list.
Device: /dev/bus/0 [megaraid_disk_07], type changed from 'megaraid,7' to 'sat+megaraid,7'
Device: /dev/bus/0 [megaraid_disk_07] [SAT], opened
Device: /dev/bus/0 [megaraid_disk_07] [SAT], WDC WD1003FBYX-01Y7B1, S/N:WD-XXXX, WWN:XXXX, FW:01.01V02, 1.00 TB
Device: /dev/bus/0 [megaraid_disk_07] [SAT], found in smartd database: Western Digital RE4 Serial ATA
Device: /dev/bus/0 [megaraid_disk_07] [SAT], not capable of SMART Health Status check
Device: /dev/bus/0 [megaraid_disk_07] [SAT], is SMART capable. Adding to "monitor" list.
Monitoring 2 ATA and 0 SCSI devices
Device: /dev/bus/0 [megaraid_disk_05] [SAT], opened ATA device
Device: /dev/bus/0 [megaraid_disk_05] [SAT], previous self-test completed without error
Device: /dev/bus/0 [megaraid_disk_07] [SAT], opened ATA device
Device: /dev/bus/0 [megaraid_disk_07] [SAT], previous self-test completed without error

Attachments (1)

patch.diff (11.6 KB) - added by Alex Samorukov 8 years ago.
Updated patch with --scan-open fix

Download all attachments as: .zip

Change History (4)

comment:1 Changed 8 years ago by Alex Samorukov

Description: modified (diff)
Owner: changed from somebody to Alex Samorukov
Status: newassigned

comment:2 Changed 8 years ago by Alex Samorukov

Description: modified (diff)

Changed 8 years ago by Alex Samorukov

Attachment: patch.diff added

Updated patch with --scan-open fix

comment:3 Changed 8 years ago by Alex Samorukov

Resolution: fixed
Status: assignedclosed

Patch committed in r3734.

Note: See TracTickets for help on using tickets.