From: Damien Le Moal <dlemoal@kernel.org>
To: "Martin K . Petersen" <martin.petersen@oracle.com>,
James Bottomley <James.Bottomley@HansenPartnership.com>,
linux-scsi@vger.kernel.org, linux-ide@vger.kernel.org
Subject: Re: [PATCH v2] scsi: sd: Introduce manage_shutdown device flag
Date: Thu, 26 Oct 2023 10:40:47 +0900 [thread overview]
Message-ID: <cd23574d-ed0c-47b8-83eb-7154c30e5827@kernel.org> (raw)
In-Reply-To: <20231026013909.24301-1-dlemoal@kernel.org>
On 10/26/23 10:39, Damien Le Moal wrote:
> Commit aa3998dbeb3a ("ata: libata-scsi: Disable scsi device
> manage_system_start_stop") change setting the manage_system_start_stop
> flag to false for libata managed disks to enable libata internal
> management of disk suspend/resume. However, a side effect of this change
> is that on system shutdown, disks are no longer being stopped (set to
> standby mode with the heads unloaded). While this is not a critical
> issue, this unclean shutdown is not recommended and shows up with
> increased smart counters (e.g. the unexpected power loss counter
> "Unexpect_Power_Loss_Ct").
>
> Instead of defining a shutdown driver method for all ATA adapter
> drivers (not all of them define that operation), this patch resolves
> this issue by further refining the sd driver start/stop control of disks
> using the new flag manage_shutdown. If this new flag is set to true by
> a low level driver, the function sd_shutdown() will issue a
> START STOP UNIT command with the start argument set to 0 when a disk
> needs to be powered off (suspended) on system power off, that is, when
> system_state is equal to SYSTEM_POWER_OFF.
>
> Similarly to the other manage_xxx flags, the new manage_shutdown flag is
> exposed through sysfs as a read-write device attribute.
>
> To avoid any confusion between manage_shutdown and
> manage_system_start_stop, the comments describing these flags in
> include/scsi/scsi.h are also improved.
>
> Fixes: aa3998dbeb3a ("ata: libata-scsi: Disable scsi device manage_system_start_stop")
> Cc: stable@vger.kernel.org
> Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218038
> Link: https://lore.kernel.org/all/cd397c88-bf53-4768-9ab8-9d107df9e613@gmail.com/
> Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
> ---
Oops... Forgot to add the changelog:
Changes from v1:
- Improved flags description in include/scsi/scsi_device.h
- Added missing sysfs export of manage_shutdown
> drivers/ata/libata-scsi.c | 5 +++--
> drivers/firewire/sbp2.c | 1 +
> drivers/scsi/sd.c | 39 +++++++++++++++++++++++++++++++++++---
> include/scsi/scsi_device.h | 20 +++++++++++++++++--
> 4 files changed, 58 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
> index a371b497035e..3a957c4da409 100644
> --- a/drivers/ata/libata-scsi.c
> +++ b/drivers/ata/libata-scsi.c
> @@ -1053,10 +1053,11 @@ int ata_scsi_dev_config(struct scsi_device *sdev, struct ata_device *dev)
>
> /*
> * Ask the sd driver to issue START STOP UNIT on runtime suspend
> - * and resume only. For system level suspend/resume, devices
> - * power state is handled directly by libata EH.
> + * and resume and shutdown only. For system level suspend/resume,
> + * devices power state is handled directly by libata EH.
> */
> sdev->manage_runtime_start_stop = true;
> + sdev->manage_shutdown = true;
> }
>
> /*
> diff --git a/drivers/firewire/sbp2.c b/drivers/firewire/sbp2.c
> index 749868b9e80d..7edf2c95282f 100644
> --- a/drivers/firewire/sbp2.c
> +++ b/drivers/firewire/sbp2.c
> @@ -1521,6 +1521,7 @@ static int sbp2_scsi_slave_configure(struct scsi_device *sdev)
> if (sbp2_param_exclusive_login) {
> sdev->manage_system_start_stop = true;
> sdev->manage_runtime_start_stop = true;
> + sdev->manage_shutdown = true;
> }
>
> if (sdev->type == TYPE_ROM)
> diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
> index 83b6a3f3863b..6effa13039f3 100644
> --- a/drivers/scsi/sd.c
> +++ b/drivers/scsi/sd.c
> @@ -209,7 +209,8 @@ manage_start_stop_show(struct device *dev,
>
> return sysfs_emit(buf, "%u\n",
> sdp->manage_system_start_stop &&
> - sdp->manage_runtime_start_stop);
> + sdp->manage_runtime_start_stop &&
> + sdp->manage_shutdown);
> }
> static DEVICE_ATTR_RO(manage_start_stop);
>
> @@ -275,6 +276,35 @@ manage_runtime_start_stop_store(struct device *dev,
> }
> static DEVICE_ATTR_RW(manage_runtime_start_stop);
>
> +static ssize_t manage_shutdown_show(struct device *dev,
> + struct device_attribute *attr, char *buf)
> +{
> + struct scsi_disk *sdkp = to_scsi_disk(dev);
> + struct scsi_device *sdp = sdkp->device;
> +
> + return sysfs_emit(buf, "%u\n", sdp->manage_shutdown);
> +}
> +
> +static ssize_t manage_shutdown_store(struct device *dev,
> + struct device_attribute *attr,
> + const char *buf, size_t count)
> +{
> + struct scsi_disk *sdkp = to_scsi_disk(dev);
> + struct scsi_device *sdp = sdkp->device;
> + bool v;
> +
> + if (!capable(CAP_SYS_ADMIN))
> + return -EACCES;
> +
> + if (kstrtobool(buf, &v))
> + return -EINVAL;
> +
> + sdp->manage_shutdown = v;
> +
> + return count;
> +}
> +static DEVICE_ATTR_RW(manage_shutdown);
> +
> static ssize_t
> allow_restart_show(struct device *dev, struct device_attribute *attr, char *buf)
> {
> @@ -607,6 +637,7 @@ static struct attribute *sd_disk_attrs[] = {
> &dev_attr_manage_start_stop.attr,
> &dev_attr_manage_system_start_stop.attr,
> &dev_attr_manage_runtime_start_stop.attr,
> + &dev_attr_manage_shutdown.attr,
> &dev_attr_protection_type.attr,
> &dev_attr_protection_mode.attr,
> &dev_attr_app_tag_own.attr,
> @@ -3819,8 +3850,10 @@ static void sd_shutdown(struct device *dev)
> sd_sync_cache(sdkp, NULL);
> }
>
> - if (system_state != SYSTEM_RESTART &&
> - sdkp->device->manage_system_start_stop) {
> + if ((system_state != SYSTEM_RESTART &&
> + sdkp->device->manage_system_start_stop) ||
> + (system_state == SYSTEM_POWER_OFF &&
> + sdkp->device->manage_shutdown)) {
> sd_printk(KERN_NOTICE, sdkp, "Stopping disk\n");
> sd_start_stop_device(sdkp, 0);
> }
> diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
> index fd41fdac0a8e..d87bc57da8bf 100644
> --- a/include/scsi/scsi_device.h
> +++ b/include/scsi/scsi_device.h
> @@ -162,8 +162,24 @@ struct scsi_device {
> * core. */
> unsigned int eh_timeout; /* Error handling timeout */
>
> - bool manage_system_start_stop; /* Let HLD (sd) manage system start/stop */
> - bool manage_runtime_start_stop; /* Let HLD (sd) manage runtime start/stop */
> + /*
> + * If true, let the high-level device driver (sd) manage the device
> + * power state for system suspend/resume (suspend to RAM and
> + * hybernation) operations.
> + */
> + bool manage_system_start_stop;
> +
> + /*
> + * If true, let the high-level device driver (sd) manage the device
> + * power state for runtime device suspand and resume operations.
> + */
> + bool manage_runtime_start_stop;
> +
> + /*
> + * If true, let the high-level device driver (sd) manage the device
> + * power state for system shutdown (power off) operations.
> + */
> + bool manage_shutdown;
>
> unsigned removable:1;
> unsigned changed:1; /* Data invalid due to media change */
--
Damien Le Moal
Western Digital Research
next prev parent reply other threads:[~2023-10-26 1:40 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-26 1:39 [PATCH v2] scsi: sd: Introduce manage_shutdown device flag Damien Le Moal
2023-10-26 1:40 ` Damien Le Moal [this message]
2023-10-26 8:56 ` Niklas Cassel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=cd23574d-ed0c-47b8-83eb-7154c30e5827@kernel.org \
--to=dlemoal@kernel.org \
--cc=James.Bottomley@HansenPartnership.com \
--cc=linux-ide@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.