Linux Kernel – Ignore a Disk Completely

bootdisk-managementssdudev

Notice

Please scroll down for the answer (it has few points but it is the correct one). The problem is solved by a patch that will be in kernel 3.12.7 and up; I hope it will back-ported to earlier ones, too.

My laptop is a Samsung Chronos serie s 7. Ubuntu Gnome Remix 13.04, with Intel updated drivers.

I have a problem with the internal SSD drive (8G capacity). It fails with COMRESET and input/output errors. I am quite convinced that the problem is hardware; unfortunately I do not have Windows installed in the laptop to check if it's a matter of SSD configuration or whatever.

The problem is that the disk is recognized by udev:

KERNEL[9.515930] add      /devices/pci0000:00/0000:00:1f.2/ata2/host1/target1:0:0/1:0:0:0/block/sdb (block)
ACTION=add
DEVNAME=sdb
DEVPATH=/devices/pci0000:00/0000:00:1f.2/ata2/host1/target1:0:0/1:0:0:0/block/sdb
DEVTYPE=disk
MAJOR=8
MINOR=16
SEQNUM=1785
SUBSYSTEM=block
UDEV_LOG=3

and after that it fails in a lot of checks, delaying boot, delaying shutdown, and making (I think) suspend impossible.

Is it possible to tell Linux to completely ignore anything on the ata2 link? I tried adding this line to /etc/udev/rules.d/10-local.rules

SUBSYSTEMS=="pci"  DRIVERS=="ahci" KERNELS=="ata2" OPTIONS=="ignore_device"

but it doesn't work.

On the other hand, if anyone knows how to reset the SSD if it was left in "cache" mode without using Windows… or to boot a "live" windows to do the same…

Thanks!

Data added:

Full udevadm info -a -n /dev/sdb pasted to http://paste.ubuntu.com/6186145/

smartctl -i /dev/sdb -T permissive gives:

root@samsung-romano:/home/romano# smartctl -i /dev/sdb -T permissive
smartctl 5.43 2012-06-30 r3573 [x86_64-linux-3.8.0-31-generic] (local build)
Copyright (C) 2002-12 by Bruce Allen, http://smartmontools.sourceforge.net

Vendor:               /1:0:0:0
Product:              
User Capacity:        600,332,565,813,390,450 bytes [600 PB]
Logical block size:   774843950 bytes
>> Terminate command early due to bad response to IEC mode page

which is clearly wrong. Nevertheless:

root@samsung-romano:/home/romano# fdisk -b 512 -C 970 -H 256 -S 63 /dev/sdb
fdisk: unable to read /dev/sdb: Input/output error

(SSD data from http://ubuntuforums.org/showthread.php?t=1935699&p=11739579#post11739579 ).

ADDITIONAL THOUGHT:

Could all this being a side effect of the Intel Smart Response Technology not being disabled before installing Linux? If yes, how can I check it short of reinstalling a windows on the machine? Or this is a shot in the dark? (In the bios the SSD drive doesn't show and there is nothing about Intel SRT).

ABOUT MARKING AS DUPLICATE:

I changed the title of the question; I do not think that the linked question answers my problem. I positively know that the SSD is failing. I am asking if it's possible to tell the linux kernel to not probe for it at all.

Best Answer

Two solutions here: one is fast to apply, although solves the problem only partially, the other one is the complete one but requires you to compile your own kernel.

The correct answer is a kernel patch.

Robin H. Johnson wrote a patch for the SATA kernel driver (find it in Unix/Linux stack exchange site) which hides completely the drive.

Update 1 The patch is now upstream (at least in 3.12.7 stable kernel), see the git repository. I asked for backport in the Ubuntu launchpad.

Update 2 The patch is in the standard kernel for Ubuntu Trusty Thar 14.04; so now only the following addition to boot parameter is needed.

Once the patch is installed, adding

 libata.force=2.00:disable

to the kernel boot parameters will hide the disk from the Linux kernel. Double check that the number is correct; searching for the device name can help:

(0)samsung-romano:~% dmesg | grep iSSD
[    1.493279] ata2.00: ATA-8: SanDisk iSSD P4 8GB, SSD 9.14, max UDMA/133
[    1.494236] scsi 1:0:0:0: Direct-Access     ATA      SanDisk iSSD P4  SSD  PQ: 0 ANSI: 5

To add a kernel parameter (bot temporarily and permanently) you can check this Q&A: How do I add a kernel boot parameter?

Workaround

At least the problem of enabling suspend-resume has been solved by by Unix StackExchange user Emmanuel in https://unix.stackexchange.com/a/103742/52205. As root, issue the command:

echo 1 > /sys/block/sdb/device/delete

before suspend.

To make it permanent, add the following file in /etc/pm/sleep.d/ and make it executable:

-rwxr-xr-x 1 root root 204 Dec  6 16:03 99_delete_sdb

with content:

#!/bin/sh

# Delete the failing disk so that it will not block suspend

case "$1" in
    suspend|hibernate)
        if [ -d /sys/block/sdb ]; then
            echo 1 > /sys/block/sdb/device/delete       
        fi
        ;;
esac

...and now the system suspends (and resume) correctly.

Related Question