Messages in this thread | | | Subject | Re: [RFC PATCH -v4 05/14] fsnotify: unified filesystem notification backend | From | Eric Paris <> | Date | Sat, 13 Dec 2008 10:01:15 -0500 |
| |
On Sat, 2008-12-13 at 05:54 +0300, Evgeniy Polyakov wrote: > > +struct fsnotify_event *fsnotify_create_event(struct inode *to_tell, __u64 mask, void *data, int data_is) > > +{ > > + struct fsnotify_event *event; > > + > > + event = kmem_cache_alloc(event_kmem_cache, GFP_KERNEL); > > + if (!event) > > + return NULL; > > + > > + atomic_set(&event->refcnt, 1); > > + > > + spin_lock_init(&event->lock); > > + > > + event->path.dentry = NULL; > > + event->path.mnt = NULL; > > + event->inode = NULL; > > + > > + INIT_LIST_HEAD(&event->private_data_list); > > + > > + event->to_tell = to_tell; > > What prevents this inode to be released?
Absolutely nothing and I need to document that. Two things, event->to_tell and event->data if event->data_is == INODE are ONLY valid during the call to group-?event_to_notif(). As soon as all groups return from that call those are not valid fields. I could set them NULL when they aren't allowed to be used any more, but it's a wasted operation on a VERY hot path (fsnotify())
As a side note event->data if event->data_is == FILE is perfectly allowed to be used until the event is freed. That's totally pointless for this patch set and I might drop it on the next submission, but it is needed for my fanotify notify patches that I keep in mind as I'm doing this.
I'll remember to better document this 'quirk' in case anyone tries to write a new notifier.
-Eric
| |