linux/fs/notify/notification.c
<<
>>
Prefs
   1/*
   2 *  Copyright (C) 2008 Red Hat, Inc., Eric Paris <eparis@redhat.com>
   3 *
   4 *  This program is free software; you can redistribute it and/or modify
   5 *  it under the terms of the GNU General Public License as published by
   6 *  the Free Software Foundation; either version 2, or (at your option)
   7 *  any later version.
   8 *
   9 *  This program is distributed in the hope that it will be useful,
  10 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 *  GNU General Public License for more details.
  13 *
  14 *  You should have received a copy of the GNU General Public License
  15 *  along with this program; see the file COPYING.  If not, write to
  16 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  17 */
  18
  19/*
  20 * Basic idea behind the notification queue: An fsnotify group (like inotify)
  21 * sends the userspace notification about events asyncronously some time after
  22 * the event happened.  When inotify gets an event it will need to add that
  23 * event to the group notify queue.  Since a single event might need to be on
  24 * multiple group's notification queues we can't add the event directly to each
  25 * queue and instead add a small "event_holder" to each queue.  This event_holder
  26 * has a pointer back to the original event.  Since the majority of events are
  27 * going to end up on one, and only one, notification queue we embed one
  28 * event_holder into each event.  This means we have a single allocation instead
  29 * of always needing two.  If the embedded event_holder is already in use by
  30 * another group a new event_holder (from fsnotify_event_holder_cachep) will be
  31 * allocated and used.
  32 */
  33
  34#include <linux/fs.h>
  35#include <linux/init.h>
  36#include <linux/kernel.h>
  37#include <linux/list.h>
  38#include <linux/module.h>
  39#include <linux/mount.h>
  40#include <linux/mutex.h>
  41#include <linux/namei.h>
  42#include <linux/path.h>
  43#include <linux/slab.h>
  44#include <linux/spinlock.h>
  45
  46#include <linux/atomic.h>
  47
  48#include <linux/fsnotify_backend.h>
  49#include "fsnotify.h"
  50
  51static struct kmem_cache *fsnotify_event_cachep;
  52static struct kmem_cache *fsnotify_event_holder_cachep;
  53/*
  54 * This is a magic event we send when the q is too full.  Since it doesn't
  55 * hold real event information we just keep one system wide and use it any time
  56 * it is needed.  It's refcnt is set 1 at kernel init time and will never
  57 * get set to 0 so it will never get 'freed'
  58 */
  59static struct fsnotify_event *q_overflow_event;
  60static atomic_t fsnotify_sync_cookie = ATOMIC_INIT(0);
  61
  62/**
  63 * fsnotify_get_cookie - return a unique cookie for use in synchronizing events.
  64 * Called from fsnotify_move, which is inlined into filesystem modules.
  65 */
  66u32 fsnotify_get_cookie(void)
  67{
  68        return atomic_inc_return(&fsnotify_sync_cookie);
  69}
  70EXPORT_SYMBOL_GPL(fsnotify_get_cookie);
  71
  72/* return true if the notify queue is empty, false otherwise */
  73bool fsnotify_notify_queue_is_empty(struct fsnotify_group *group)
  74{
  75        BUG_ON(!mutex_is_locked(&group->notification_mutex));
  76        return list_empty(&group->notification_list) ? true : false;
  77}
  78
  79void fsnotify_get_event(struct fsnotify_event *event)
  80{
  81        atomic_inc(&event->refcnt);
  82}
  83
  84void fsnotify_put_event(struct fsnotify_event *event)
  85{
  86        if (!event)
  87                return;
  88
  89        if (atomic_dec_and_test(&event->refcnt)) {
  90                pr_debug("%s: event=%p\n", __func__, event);
  91
  92                if (event->data_type == FSNOTIFY_EVENT_PATH)
  93                        path_put(&event->path);
  94
  95                BUG_ON(!list_empty(&event->private_data_list));
  96
  97                kfree(event->file_name);
  98                put_pid(event->tgid);
  99                kmem_cache_free(fsnotify_event_cachep, event);
 100        }
 101}
 102
 103struct fsnotify_event_holder *fsnotify_alloc_event_holder(void)
 104{
 105        return kmem_cache_alloc(fsnotify_event_holder_cachep, GFP_KERNEL);
 106}
 107
 108void fsnotify_destroy_event_holder(struct fsnotify_event_holder *holder)
 109{
 110        if (holder)
 111                kmem_cache_free(fsnotify_event_holder_cachep, holder);
 112}
 113
 114/*
 115 * Find the private data that the group previously attached to this event when
 116 * the group added the event to the notification queue (fsnotify_add_notify_event)
 117 */
 118struct fsnotify_event_private_data *fsnotify_remove_priv_from_event(struct fsnotify_group *group, struct fsnotify_event *event)
 119{
 120        struct fsnotify_event_private_data *lpriv;
 121        struct fsnotify_event_private_data *priv = NULL;
 122
 123        assert_spin_locked(&event->lock);
 124
 125        list_for_each_entry(lpriv, &event->private_data_list, event_list) {
 126                if (lpriv->group == group) {
 127                        priv = lpriv;
 128                        list_del(&priv->event_list);
 129                        brpriv_from_event(struct   34#inotify_y/notification.c#L98" id="L98" class9e01sneecation.c#L98" id="L98" c1igina2"line" name="L35">  35  35(&(tify/notiffication.c#L13" id="L13" classs="linc#L98" id="L98" c1igina2"line" name="L3ify/notifification.c#L34" id="L341" cla13"line" name="L124"> 124
 115/*
 116 * evthe event to holdeomment">is fass="cpullprevipan class="comment">/*
  57t to tss=dss="s="c of always omments successend y"commentoRTICULAR PURPOSE.  See the
  28 * multiple group, at iserethe qs take"> *event_hULAR PURPOSE.  See the
  29 */
 118struct fsnotify_evene notification queue (fsnify_alloc_event_holder" ction queue (fsnremove_priv_from_event(struct fsnotify_group *group, struct fsnotify_event * */
 1111111111111111111111111111111111L121"> 121        struct fsnotify_event_private_data * */
  35  111111111111111111111111111111111L121"> 121        struct (ist_dm>

a href="+code=list_dhsinglsref,s="comment"> */
  93                                                           L121"> 121        struct event)
 104{
group, struct fsnotify_even0sa hra href="+code=fsnotif0sa hra hrefriv" class="sref">priv = NULL;
group, struct fsnotify_event_holder *priv = NULL;
group, ist_dm>

a href="+code=list_dhsinglsrefef">group, ist_a href="+code=list_r" c cl"sref">list_empty(&group->NULL;
  18
pr_debug(&quo"string">&quo="comg">"%s: event=%p\n", __func_p *fsnotify_event *event_list);
  50
 115/*
  32<<<<<<<< * e_holder" classhULAR PURPOSE.  See the
  53<<<<<<<<ULAR PURPOSE.  See the
  54<<<<<<<<
  55<<<<<<<< *possibl tsind  evethilass=ll=n a Fia unULAR PURPOSE.  See the
  56<<<<<<<<anngle allocation instead
  57<<<<<<<<"csref",previootificatiocommenGeneralspace not...ULAR PURPOSE.  See the
  58<<<<<<<< */
BUG_ON(!list_empty(&event *priv->group) {
 class=r *group) {
 111         r *privr *fsnotify_a="sref">event_list);
  92BUG_O   if (holder)
  93  0sa href="+code=f     ERR_PTR(event_list);
  45
-&lass="sref">list_empty(&group->n"sref">event_list);
 107
             >(&groupgroup == groupgroup) {
  99         >(&privt *q_overflow_event;
  50
 11 name="L115"> 115/*
  72="L93">  93  *nwgi a singlan classommevent" c  Whenpan class="comment">/*
  53<<<<<<<<<93  *nw fromnto each  a siat ispan class="comment">/*
  54<<<<<<<<<93  *pan class="comment"> */
  95         a>void f">fsnotify_event *q_overflow_event;
 1">fsnotify_even0sa hra href="+code=fsnotif0sa hra hrefriv" class="sref">privt *q_overflow_event;
 107
  9" name="L72">  72 * oassommevent" c  When *pan class="comment"> */
  99         a *priv = NULL;
 100        }
  91
BUG_ON(!group, ist_a href="+code=list_r" c)l"sref"sref"ent_private_dat_erg="+code=kmem_cacmerg=lass=lass="sref">group) {
  ass="sref">group, struct fsnotify_eventm== NULL;
 124
  95         tm== priv_erg="+code=kmem_cacmerg=lass=ef">group, ist_a href="+code=list_r" cotify_event_cachep, event);
 126             tm== group) {
  "L95">  95         _lockeuna>->list_empty(&group->n"sref">event_list);
  88
 129  26             0sa hra href="+code=fsnotif0sa hra hrefriv"lass="sref">holder)
  "L87">  "L95">  95         a>void fa>             0sa hra href="+code=fsnotif0sa hra hrefriv"l"sref">event_list);
 111111111L110"> 110        if (list_empty(&event *holder)
  "L87">  "L95">  95         a>void fsnotify_des="sref">event *event_list);
  93  0sa href="+code=f     tm== NULL;
  L100"> 100        }
 100        }
  96
list_empty(&event->lock);
  18
  89     N(!list_empty(&event *priv->group) {
  "L89">  89     unaikel href="+code=lisunaikel y_des="sref">event *holder)
 11111111195         a>void fsnotify_des="sref">event *event_list);
  11         r *list_empty(&event *event_list);
  89     unaikel href="+code=lisunaikel y_desass="sref">BUG_O   if (group) {
  9" name="L72">  72
  55<<<<<<<<<<<<<<<<ann to 0ent">"orma*pan class="comment"> */
 1">fsnotify_even" clauna>->-&lass="sref">list_empty(&event->lock);
  97         _lockeuna>->list_empty(&group->n"sref">event_list);
  18
 126             0sa hra href="+code=fsnotif0sa hra hrefriv"llass="sref">group) {
  "L87">  95         a>void fa>             0sa hra href="+code=fsnotif0sa hra hrefriv"l"sref">event_list);
 1"L87">  95         0sa hra href="+code=fsnotif0sa hra hrefriv" class="sref">priv = NULL;
  L100"> 100        }
 113
  go o"L123"> 123  lass=r *NULL;
 100        }
  96
(&groupNULL;
priv-&gp;privt *q_overflow_event;
q_overflow_event;
f">fsnotify_event *q_overflow_event;
  81 t_empctiotailist_emptypriv->q_overflow_event;
         a *holder)
  "L81">  81 t_empctiotailist_empty(&priv->lpriv, &event->q_overflow_event;
  81 " clauna>->-&lass="sref">list_empty(&event->lock);
 125 _lockeuna>->list_empty(&group->n"sref">event_list);
  96
list_empty(&group->n"sref">event_list);
  68        0sa hra href="+code=fsnotif0sa hra hrefriv""sref">event_list);
  69}
  50
 115/*
  35<2 101  72=* Rlass=>ann an classommfirspace noss="coup added the evens="sholdeore qs apan class="comment">/*
  63/*
  64
 115a*pan class="comment"> */
 118struct fsnotify_evene notificclass="ruct fsnotify_group *group)
  67{
group, struct fsnotify_event *event_list);
group, struct fsnotify_event_holder *event_list);
  50
  81        BUG_ON(!mutex_is_locked(&group->notification_mutex));
  35<2ification.c#L42" id="L422" cla24"line" name="L122"> 122
 123 a<     pr_debug("%s: event=%p\n", __func_p *));
 124
 125 r *privh_entrirspf="+code=list_for_each_entrirspf="+co"sref">mutex_is_locked(&group->group, struct fsn>private_data_list, ));
  96
-&gp;priv   if (priv-&gp;));
  18
list_empty(&event->lock);
priv-&gp;priv = NULL;
  81 t_empdel_ini_a href="+code=list_pdel_ini_lass="sref">list_emptypriv->lock);
  35<2ification.c#L52" id="L522" cla252line" name="ent_private_dat" clauna>->-&lass="sref">list_empty(&event->lock);
 113
  72 */
 110        if (list_empty(&event *holder)
 1">fsnotify_evena>void fsnotify_des="sref">event *event_list);
 107
(&groupevent_list);
q_overflow_event;
  68        a>-&gp;));
 101}
 122
  63/*
  64
 class=lways omme,tsind mustle edormas="c y_event" class="ruct 
 115a*pan class="comment"> */
 118struct fsnotify_evene notificpeek"ruct (struct fsnotify_group *group)
  67{
group, struct fsnotify_event *event_list);
group, struct fsnotify_event_holder *event_list);
  50
  81        BUG_ON(!mutex_is_locked(&group->notificame="L50">  50
 122
 123 r *privh_entrirspf="+code=list_for_each_entrirspf="+co"sref">mutex_is_locked(&group->group, struct fsn>private_data_list, ));
  81 a>-&gp;priv   if (priv-&gp;));
  45
  68        a>-&gp;));
 101}
  18
  29/*
  64viobeilasto"> downtss=clenams="cny outstandilapan class="comment">/*
 115
  72=*pan class="comment"> */
 108void (struct fsnotify_group *group)
 104{
group, struct fsnotify_evena>-&gp;));
group, struct fsnotify_event_private_data *));
 107
->list_empty(&group->n"sref">event_list);
BUG_Ote_data" _data" uped" (!event *group) {
  "L81">  81 a>-&gp;prive notificclass="ruct __func_p *));
 1"" name="L72">  72
 has=>attach siany *pan class="comment"> */
  26             >(&groupgroupgroup) {
  93  ent_private_dat" class="= list_empty(&event->lock);
  93  ent_private_data *privy_event" class="de=p_s="ca href="+code=fsnotify_event" class="de=p_s="ca hreflass=="sref">__func_p *, event);
  93  ent_private_dat" clauna>->-&lass="sref">list_empty(&event->lock);
 1"L92">  26             a *holder)
  "L95">  93  ent_private_dat>(&groupgroup             a *lock);
  " name="L101"> 101}
s="sref">holder)
, );
  64<="sref">fsnotifyedorficatioimplem noss=ee class="srelwayyebets3href="+co3e=event_list" class=clas3="sre3">group) {="fs/n2otify/not2ification.c#L98" id=3r *  50
 125 _lockeuna>->list_empty(&group->e3ent_li="fs/n2otify/not2ification.c#L98" id=3r3/a> *e30f">lock);
grousty/nc /
scla2ializec#L19""L108"> 108void group, struct  1"L92">  26       3vt 1 atgo30Fia de=lmFia unULAR PUR3OSE. 3See thlass="sref">groupann3to 0ent">"orma*pan class3"comm30L45">  45
  93  ent_private_dat" clauna>->-&lass="sref">list_empty(&event *group->ann3t*  96
event  93  ent_private_dat" clauna>->-&lassaunc.c#L128" id="L1282 nc.ct" cla1+"sref">group->ann3te3ent_list);
  18
  93  ent_private_dat" clauna>->-&lass="sref">list_empty(&ev3"+code=fs3otif0sa hra hrefriv"llas3="sre31nt_list);
e31L50">  50
  93  ent_private_dat" clauna>->-&lasslass="sref">lpriv, &event->  L130"> 130        }
/*
 "lin c3ass="31event)
ann352 clas21="line" name=L130"> 131ee the
ann3" id="L1162 clas21="line3 name31nstead
 linfounlwayyw/a>=*a hrefine" nkernel#L81" id="L812" cla2801sne1 name="L115"> 1153/q_le+cod3=atomic_incq_le+"lin++ c3ass="31ee the
 33_over3low_evin8void s"ruct <=freplacec#L19""L108"> 108void group, struct <2  ent_private_d3_over32>group) {
 108void groupiecode=ev(& 1"L92">  26       3ent *3a href="+code=event" c">3_over3low_evlass="sref">group3_over3low_event;"> 108void groupd2  ent_private_dpriv   if (pr3     aholder)"> 108void group, struct   93  ent_priiecode=ev(&list_empty(&event3private_d3ta_list" class="sref")">3_over32_mutex));
lock);enumup, struct event *groupann3_mutex" class="sref">n"s3ef">e32">holder)
ann3" id="L1262 clas22="line3 name32f">lock);
n"s3ef">e3ent_list);}href="+code=event" class="sref">event3pivt 3snotif0sa hra hrefriv""s3ef">e32nt_list);
lock);
 123 adpr_debug("%s: evend(&event3f="+code=3otify/noti2icati23="line3 name33        }
 115lock);

/*
/*
  de=ev#L81" id="L812" cla2801sne1 name="L115"> 1153lrtss=dro3ssovioriserethe.ULAR PUR3OSE. 3See the
 115a*pan class3"comm33L45">  45
  8eecoL69" id="L692" cla269eecoL69" ia294list_pdel_ini_lass="sref">list_emptyevent3f7nt">ann3 107
  8d-&lass="sref">list_empty(&quot;%s: evenSPINLOCK_OLD struct event3fivt 3e33L18">  18
  8iecode=ev(&list_empty(&quot;%s: evenSPINLOCK_NEW struct event3er *<3 href="+code=holder" c"s3ef">e3ent_list);
  50
(&event3ee1 name=3mutex" class="sref">noti3icati34f">lock);
  8d  ent_private_dlist_empty(&list_emptyevent3ethe even32" id="L422" cla24"line"3name=34        }
;
 iecode=ev(&list_empty(&ehref="+code=event" class="sref">event3ertss=dro34" id="L442" cla24"line"3name=3L124"> 124
 d-&lass="sref">list_empty(&ehref="+code=event" class="sref">event3e" name="3ode=event_list" class=ti3icati3n_mutex));
  96
  72-&gp3 107tify/not2ification.d  ent_private_d-&lassl"sref">list_empty(&event3ation.c#L38" id="L482" cla24="line3 name3401"> 101}
 1">fsnotify_evena>void   ent_private_devent3nt-&g3;priv3= NULL;

lock);
s="sref">holder)

lock);
 113
event3nrtss=dro3plass="csref"s*pan class3"comm3nt"> *="fs/n2otify/not2ification.c#L98" id=3/r *<3 href="+code=holder" cla3s="sr35_mutex));
e3ent_li/
 118strclonec#L19" id="L192L92">s"ruct <=fclonec#L19""L108"> 108void groupd));
lass="sref">groupe35nt_list);
group  class="sref">priv   if (pr3ation.c#L39" id="L592" cla25"line>3_over36nt_list);
NULL;
prGFP_KERNE t" cehref="+code=event" class="sref">event3tion.c#L63" id="L612" cla26"line" 3ame="36ow_event;
 1"L92">  26       3ation.c#L32" id="L622" cla26"line"3name=36>group) {
priv-&gp;  63 124
 123 adpr_debug("%s: evend__func_p * 115a*pan class3"comm36_mutex));
  96
__func_pquot;%s: evendgroup, struct -&gp3" id="L672" cla26="line"3name=36107"> 107
scla2ializec#L19""L108ot;%s: evenhreflass=="sref">__func_p *e36nt_list);
e370w_event;
__func_p"+co_lockeuna>-&lass=r" name=f="+code=f    =r" name class="sref">group__func_p"+co_lockeuna>-&lassfile_7="lfy_event_holder"ile_7="l02" cla2s="line" name=knamda> _lockeuna>->knamda>)
-&lassfile_7="lfy_event_holder"ile_7="l02" quot;%s: evenGFP_KERNE class="sref">prGFP_KERNE t" cehref="+code=event" class="sref">event3ification3mutex" class="sref">noti3icame37t"> */
-&lassfile_7="lfy_event_holder"ile_7="l02"  class="sref">groupgroup) {
__func_p *));p) {
priv-&gp;event);
  45="fs/n2otify/not2ification.c#L98" id=3aoup 3  96
-&lasstgi 81        -&lasstgi 81        -&gp3" id="L172  cla27"line" 3ame="37107"> 107tify/not2ification.oify/noti2ification.c#L47" id"+co_lockeuna>-&lassde=evtyp cation.c#L90" ide=evtyp 02" clla2s="line" name=FSNOTIFY_EVENT_PATHcation.c#L90" iFSNOTIFY_EVENT_PATHde=f" name="L126"> 1"L92">  26       3ation.c#L38" id="L782" cla27="line3 name3701"> 101}
 vate_dat" clauna>->-&lasslatht2ification.c#L4ath02"  *  29  68    3/a>
  72=*pan class3"comm38f">lock);
/*
  - A14"l"+c a ">  de=evln.c#Lnot2ifbe s=evlto ea#Ltify/not2ification.c#L79" id="L792" cla27="3vena>-&gp3
  "e=g claon.c#L9lion.c#23="interest  efine"istify/not2ification.c#L79" id="L792" cla27="3voup 3 *
 1153ation.c#L37" id="L872" cla28"line"3name=38ee the
 1153ation.c#L3_mutex" class="sref">n"s3ef">e38L18">  18
 */*
 1153c_p *3a href="+code=group" oti3icati39nt">/*
 1153ca>attach siany *pan class3"comm39nt">/*
 1153ce" name=3fy=ee class="sreup" olas3="sre39nt">/*
on.c#L9lde=e  Rla "ile, 4ath,i="fy/,72">hing..#L81" id="L812" cla2801sne1 name="L115"> 1153coup 3;/*
-&g3; */
 118strcre"+co72">  id="L192L92">s"ruct <=fcre"+co72"> "L108"> 108void sclfy/"line" name="L118"> 1to_tell81         115loc
 1"L862" cla286line" /a>, strloimplem noss=ee class="srelwayyebets3     aholder)
, struct lock);
, struct  115loc
sgfp_ ">loc
sgfpde=f" name="L126"> 1"L92">  26       3L982" cla39="line" name="L98">  " 3ame="3101"> lass="sref">groupgroup) {
group  class="sref">priv   if (pr4r * *e40f">lock);
sgfpde=f"href="+code=holder" c class="sref">pr4r3/a> *e40>group) {
 1"L92">  26       4 if (priv-&gp;ann4to 0ent">"orma*pan class4"comm40L45">  45
 123 aion.c ann4t*holder)
pr_debug("%s: evenhreflass=="sref">__func_pquot;%s: evento_tell81         1"L862" cla286line" /a>, strlvoid pr4r8nt">ann4te4ent_list);
  18
scla2ializec#L19""L108ot;%s: evenhreflass=="sref">__func_p *e41L50">  50tify/not2ification.e="lfy_event_holder7="l02"  class="sref">grouppriv4=  */
__func_p"+co_lockeuna>-&lassfile_7="lfy_event_holder"ile_7="l02" cla2s="line" name=knamda> _lockeuna>->knamda>)
sgfpde=f"href="+code=holder" c class="sref">pr41122 clas41="line" name="L92">  L140"> 141>group) {
-&lassfile_7="lfy_event_holder"ile_7="l02"  class="sref">grouplock);
__func_p * "lin c4ass="41">event);
priv-&gp;ann452 clas21="line" name=L140"> 141">holder)
ann4" id="L1162 clas21="line4 name41f">lock);
__func_p"+co_lockeuna>-&lass=r" name=f="+code=f    =r" namecla2s="line" name=namame=f="+code=f    namame"L108ot;%s: evenhreflass=="sref">__func_p"+co_lockeuna>-&lassfile_7="lfy_event_holder"ile_7="l02"  gp;ann4=atomic_incq_le+"lin++ c4ass="41nt_list);}p;4_over41nt_list);
4_over42f">lock);
-&lasstgi 81                4_over42ef">NULL;
-&lasssy=grcookilfy_event_holdersy=grcookil02" cla2s="line" name=cookilfy_event_holdercookil&gp;4_over42f">lock);
-&lassto_tell81                 122
-&lassde=evtyp cation.c#L90" ide=evtyp 02" clvoid 4_over42_mutex));
lock);switchfy/not2ification.de=evtyp cation.c#L90" ide=evtyp 02" "class="sref">groupann4_mutex" class="sref">n"s4ef">e42">holder)casea2s="line" name=FSNOTIFY_EVENT_PATHcation.c#L90" iFSNOTIFY_EVENT_PATHde=f:class="sref">groupann4" id="L1262 clas22="line4 name42f">lock);
void , strgp;ann4_mutex" claswaitqef">n"s4ef">e42f">lock);
 vate_dat" clauna>->-&lasslatht2ification.c#L4ath02" href="+code=evende 123 r *void -&lassde 123 r *e4201"> 101}
->-&lasslatht2ification.c#L4ath02" href="+code=evenme_dat" clauna>-&gmL902" cla2s="line" name=latht2ification.c#L4ath02" "+co_lockeuna>-&lassme_dat" clauna>-&gmL902" gp;group) {
 vate_dat" clauna>->-&lasslatht2ification.c#L4ath02"  *));
4L115"> 115lock);}p;lock);
 vate_dat" clauna>->-&lass="fy/ id="L192L92">sclfy/"linelvoid , strgp;event);
ann4115"> 115a*pan class4"comm43">holder)casea2s="line" name=FSNOTIFY_EVENT_NONEcation.c#L90" iFSNOTIFY_EVENT_NONEde=f:p;ann4lock);
__func_p"+co_lockeuna>-&lass="fy/ id="L192L92">sclfy/"linelvoid priv-&gp;lock);
 vate_dat" clauna>->-&lasslatht2ification.c#L4ath02" href="+code=evende 123 r *void priv-&gp;e4301"> 101}
->-&lasslatht2ification.c#L4ath02" href="+code=evenme_dat" clauna>-&gmL902" cla2s="line" name=" c class="sref">priv-&gp;e44>group) {
  50default:p;noti4icati44t"> */
prBUGlas22 *lock);}p;));
 124
->-&lassmaskation.c#L19" idmask&cla2s="line" name=maskation.c#L19" idmask&*ann4ode=event_list" class=ti4icati4n_mutex));
  96
  68    4v-&gp4}p;-&g4;pr2ification.c#L51" i_c2ifia19=tin8void  1"L92">  26       4>priv4= grouplock);
 122
grquot;%s: evenSLAB_PANICfy_event_holderSLAB_PANIC02"  * *43" id="L532" cla25"line"4name=45_mutex));
 124
strcre"+co72">  id="L192L92">s"ruct <=fcre"+co72"> "L1082s="line" name=" c class="sref">priv-"%s: evenFS_Q_OVERFLOW struct -"%s: even" c class="sref">priv-&qx));
ann4 href="+code=holder" cla4s="sr45f">lock);
priv-&q 0qx));
e45">holder)
prGFP_KERNE t" cehref="+code=event" class="sref">event4r-&gp47" id="L572" cla25"line"4name=45107"> 107tify712" cla27="lineq_overflocode=ev(& 1"L92">  26       4>on.c#L104=atomic_incq_le+"lin--"s4ef">e4501"> 101}
 1unablelno;a14"l"+c "ruct <= q_overflocode=evf="+code=pr_debehref="+code=event" class="sref">event4ation.c#L49" id="L592" cla25"line>4_over46nt_list);
));
event4tion.c#L64" id="L612" cla26"line" 4ame="46nt_li="fs/n2otify/not2ification.c#L98" id=4ation.c#L42" id="L622" cla26"line"4name=46>groulockeuna>-&lasssubsysr2ificall81        event4a_p *4"L63">  63  63
T4" original LXR softw" clbyO,ni"ef="+codehttp://sourceforge.net/projecvs/lxid>LXR ref=uifiya>-&q e"is experi="fsal vers5">obyOef="+codemailto:lxi@/a>ux.no">lxi@/a>ux.no02" h
63 lxi./a>ux.no kindly host ebyOef="+codehttp://www.redpill-/a>pro.no">Redpill La>pro ASa>-&q provi/a>ux consultid="e=d operef">es services siine<1995.