linux-ide.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Fixing halt/shutdown for libata spindown handling
@ 2007-05-15  3:29 Daniel Drake
  2007-05-15  8:20 ` Tejun Heo
  0 siblings, 1 reply; 7+ messages in thread
From: Daniel Drake @ 2007-05-15  3:29 UTC (permalink / raw)
  To: linux-ide

[-- Attachment #1: Type: text/plain, Size: 2194 bytes --]

Hi,

I just took a quick look into modifying halt to work as suggested for 
the new libata spindown code.

Here's how it works in Gentoo at the moment: /sbin/halt is called 
typically with the "-d -p -i -h" arguments. After doing some 
halt-specific things (such as spinning down disks per the -h argument), 
halt calls /sbin/shutdown which presumably finishes the task. This is 
with sysvinit-2.86

So, I was expecting to jump into the halt source code, find the "-h" 
argument parsing, and see code for it spinning down all the disks.

I was surprised to find that the /sbin/halt spin down implementation is 
very limited, it only works for IDE disks (by working through 
/proc/ide). This doesn't make sense to me, the libata commits state that 
userspace shutdown is spinning down libata disks.

So, this means that other distro's do it differently? I'd appreciate 
some pointers to what happens elsewhere.

I have attached the code from sysvinit which spins down the disks. It's 
not modified by the patches below.

Gentoo uses sysvinit from here:
ftp://sunsite.unc.edu/pub/Linux/system/daemons/init/sysvinit-2.86.tar.gz

Patched with:
http://sources.gentoo.org/viewcvs.py/*checkout*/gentoo-x86/sys-apps/sysvinit/files/sysvinit-2.86-docs.patch
http://sources.gentoo.org/viewcvs.py/*checkout*/gentoo-x86/sys-apps/sysvinit/files/sysvinit-2.86-shutdown-usage.patch
http://sources.gentoo.org/viewcvs.py/*checkout*/gentoo-x86/sys-apps/sysvinit/files/sysvinit-2.86-off-by-one.patch
http://distfiles.gentoo.org/distfiles/sysvinit-2.86-kexec.patch
http://sources.gentoo.org/viewcvs.py/*checkout*/gentoo-x86/sys-apps/sysvinit/files/sysvinit-2.86-execl.patch
http://sources.gentoo.org/viewcvs.py/*checkout*/gentoo-x86/sys-apps/sysvinit/files/sysvinit-2.86-utmp-64bit.patch
http://sources.gentoo.org/viewcvs.py/*checkout*/gentoo-x86/sys-apps/sysvinit/files/sysvinit-2.86-shutdown-single.patch

If I'm right and Gentoo is currently not spinning down SCSI/libata 
disks, the only /sbin/halt modification required is to write 0 into
/sys/modules/libata/parameters/spindown_compat right?

Final question: should spindown_compat be set to 0 for both shutdown and 
reboot, or just shutdown?

Thanks,
Daniel

[-- Attachment #2: hddown.c --]
[-- Type: text/x-csrc, Size: 2214 bytes --]

/*
 * hddown.c	Find all disks on the system and
 *		shut them down.
 *
 */
char *v_hddown = "@(#)hddown.c  1.02  22-Apr-2003  miquels@cistron.nl";

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <string.h>
#include <fcntl.h>
#include <dirent.h>

#ifdef __linux__

#include <sys/ioctl.h>
#include <linux/hdreg.h>

#define MAX_DISKS	64
#define PROC_IDE	"/proc/ide"
#define DEV_BASE	"/dev"

/*
 *	Find all IDE disks through /proc.
 */
static int find_idedisks(char **dev, int maxdev)
{
	DIR *dd;
	FILE *fp;
	struct dirent *d;
	char buf[256];
	int i = 0;

	if ((dd = opendir(PROC_IDE)) == NULL)
		return -1;

	while ((d = readdir(dd)) != NULL) {
		if (strncmp(d->d_name, "hd", 2) != 0)
			continue;
		buf[0] = 0;
		snprintf(buf, sizeof(buf), PROC_IDE "/%s/media", d->d_name);
		if ((fp = fopen(buf, "r")) == NULL)
			continue;
		if (fgets(buf, sizeof(buf), fp) == 0 ||
		    strcmp(buf, "disk\n") != 0) {
			fclose(fp);
			continue;
		}
		fclose(fp);
		snprintf(buf, sizeof(buf), DEV_BASE "/%s", d->d_name);
		dev[i++] = strdup(buf);
		if (i >= maxdev)
			break;
	}
	closedir(dd);
	if (i < maxdev) dev[i] = NULL;

	return 0;
}

/*
 *	Put an IDE disk in standby mode.
 *	Code stolen from hdparm.c
 */
static int do_standby_idedisk(char *device)
{
#ifndef WIN_STANDBYNOW1
#define WIN_STANDBYNOW1 0xE0
#endif
#ifndef WIN_STANDBYNOW2
#define WIN_STANDBYNOW2 0x94
#endif
	unsigned char args1[4] = {WIN_STANDBYNOW1,0,0,0};
	unsigned char args2[4] = {WIN_STANDBYNOW2,0,0,0};
	int fd;

	if ((fd = open(device, O_RDWR)) < 0)
		return -1;

	if (ioctl(fd, HDIO_DRIVE_CMD, &args1) &&
	    ioctl(fd, HDIO_DRIVE_CMD, &args2))
		return -1;

	return 0;
}

/*
 *	First find all IDE disks, then put them in standby mode.
 *	This has the side-effect of flushing the writecache,
 *	which is exactly what we want on poweroff.
 */
int hddown(void)
{
	char *disks[MAX_DISKS+1];
	int i;

	if (find_idedisks(disks, MAX_DISKS) < 0)
		return -1;

	for (i = 0; disks[i] && i < MAX_DISKS; i++)
		do_standby_idedisk(disks[i]);

	return 0;
}

#else /* __linux__ */

int hddown(void)
{
	return 0;
}

#endif /* __linux__ */

#ifdef STANDALONE
int main(int argc, char **argv)
{
	return (hddown() == 0);
}
#endif


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Fixing halt/shutdown for libata spindown handling
  2007-05-15  3:29 Fixing halt/shutdown for libata spindown handling Daniel Drake
@ 2007-05-15  8:20 ` Tejun Heo
  2007-05-15 10:31   ` Francesco Pretto
  2007-05-17  1:16   ` Daniel Drake
  0 siblings, 2 replies; 7+ messages in thread
From: Tejun Heo @ 2007-05-15  8:20 UTC (permalink / raw)
  To: Daniel Drake; +Cc: linux-ide

Hello, Daniel.

Daniel Drake wrote:
> I was surprised to find that the /sbin/halt spin down implementation is
> very limited, it only works for IDE disks (by working through
> /proc/ide). This doesn't make sense to me, the libata commits state that
> userspace shutdown is spinning down libata disks.
> 
> So, this means that other distro's do it differently? I'd appreciate
> some pointers to what happens elsewhere.

Debian (and thus probably ubuntu) issues STADNBYNOW without FLUSH.
Opensuse doesn't seem to do anything and there's another distro which
does both, not sure which tho.  Hmm... If the upstream sysvinit code
doesn't contain spindown code, it's more likely we have more distros
which don't do anything.  If that's the case, it will be worthwhile to
detect that STANDBYNOW isn't issued and skip compat checking and just do
it.  I'll come up with a patch, please wait a bit before releasing the
update.

[--snip--]
> If I'm right and Gentoo is currently not spinning down SCSI/libata
> disks, the only /sbin/halt modification required is to write 0 into
> /sys/modules/libata/parameters/spindown_compat right?

Yes, that will make all kernels from now on behave correctly, but doing
FLUSH CACHE followed by STANDBYNOW on older kernels (kernels without
manage_start_stop) would help.

> Final question: should spindown_compat be set to 0 for both shutdown and
> reboot, or just shutdown?

It doesn't really matter.  It just needs to be set while powering down.
 You can set it anywhere, during boot, in shutdown.

Thanks.

-- 
tejun

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Fixing halt/shutdown for libata spindown handling
  2007-05-15  8:20 ` Tejun Heo
@ 2007-05-15 10:31   ` Francesco Pretto
  2007-05-15 10:42     ` Tejun Heo
  2007-05-17  1:16   ` Daniel Drake
  1 sibling, 1 reply; 7+ messages in thread
From: Francesco Pretto @ 2007-05-15 10:31 UTC (permalink / raw)
  To: linux-ide

Tejun Heo <htejun <at> gmail.com> writes:
> 
> > Final question: should spindown_compat be set to 0 for both shutdown and
> > reboot, or just shutdown?
> 
> It doesn't really matter.  It just needs to be set while powering down.
>  You can set it anywhere, during boot, in shutdown.
> 
> Thanks.
> 

Hibernate/suspend shall be also considered. Setting it during boot it's one time
for every poweroff conditions, but i can't say if it's the best approach.

Regards


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Fixing halt/shutdown for libata spindown handling
  2007-05-15 10:31   ` Francesco Pretto
@ 2007-05-15 10:42     ` Tejun Heo
  0 siblings, 0 replies; 7+ messages in thread
From: Tejun Heo @ 2007-05-15 10:42 UTC (permalink / raw)
  To: Francesco Pretto; +Cc: linux-ide

Francesco Pretto wrote:
> Tejun Heo <htejun <at> gmail.com> writes:
>>> Final question: should spindown_compat be set to 0 for both shutdown and
>>> reboot, or just shutdown?
>> It doesn't really matter.  It just needs to be set while powering down.
>>  You can set it anywhere, during boot, in shutdown.
>>
>> Thanks.
>>
> 
> Hibernate/suspend shall be also considered. Setting it during boot it's one time
> for every poweroff conditions, but i can't say if it's the best approach.

The compat thing is only for shutdown/powerdown.  Kernel will always
flush and spindown disks on suspends.  So, really, it doesn't matter
when you set the variable.

-- 
tejun

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Fixing halt/shutdown for libata spindown handling
  2007-05-15  8:20 ` Tejun Heo
  2007-05-15 10:31   ` Francesco Pretto
@ 2007-05-17  1:16   ` Daniel Drake
  2007-05-17 15:27     ` Tejun Heo
  1 sibling, 1 reply; 7+ messages in thread
From: Daniel Drake @ 2007-05-17  1:16 UTC (permalink / raw)
  To: Tejun Heo; +Cc: linux-ide

Hi Tejun,

Thanks for the fast response and action.

Tejun Heo wrote:
> it.  I'll come up with a patch, please wait a bit before releasing the
> update.

The patch has been merged into libata-dev.git so I'd like to revisit 
this topic now.

Am I right in saying, to fix 2.6.21, the following patches are needed, 
and no others, in this order:

sd: fix return value of sd_sync_cache()
3721050afc6cb6ddf6de0f782e2054ebcc225e9b
(not sure if this one is required?)

[SCSI] sd: implement START/STOP management
3c94c5a2fb43a654e777f509d5032b0db8ed09f

libata: reimplement suspend/resume support using sdev->manage_start_stop
9666f4009c22f6520ac3fb8a19c9e32ab973e828

libata: implement libata.spindown_compat
920a4b1038e442700a1cfac77ea7e20bd615a2c3

libata: fix shutdown warning message printing
da071b42f73dabbd0daf7ea4c3ff157d53b00648

libata: track spindown status and skip spindown_compat if possible
13b8d09f5de0aaa3153bbccc98baf247387823dc


Additionally, no userspace modifications are needed, at least while 
Gentoo's shutdown/halt programs are not attempting to spin down libata 
disks?

I note that the patch titled "SCSI: kill sht->suspend/resume" (not 
included in the above tree) is not yet merged into Linus' tree. Am I 
right in saying it's not required for the disk spindown stuff to work 
properly?

Thanks!
Daniel

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Fixing halt/shutdown for libata spindown handling
  2007-05-17  1:16   ` Daniel Drake
@ 2007-05-17 15:27     ` Tejun Heo
  2007-05-29 22:42       ` Daniel Drake
  0 siblings, 1 reply; 7+ messages in thread
From: Tejun Heo @ 2007-05-17 15:27 UTC (permalink / raw)
  To: Daniel Drake; +Cc: linux-ide

Hello,

Daniel Drake wrote:
> Am I right in saying, to fix 2.6.21, the following patches are needed,
> and no others, in this order:
> 
> sd: fix return value of sd_sync_cache()
> 3721050afc6cb6ddf6de0f782e2054ebcc225e9b
> (not sure if this one is required?)

It's a bug fix but not necessary for manage_start_stop.

> [SCSI] sd: implement START/STOP management
> 3c94c5a2fb43a654e777f509d5032b0db8ed09f

The commit is is missing the first 'c', so it's
c3c94c5a2fb43a654e777f509d5032b0db8ed09f.

> libata: reimplement suspend/resume support using sdev->manage_start_stop
> 9666f4009c22f6520ac3fb8a19c9e32ab973e828
> 
> libata: implement libata.spindown_compat
> 920a4b1038e442700a1cfac77ea7e20bd615a2c3
> 
> libata: fix shutdown warning message printing
> da071b42f73dabbd0daf7ea4c3ff157d53b00648
> 
> libata: track spindown status and skip spindown_compat if possible
> 13b8d09f5de0aaa3153bbccc98baf247387823dc

Now there's one more patch.

  http://article.gmane.org/gmane.linux.ide/18934

> Additionally, no userspace modifications are needed, at least while
> Gentoo's shutdown/halt programs are not attempting to spin down libata
> disks?

Yes.

> I note that the patch titled "SCSI: kill sht->suspend/resume" (not
> included in the above tree) is not yet merged into Linus' tree. Am I
> right in saying it's not required for the disk spindown stuff to work
> properly?

Yes, your right.  It's clean up of now unused feature and doesn't affect
any functionality.

One thing I'm worried about is reimplement-suspend-resume (9666f400).
It hasn't received testing in -mm and got merged into -rc, so it would
be a good idea to wait for a week or two and see whether any regression
is caused by the change before applying it to distro kernel.

Thanks.

-- 
tejun

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: Fixing halt/shutdown for libata spindown handling
  2007-05-17 15:27     ` Tejun Heo
@ 2007-05-29 22:42       ` Daniel Drake
  0 siblings, 0 replies; 7+ messages in thread
From: Daniel Drake @ 2007-05-29 22:42 UTC (permalink / raw)
  To: Tejun Heo; +Cc: linux-ide

Tejun Heo wrote:
> One thing I'm worried about is reimplement-suspend-resume (9666f400).
> It hasn't received testing in -mm and got merged into -rc, so it would
> be a good idea to wait for a week or two and see whether any regression
> is caused by the change before applying it to distro kernel.

Thanks for all your help. I included all these patches in a release made 
last week and have only received positive feedback so far.

For anyone else interested, here are the patches backported to 2.6.21. A 
couple needed small rediffs, there were a couple more than originally 
described in the earlier mails (patch dependencies etc), but if you 
apply the following as a whole it seems to work nicely:

http://dev.gentoo.org/~dsd/genpatches/trunk/2.6.21/2110_scsi-sd-printing.patch
http://dev.gentoo.org/~dsd/genpatches/trunk/2.6.21/2111_sd-start-stop.patch
http://dev.gentoo.org/~dsd/genpatches/trunk/2.6.21/2112_libata-suspend.patch
http://dev.gentoo.org/~dsd/genpatches/trunk/2.6.21/2113_libata-spindown-compat.patch
http://dev.gentoo.org/~dsd/genpatches/trunk/2.6.21/2114_libata-shutdown-warning.patch
http://dev.gentoo.org/~dsd/genpatches/trunk/2.6.21/2115_libata-spindown-status.patch
http://dev.gentoo.org/~dsd/genpatches/trunk/2.6.21/2116_libata-remove-spindown-compat.patch
http://dev.gentoo.org/~dsd/genpatches/trunk/2.6.21/2117_sata-via-suspend.patch
http://dev.gentoo.org/~dsd/genpatches/trunk/2.6.21/2118_scsi-constants.patch

These are all contained in
http://dev.gentoo.org/~dsd/genpatches/tarballs/genpatches-2.6.21-3.base.tar.bz2

Daniel

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2007-05-29 22:43 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-05-15  3:29 Fixing halt/shutdown for libata spindown handling Daniel Drake
2007-05-15  8:20 ` Tejun Heo
2007-05-15 10:31   ` Francesco Pretto
2007-05-15 10:42     ` Tejun Heo
2007-05-17  1:16   ` Daniel Drake
2007-05-17 15:27     ` Tejun Heo
2007-05-29 22:42       ` Daniel Drake

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).