Messages in this thread Patch in this message | | | Date | Thu, 12 Jun 2003 16:25:42 -0700 (PDT) | From | Patrick Mochel <> | Subject | Re: [PATCH] udev enhancements to use kernel event queue |
| |
On 12 Jun 2003, 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.
Yeah, how about this ammended patch?
-pat
===== lib/kobject.c 1.25 vs edited ===== --- 1.25/lib/kobject.c Wed Jun 11 12:06:06 2003 +++ edited/lib/kobject.c Thu Jun 12 16:24:26 2003 @@ -100,6 +100,9 @@ #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) { @@ -112,6 +115,7 @@ int kobj_path_length; char *kobj_path = NULL; char *name = NULL; + unsigned long seq; /* If the kset has a filter operation, call it. If it returns failure, no hotplug event is required. */ @@ -151,6 +155,13 @@ envp [i++] = scratch; scratch += sprintf(scratch, "ACTION=%s", action) + 1; + + spin_lock(&sequence_lock); + seq = sequence_num++; + spin_unlock(&sequence_lock); + + envp [i++] = scratch; + scratch += sprintf(scratch, "SEQNUM=%ld", seq) + 1; kobj_path_length = get_kobj_path_length (kset, kobj); kobj_path = kmalloc (kobj_path_length, GFP_KERNEL); - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |