[ltp] Make disk-protect work on 2.6.24 (was: enabling protect file for hdaps on t61)
Wed, 13 Feb 2008 12:39:17 +0100
Vincent C Jones <firstname.lastname@example.org> wrote:
> On Mon, 2008-02-11 at 07:58 +0100, Elias Oltmanns wrote:
>> Vincent C Jones <email@example.com> wrote:
>> > SATA drive here as well (7675 X61, AHCI mode, SuSE 10.3, 2.6.24 with
>> > SuSE, acpi, protect, & tp_smapi patches applied) and I have no problem
>> > invoking a freeze. What is your magic incantation to avoid the problem?
>> > I really would like to get HDAPS back...
>> The difference isn't so much SATA vs PATA but SMP system vs uniprocessor
>> / non-SMP system. Probably Rolf is running an SMP kernel on a dual core
>> machine whereas your system is lacking SMP support.
> Huh? SMP -> problem or SMP is OK? SMP kernel with dual core CPU = freeze
Quite right, my analysis was flawed since we seem to have a busy loop
rather than an infinite recursion. Since some of you don't have the
freeze problem, I suppose some kernel config options influence the
scheduler in such a way that I/O either gets a chance or not.
Anyway, there is a temporary solution to this problem. If you apply the
little patch attached to this email, the usual disk-protect patch will
work on 2.6.24. This change is supposed to fix a generic problem in
libata and may eventually be merged upstream, but Tejun Heo (libata
developer) said that some testing was required first.
This change is absolutely safe for everyone using a non-NCQ capable
system. In particular, ata_piix doesn't support NCQ. If you are using
ahci and /sys/class/scsi_disk/.../device/queue_depth reports a value
greater than 1, i.e. NCQ is enabled, then the patch shouldn't cause any
harm either but it may or may not affect I/O performance.
Content-Disposition: attachment; filename=adjust-blocked-counters.patch
drivers/ata/libata-scsi.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
index 14daf48..bab372b 100644
@@ -823,7 +823,7 @@ static void ata_scsi_sdev_config(struct
* prevent SCSI midlayer from automatically deferring
- sdev->max_device_blocked = 1;
+ sdev->max_device_blocked = 2;
static void ata_scsi_dev_config(struct scsi_device *sdev,
@@ -3120,7 +3120,7 @@ int ata_scsi_add_hosts(struct ata_host *
* Set host_blocked to 1 to prevent SCSI midlayer from
* automatically deferring requests.
- shost->max_host_blocked = 1;
+ shost->max_host_blocked = 2;
rc = scsi_add_host(ap->scsi_host, ap->host->dev);