Re: [PATCH] udev enhancements to use kernel event queue

Greg KH
2003-06-12T23:13:45Z

On Thu, Jun 12, 2003 at 04:16:03PM -0700, Robert Love wrote:
> On Thu, 2003-06-12 at 16:09, Greg KH wrote:
>
> > +
> > + envp [i++] = scratch;
> > + scratch += sprintf(scratch, "SEQNUM=%ld", sequence_num) + 1;
> > + ++sequence_num;
>
> Since I do not see a lock in here, I think you need to use atomics?
>
> As is, you can also race and have the same sequence_num value written
> out twice.

Doh, I ate too much for lunch today and need to wake up...

Pat, here's an updated patch.

thanks,

greg k-h

diff -Nru a/lib/kobject.c b/lib/kobject.c
--- a/lib/kobject.c Thu Jun 12 16:21:21 2003
+++ b/lib/kobject.c Thu Jun 12 16:21:21 2003
@@ -100,6 +100,8 @@

#define BUFFER_SIZE 1024 /* should be enough memory for the env */
#define NUM_ENVP 32 /* number of env pointers */
+static unsigned long sequence_num;
+static spinlock_t sequence_lock = SPIN_LOCK_UNLOCKED;
static void kset_hotplug(const char *action, struct kset *kset,
struct kobject *kobj)
{
@@ -151,6 +153,12 @@

envp [i++] = scratch;
scratch += sprintf(scratch, "ACTION=%s", action) + 1;
+
+ spin_lock(&sequence_lock);
+ envp [i++] = scratch;
+ scratch += sprintf(scratch, "SEQNUM=%ld", sequence_num) + 1;
+ ++sequence_num;
+ spin_unlock(&sequence_lock);

kobj_path_length = get_kobj_path_length (kset, kobj);
kobj_path = kmalloc (kobj_path_length, GFP_KERNEL);