What you are seeing
sd 1:0:8:0: [sda] tag#7835 FAILED Result: hostbyte=DID_SOFT_ERROR driverbyte=DRIVER_OK
CDB: Write(32) …
Buffer I/O error on dev sda2 … lost async page write
DID_SOFT_ERROR = the drive rejected the command but the HBA thinks a retry might succeed.
Every failing CDB is a WRITE. Reads succeed, so the device can be probed (sg_scan, SMART, etc.) but nothing can be written, therefore mkfs.ext4 dies.
Linux marks the disk “rotational” because it never gets a valid cache-mode/rotation-rate page; that part is just cosmetic.
Root cause
Those IBM-branded SAS SSDs come from a Storwize / FlashSystem shelf. They left the factory formatted for T10-PI Type 1 (512 + 8 byte “protection information”). The user data area is still 512 B, so sg_scan quite correctly prints “512”. But every 512-byte sector must be accompanied by 8 bytes of CRC/LBA tags; when your Dell HBA (or Linux) sends a plain 512-byte WRITE the SSD refuses it and you get the flood of DID_SOFT_ERRORs.
How to prove it
# Needs sg3_utils
sg_vpd -p bl /dev/sgX | grep -i 'protection'
# or
sg_format -v /dev/sgX | grep 'Protection'
If the drive says “formatted with type 1 protection” or similar, it is in PI mode. (Linux will happily skip this detail in the normal inquiry output, which is why it looked like a plain 512-B disk.)
Fix: Re-format with PI = 0 You must do this on a plain SAS HBA/IT-mode controller; a RAID-mode PERC will refuse the FORMAT UNIT command.
# identify first – do NOT shoot the wrong disk
sg_inq /dev/sgX | head
sg_readcap -l /dev/sgX
# the destructive bit
sg_format --format --size=512 --fmtpinfo=0 --pfu=0 /dev/sgX # PI disabled
--fmtpinfo=0
⇒ protection information = 0 (plain 512 B)
--pfu=0
⇒ “protection field usage” off (mandatory when clearing PI)
The format takes a few minutes; let it finish, then power-cycle the SSD. Details: see the sg_format(8) man-page.
Once PI is disabled the disks work like any other SAS SSD in a Dell R640.
SSD detected as HDD
Why the kernel still thinks it’s an HDD IBM left the “Nominal media rotation rate” VPD field at 0.
Linux interprets that as “unknown ⇒ assume rotational = 1”. After the re-format you can ignore it or force-override:
echo 0 > /sys/block/sdX/queue/rotational
It has no impact on performance; queue-scheduler heuristics are SSD-aware since kernel 5.x anyway.