My ultra-superficial comments:
How about #defines for arguments to audit_update_watch? 0 and 1, not
meaningful.
struct watch_transport: member "valid" is unused??
char *w_filterkey; /* An arbitrary filtering key */
s/arbitrary/meaningful/ ?
You have lines ending in a space
You have lines with spaces for tabs
Now looking at locking. I assume that you feel confident enough at
this point about the placement of the update_watch'es and that you
are catching all meaningful fs events?
-serge