From: Jens Axboe <axboe@kernel.dk>
To: Lukas Prediger <lumip@lumip.de>
Cc: linux-kernel@vger.kernel.org
Subject: Re: [PATCH] drivers/cdrom: improved ioctl for media change detection
Date: Thu, 26 Aug 2021 16:38:17 -0600 [thread overview]
Message-ID: <6d6c533d-465e-33ee-5801-cb7ea84924a8@kernel.dk> (raw)
In-Reply-To: <20210805194417.12439-1-lumip@lumip.de>
On 8/5/21 1:44 PM, Lukas Prediger wrote:
> The current implementation of the CDROM_MEDIA_CHANGED ioctl relies on
> global state, meaning that only one process can detect a disc change
> while the ioctl call will return 0 for other calling processes afterwards
> (see bug 213267 ).
>
> This introduces a new cdrom ioctl, CDROM_TIMED_MEDIA_CHANGE, that
> works by maintaining a timestamp of the last detected disc change instead
> of a boolean flag: Processes calling this ioctl command can provide
> a timestamp of the last disc change known to them and receive
> an indication whether the disc was changed since then and the updated
> timestamp.
>
> I considered fixing the buggy behavior in the original
> CDROM_MEDIA_CHANGED ioctl but that would require maintaining state
> for each calling process in the kernel, which seems like a worse
> solution than introducing this new ioctl.
>
> Signed-off-by: Lukas Prediger <lumip@lumip.de>
> ---
> This is my first patch sent to the kernel and I followed the recommended
> process as closely as I could. If I misstepped somewhere, please let me know.
> I also tried to find a mailing list more specific to the problem but was unable,
> please inform me if there is one where this should be sent instead.
>
> Finally, I wasn't sure whether/how to add my name to the updated docs
> and if I should update the date on them (there have been some recent commits
> that did not result in credits given to the commit author or updating
> the dates in the docs, but those did not add any new content either), so
> info in the most appropriate way would be welcome.
Thanks for sending in the patch, appologies it's taken so long to get a
response. CDROM isn't really actively maintained much these days,
unfortunately. Should get a new maintainer.
Anyway, for this patch, few comments inline.
> diff --git a/Documentation/cdrom/cdrom-standard.rst b/Documentation/cdrom/cdrom-standard.rst
> index 5845960ca382..8b219ba9b427 100644
> --- a/Documentation/cdrom/cdrom-standard.rst
> +++ b/Documentation/cdrom/cdrom-standard.rst
> @@ -3,9 +3,10 @@ A Linux CD-ROM standard
> =======================
>
> :Author: David van Leeuwen <david@ElseWare.cistron.nl>
> -:Date: 12 March 1999
> +:Date: 5 August 2021
> :Updated by: Erik Andersen (andersee@debian.org)
> :Updated by: Jens Axboe (axboe@image.dk)
> +:Updated by: Lukas Prediger (lumip@lumip.de)
Drop these changes, this is from a time from before git and revision
history, no need to update them further.
> diff --git a/Documentation/userspace-api/ioctl/cdrom.rst b/Documentation/userspace-api/ioctl/cdrom.rst
> index 3b4c0506de46..59305d04d034 100644
> --- a/Documentation/userspace-api/ioctl/cdrom.rst
> +++ b/Documentation/userspace-api/ioctl/cdrom.rst
> @@ -3,8 +3,9 @@ Summary of CDROM ioctl calls
> ============================
>
> - Edward A. Falk <efalk@google.com>
> +- Lukas Prediger <lumip@lumip.de>
>
> -November, 2004
> +August, 2021
Ditto
> diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c
> index feb827eefd1a..af0721c96e06 100644
> --- a/drivers/cdrom/cdrom.c
> +++ b/drivers/cdrom/cdrom.c
> @@ -344,6 +344,12 @@ static void cdrom_sysctl_register(void);
>
> static LIST_HEAD(cdrom_list);
>
> +static void signal_media_change(struct cdrom_device_info *cdi)
> +{
> + cdi->mc_flags = 0x3; /* set media changed bits, on both queues */
> + cdi->last_media_change_time = ktime_get_mono_fast_ns();
> +}
I'd just use jiffies for this, it's not really a case of something that
needs a fine grained clock source. That'll give you 1-10ms resolution,
which should be more than adequate for this. Then use jiffies_to_msecs()
and make the API be in miliseconds.
> @@ -2391,6 +2397,46 @@ static int cdrom_ioctl_media_changed(struct cdrom_device_info *cdi,
> return ret;
> }
>
> +/*
> + * Media change detection with timing information.
> + *
> + * arg is a pointer to a cdrom_timed_media_change_info struct.
> + * arg->last_media_change may be set by calling code to signal
> + * the timestamp of the last known media change (by the caller).
> + * Upon successful return, ioctl call will set arg->last_media_change
> + * to the latest media change timestamp known by the kernel/driver
> + * and set arg->has_changed to 1 if that timestamp is more recent
> + * than the timestamp set by the caller.
> + */
> +static int cdrom_ioctl_timed_media_change(struct cdrom_device_info *cdi,
> + unsigned long arg)
> +{
> + int ret;
> + struct cdrom_timed_media_change_info __user *info;
> + struct cdrom_timed_media_change_info tmp_info;
> +
> + if (!CDROM_CAN(CDC_MEDIA_CHANGED))
> + return -ENOSYS;
> +
> + info = (struct cdrom_timed_media_change_info __user *)arg;
> + cd_dbg(CD_DO_IOCTL, "entering CDROM_TIMED_MEDIA_CHANGE\n");
> +
> + ret = cdrom_ioctl_media_changed(cdi, CDSL_CURRENT);
> + if (ret < 0)
> + return ret;
> +
> + if (copy_from_user(&tmp_info, info, sizeof(tmp_info)) != 0)
> + return -EFAULT;
> +
> + tmp_info.has_changed = (tmp_info.last_media_change < cdi->last_media_change_time);
If you make the jiffies change, you can use time_before() etc on these
which avoids the wrap.
> @@ -295,6 +297,19 @@ struct cdrom_generic_command
> };
> };
>
> +/* This struct is used by CDROM_TIMED_MEDIA_CHANGE */
> +struct cdrom_timed_media_change_info
> +{
> + __u64 last_media_change; /* Timestamp of the last detected media
> + * change. May be set by caller, updated
> + * upon successful return of ioctl.
> + */
> + __u8 has_changed; /* Set to 1 by ioctl if last detected media
> + * change was more recent than
> + * last_media_change set by caller.
> + */
> +};
The struct layout should be modified such that there are no holes or
padding in it. Probably just make the has_changed a flags thing, and
make it u64 as well. Then you can define bit 0 to be HAS_CHANGED, and
that leaves you room to add more flags in the future. Though the latter
probably isn't much of a concern here, but...
--
Jens Axboe
next prev parent reply other threads:[~2021-08-26 22:38 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-05 19:44 [PATCH] drivers/cdrom: improved ioctl for media change detection Lukas Prediger
2021-08-26 18:01 ` Lukas Prediger
2021-08-26 22:38 ` Jens Axboe [this message]
2021-08-27 17:30 ` Lukas Prediger
2021-08-28 3:18 ` Jens Axboe
2021-08-28 10:27 ` Lukas Prediger
2021-08-28 13:22 ` Jens Axboe
2021-09-06 16:53 ` Lukas Prediger
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=6d6c533d-465e-33ee-5801-cb7ea84924a8@kernel.dk \
--to=axboe@kernel.dk \
--cc=linux-kernel@vger.kernel.org \
--cc=lumip@lumip.de \
/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.