All of lore.kernel.org
 help / color / mirror / Atom feed
From: ChenQi <Qi.Chen@windriver.com>
To: Koen Kooi <koen@dominion.thruhere.net>
Cc: openembedded-core@lists.openembedded.org
Subject: Re: [PATCH 1/1] systemd: fix systemd-udev-hwdb-update service
Date: Fri, 24 Oct 2014 15:37:49 +0800	[thread overview]
Message-ID: <544A01CD.8070704@windriver.com> (raw)
In-Reply-To: <E0AE8D91-A863-456F-9F59-BEBE56BCF062@dominion.thruhere.net>

On 10/24/2014 02:09 PM, Koen Kooi wrote:
>> Op 24 okt. 2014, om 07:58 heeft Chen Qi <Qi.Chen@windriver.com> het volgende geschreven:
>>
>> The new version of systemd has implemented the following feature.
>> Opointer.de/blog/projects/stateless.html
>>
>> As a result, the systemd-udev-hwdb-update.service would always run
>> at first boot. This will cause failure if the target device doesn't
>> have enough storage space. Besides, as we run `udevadm hwdb --update' as
>> a postinst of udev-hwdb at rootfs time, there's no need to run this
>> again at system start-up.
>>
>> The purpose of this patch is as follows.
>> If `udev hwdb --update' fails at rootfs time, systemd-udev-hwdb-update.service
>> is executed at first boot; otherwise, the service is not executed.
>>
>> This patch achieves the above goal by setting CondistonNeedsUpdate to
>> "/etc/udev" in the service file, and creating /etc/udev/.updated file if the
>> postinst succeeds.
> Ehm, /etc/udev can be created by other packages, why not test for the file you create?
>
> regards,
>
> Koen
>

Hi Koen,

The tested path must be a directory. If we test a file, then condition 
will always be true.

Below are the related codes from systemd:

<code_snippet>

static bool condition_test_needs_update(Condition *c) {
         const char *p;
         struct stat usr, other;

         assert(c);
         assert(c->parameter);
         assert(c->type == CONDITION_NEEDS_UPDATE);

         /* If the file system is read-only we shouldn't suggest an 
update */
         if (path_is_read_only_fs(c->parameter) > 0)
                 return c->negate;

         /* Any other failure means we should allow the condition to be 
true,
          * so that we rather invoke too many update tools then too
          * few. */

         if (!path_is_absolute(c->parameter))
                 return !c->negate;

         p = strappenda(c->parameter, "/.updated");
         if (lstat(p, &other) < 0)
                 return !c->negate;

         if (lstat("/usr/", &usr) < 0)
                 return !c->negate;

         return (usr.st_mtim.tv_sec > other.st_mtim.tv_sec ||
                 (usr.st_mtim.tv_sec == other.st_mtim.tv_sec && 
usr.st_mtim.tv_nsec > other.st_mtim.tv_nsec)) == !c->negate;
}

</code_snippet>

This patch makes use of the '.updated' trick.

Best Regards,
Chen Qi

>> Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
>> ---
>> meta/recipes-core/systemd/systemd_216.bb | 18 +++++++++++++++---
>> 1 file changed, 15 insertions(+), 3 deletions(-)
>>
>> diff --git a/meta/recipes-core/systemd/systemd_216.bb b/meta/recipes-core/systemd/systemd_216.bb
>> index ebf9395..cd81818 100644
>> --- a/meta/recipes-core/systemd/systemd_216.bb
>> +++ b/meta/recipes-core/systemd/systemd_216.bb
>> @@ -149,6 +149,10 @@ do_install() {
>>
>> 	# Enable journal to forward message to syslog daemon
>> 	sed -i -e 's/.*ForwardToSyslog.*/ForwardToSyslog=yes/' ${D}${sysconfdir}/systemd/journald.conf
>> +
>> +	# Make systemd-udev-hwdb-update to check /etc/udev
>> +	cp ${D}${systemd_unitdir}/system/systemd-udev-hwdb-update.service ${D}${sysconfdir}/systemd/system
>> +	sed -i -e 's#ConditionNeedsUpdate=/etc#ConditionNeedsUpdate=/etc/udev#g' ${D}${sysconfdir}/systemd/system/systemd-udev-hwdb-update.service
>> }
>>
>> do_install_ptest () {
>> @@ -355,10 +359,18 @@ ALTERNATIVE_PRIORITY[runlevel] ?= "300"
>>
>> pkg_postinst_udev-hwdb () {
>> 	if test -n "$D"; then
>> -		${@qemu_run_binary(d, '$D', '${base_bindir}/udevadm')} hwdb --update \
>> -			--root $D
>> +		if ${@qemu_run_binary(d, '$D', '${base_bindir}/udevadm')} hwdb --update \
>> +			--root $D; then
>> +			touch $D/etc/udev/.updated
>> +		else
>> +			exit 1
>> +		fi
>> 	else
>> -		udevadm hwdb --update
>> +		if udevadm hwdb --update; then
>> +			touch $D/etc/udev/.updated
>> +		else
>> +			exit 1
>> +		fi
>> 	fi
>> }
>>
>> -- 
>> 1.9.1
>>
>> -- 
>> _______________________________________________
>> Openembedded-core mailing list
>> Openembedded-core@lists.openembedded.org
>> http://lists.openembedded.org/mailman/listinfo/openembedded-core
>>
>



      reply	other threads:[~2014-10-24  7:36 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-24  5:58 [PATCH 0/1] systemd: fix systemd-udev-hwdb-update service Chen Qi
2014-10-24  5:58 ` [PATCH 1/1] " Chen Qi
2014-10-24  6:09   ` Koen Kooi
2014-10-24  7:37     ` ChenQi [this message]

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=544A01CD.8070704@windriver.com \
    --to=qi.chen@windriver.com \
    --cc=koen@dominion.thruhere.net \
    --cc=openembedded-core@lists.openembedded.org \
    /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.