16
16
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
/* $Id: hinotify.c,v 1.22 2007/06/04 02:15:44 sfjro Exp $ */
19
/* $Id: hinotify.c,v 1.38 2007/12/10 01:19:07 sfjro Exp $ */
24
static const __u32 AuInMask = (IN_MOVE | IN_DELETE | IN_CREATE
26
| IN_MODIFY | IN_ATTRIB
27
| IN_DELETE_SELF | IN_MOVE_SELF);
23
28
static struct inotify_handle *in_handle;
24
static const __u32 in_mask = (IN_MOVE | IN_DELETE | IN_CREATE /* | IN_ACCESS */
25
| IN_MODIFY | IN_ATTRIB
26
| IN_DELETE_SELF | IN_MOVE_SELF);
28
int alloc_hinotify(struct aufs_hinode *hinode, struct inode *inode,
29
struct inode *hidden_inode)
30
int au_hin_alloc(struct aufs_hinode *hinode, struct inode *inode,
31
struct inode *hidden_inode)
32
34
struct aufs_hinotify *hin;
35
37
LKTRTrace("i%lu, hi%lu\n", inode->i_ino, hidden_inode->i_ino);
38
hin = cache_alloc_hinotify();
40
hin = au_cache_alloc_hinotify();
40
42
AuDebugOn(hinode->hi_notify);
41
43
hinode->hi_notify = hin;
42
44
hin->hin_aufs_inode = inode;
45
for (i = 0; i < au_hin_nignore; i++)
46
atomic_set(hin->hin_ignore + i, 0);
43
48
inotify_init_watch(&hin->hin_watch);
44
49
wd = inotify_add_watch(in_handle, &hin->hin_watch, hidden_inode,
47
52
return 0; /* success */
50
55
put_inotify_watch(&hin->hin_watch);
51
cache_free_hinotify(hin);
56
au_cache_free_hinotify(hin);
52
57
hinode->hi_notify = NULL;
59
void do_free_hinotify(struct aufs_hinode *hinode)
64
void au_hin_free(struct aufs_hinode *hinode)
62
67
struct aufs_hinotify *hin;
66
71
hin = hinode->hi_notify;
69
74
if (atomic_read(&hin->hin_watch.count))
70
75
err = inotify_rm_watch(in_handle, &hin->hin_watch);
73
cache_free_hinotify(hin);
78
au_cache_free_hinotify(hin);
74
79
hinode->hi_notify = NULL;
76
IOErr1("failed inotify_rm_watch() %d\n", err);
81
AuIOErr1("failed inotify_rm_watch() %d\n", err);
186
194
for (bindex = ibstart(inode); bindex <= bend; bindex++) {
187
195
hi = au_h_iptr_i(inode, bindex);
189
//hi_lock(hi, AUFS_LSC_H_CHILD);
197
//vfsub_i_lock_nested(hi, AuLsc_I_CHILD);
198
iwhdentry = au_hi_wh(inode, bindex);
199
if (unlikely(iwhdentry))
191
202
set_h_iptr(inode, bindex, NULL, 0);
192
set_h_iptr(inode, bindex, igrab(hi), flags);
203
set_h_iptr(inode, bindex, igrab(hi),
204
flags & ~AUFS_HI_XINO);
207
//vfsub_i_unlock(hi);
199
212
/* ---------------------------------------------------------------------- */
214
void au_hin_ignore(struct aufs_hinode *hinode, __u32 events)
219
AuDebugOn(!hinode || !events);
220
LKTRTrace("hi%lu, 0x%x\n", hinode->hi_inode->i_ino, events);
222
AuDbg("hi%lu, 0x%x\n", hinode->hi_inode->i_ino, events);
224
AuDebugOn(!hinode->hi_notify);
226
ign = hinode->hi_notify->hin_ignore;
227
for (i = 0; i < au_hin_nignore; i++)
228
if (1U << i & events)
229
atomic_inc_return(ign + i);
232
void au_hin_unignore(struct aufs_hinode *hinode, __u32 events)
237
AuDebugOn(!hinode || !events);
238
LKTRTrace("hi%lu, 0x%x\n", hinode->hi_inode->i_ino, events);
240
AuDbg("hi%lu, 0x%x\n", hinode->hi_inode->i_ino, events);
242
AuDebugOn(!hinode->hi_notify);
244
ign = hinode->hi_notify->hin_ignore;
245
for (i = 0; i < au_hin_nignore; i++)
246
if (1U << i & events)
247
atomic_dec_return(ign + i);
250
/* ---------------------------------------------------------------------- */
252
static char *in_name(u32 mask)
201
254
#ifdef CONFIG_AUFS_DEBUG
202
static char *in_name(u32 mask)
204
255
#define test_ret(flag) if (mask & flag) return #flag;
205
256
test_ret(IN_ACCESS);
206
257
test_ret(IN_MODIFY);
219
270
test_ret(IN_IGNORED);
224
#define in_name(m) "??"
227
static int dec_gen_by_name(struct inode *dir, const char *_name, u32 mask)
278
/* ---------------------------------------------------------------------- */
280
static struct dentry *lookup_wlock_by_name(char *name, unsigned int nlen,
230
struct dentry *parent, *child;
283
struct dentry *dentry, *d, *parent;
232
284
struct qstr *dname;
233
char *name = (void*)_name;
236
LKTRTrace("i%lu, %s, 0x%x %s\n",
237
dir->i_ino, name, mask, in_name(mask));
286
LKTRTrace("%.*s, dir%lu\n", nlen, name, dir->i_ino);
240
288
parent = d_find_alias(dir);
241
if (unlikely(!parent))
245
if (unlikely(!memcmp(name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)))
246
name += AUFS_WH_PFX_LEN;
249
293
spin_lock(&dcache_lock);
250
list_for_each_entry(child, &parent->d_subdirs, d_u.d_child) {
251
dname = &child->d_name;
252
if (len == dname->len && !memcmp(dname->name, name, len)) {
253
if (unlikely(child == dir->i_sb->s_root)) {
260
//todo: why both are needed
261
if (mask & IN_MOVE) {
262
spin_lock(&child->d_lock);
264
spin_unlock(&child->d_lock);
268
inode = child->d_inode;
273
// todo: the i_nlink of newly created name by link(2)
275
// todo: some nfs dentry doesn't notified at deleteing
294
list_for_each_entry(d, &parent->d_subdirs, d_u.d_child) {
295
LKTRTrace("%.*s\n", AuDLNPair(d));
297
if (dname->len != nlen
298
|| memcmp(dname->name, name, nlen))
300
if (!atomic_read(&d->d_count)) {
301
spin_lock(&d->d_lock);
303
spin_unlock(&d->d_lock);
279
310
spin_unlock(&dcache_lock);
314
di_write_lock_child(dentry);
318
static struct inode *lookup_wlock_by_ino(struct super_block *sb,
319
aufs_bindex_t bindex, ino_t h_ino)
322
struct xino_entry xinoe;
325
LKTRTrace("b%d, hi%lu\n", bindex, h_ino);
326
AuDebugOn(AuFlag(stosi(sb), f_xino) == AuXino_NONE);
329
err = xino_read(sb, bindex, h_ino, &xinoe);
330
if (!err && xinoe.ino)
331
inode = ilookup(sb, xinoe.ino);
334
if (unlikely(inode->i_ino == AUFS_ROOT_INO)) {
335
AuWarn("wrong root branch\n");
341
ii_write_lock_child(inode);
343
if (au_iigen(inode) == au_sigen(sb))
344
goto out; /* success */
346
err = au_refresh_hinode_self(inode);
348
goto out; /* success */
350
AuIOErr1("err %d ignored, but ino will be broken\n", err);
351
ii_write_unlock(inode);
360
static int hin_xino(struct inode *inode, struct inode *h_inode)
363
aufs_bindex_t bindex, bend, bfound;
365
LKTRTrace("i%lu, hi%lu\n", inode->i_ino, h_inode->i_ino);
368
if (unlikely(inode->i_ino == AUFS_ROOT_INO)) {
369
AuWarn("branch root dir was changed\n");
375
for (bindex = ibstart(inode); bindex <= bend; bindex++) {
376
if (au_h_iptr_i(inode, bindex) == h_inode) {
384
err = xino_write0(inode->i_sb, bindex, h_inode->i_ino, 0);
385
/* ignore this error */
388
/* children inode number will be broken */
395
static int hin_iigen(struct inode *inode)
397
LKTRTrace("i%lu\n", inode->i_ino);
399
if (inode->i_ino != AUFS_ROOT_INO)
402
AuWarn("branch root dir was changed\n");
406
static int hin_digen_tree(struct dentry *dentry, int dec_iigen)
408
int err, i, j, ndentry;
409
struct au_dcsub_pages dpages;
410
struct au_dpage *dpage;
411
struct dentry **dentries;
413
LKTRTrace("%.*s, iigen %d\n", AuDLNPair(dentry), dec_iigen);
415
err = au_dpages_init(&dpages, GFP_TEMPORARY);
418
err = au_dcsub_pages(&dpages, dentry, NULL, NULL);
422
for (i = 0; i < dpages.ndpage; i++) {
423
dpage = dpages.dpages + i;
424
dentries = dpage->dentries;
425
ndentry = dpage->ndentry;
426
for (j = 0; j < ndentry; j++) {
429
LKTRTrace("%.*s\n", AuDLNPair(d));
434
if (dec_iigen && d->d_inode)
435
//reset children xino? cached children only?
436
hin_iigen(d->d_inode);
441
au_dpages_free(&dpages);
443
/* discard children */
444
dentry_unhash(dentry);
452
* return 0 if processed.
454
static int hin_digen_by_inode(char *name, unsigned int nlen,
455
struct inode *inode, int dec_iigen)
461
LKTRTrace("%.*s, i%lu, iigen %d\n",
462
nlen, name, inode->i_ino, dec_iigen);
465
if (unlikely(inode->i_ino == AUFS_ROOT_INO)) {
466
AuWarn("branch root dir was changed\n");
471
if (!S_ISDIR(inode->i_mode)) {
473
spin_lock(&dcache_lock);
474
list_for_each_entry(d, &inode->i_dentry, d_alias) {
476
if (dname->len != nlen
477
&& memcmp(dname->name, name, nlen))
480
spin_lock(&d->d_lock);
483
spin_unlock(&d->d_lock);
486
spin_unlock(&dcache_lock);
488
d = d_find_alias(inode);
491
if (dname->len == nlen
492
&& !memcmp(dname->name, name, nlen))
493
err = hin_digen_tree(d, dec_iigen);
503
static int hin_digen_by_name(struct dentry *dentry, int dec_iigen)
507
LKTRTrace("%.*s, iigen %d\n", AuDLNPair(dentry), dec_iigen);
509
if (IS_ROOT(dentry)) {
510
AuWarn("branch root dir was changed\n");
514
inode = dentry->d_inode;
517
au_digen_dec(dentry);
518
} else if (unlikely(inode->i_ino == AUFS_ROOT_INO))
519
AuWarn("branch root dir was changed\n");
521
if (!S_ISDIR(inode->i_mode)) {
522
au_digen_dec(dentry);
525
hin_digen_tree(dentry, dec_iigen);
531
/* ---------------------------------------------------------------------- */
536
unsigned int xino0:1;
537
unsigned int iigen:1;
538
unsigned int digen:1;
539
unsigned int dirent:1;
544
struct hin_job_args {
546
struct inode *inode, *h_inode, *dir, *h_dir;
547
struct dentry *dentry;
552
static int hin_job(struct hin_job_args *a)
555
if (a->inode && a->jobs->xino0)
556
hin_xino(a->inode, a->h_inode);
557
/* ignore this error */
559
/* make the generation obsolete */
560
if (a->jobs->iigen && a->inode)
562
/* ignore this error */
564
if (a->jobs->digen) {
568
err = hin_digen_by_inode(a->h_name, a->h_nlen, a->inode,
570
if (err && a->dentry)
571
hin_digen_by_name(a->dentry, a->jobs->iigen);
572
/* ignore this error */
575
/* make dir entries obsolete */
576
if (a->jobs->dirent) {
577
struct aufs_vdir *vdir;
578
vdir = ivdir(a->inode);
582
a->inode->i_version++;
585
/* update the attr */
588
&& au_h_iptr(a->inode) == a->h_inode)
589
au_cpup_attr_all(a->inode);
593
/* ---------------------------------------------------------------------- */
595
enum { CHILD, PARENT };
287
596
struct postproc_args {
288
597
struct inode *h_dir, *dir, *h_child_inode;
599
union hin_job jobs[2];
600
unsigned int h_child_nlen;
293
static void dec_gen_by_ino(struct postproc_args *a)
604
static void postproc(void *_args)
606
struct postproc_args *a = _args;
295
607
struct super_block *sb;
296
608
aufs_bindex_t bindex, bend, bfound;
298
struct inode *cinode;
303
AuDebugOn(!au_flag_test(sb, AuFlag_XINO));
306
bend = ibend(a->dir);
307
for (bindex = ibstart(a->dir); bfound == -1 && bindex <= bend; bindex++)
308
if (au_h_iptr_i(a->dir, bindex) == a->h_dir)
313
bindex = find_brindex(sb, itoii(a->dir)->ii_hinode[bfound + 0].hi_id);
316
if (unlikely(xino_read(sb, bindex, a->h_child_inode->i_ino, &xino)))
319
if (xino.ino != AUFS_ROOT_INO)
320
cinode = ilookup(sb, xino.ino);
323
if (1 || a->mask & IN_MOVE) {
324
struct dentry *child;
325
spin_lock(&dcache_lock);
326
list_for_each_entry(child, &cinode->i_dentry, d_alias)
328
spin_unlock(&dcache_lock);
331
au_iigen_dec(cinode);
336
static void reset_ino(struct postproc_args *a)
338
aufs_bindex_t bindex, bend;
339
struct super_block *sb;
343
bend = ibend(a->dir);
344
for (bindex = ibstart(a->dir); bindex <= bend; bindex++) {
345
h_dir = au_h_iptr_i(a->dir, bindex);
346
if (h_dir && h_dir != a->h_dir)
347
xino_write0(sb, bindex, h_dir->i_ino);
348
/* ignore this error */
352
static void postproc(void *args)
354
struct postproc_args *a = args;
355
struct super_block *sb;
356
struct aufs_vdir *vdir;
612
struct hin_job_args args;
613
struct dentry *dentry;
614
struct aufs_sbinfo *sbinfo;
359
617
LKTRTrace("mask 0x%x %s, i%lu, hi%lu, hci%lu\n",
360
618
a->mask, in_name(a->mask), a->dir->i_ino, a->h_dir->i_ino,
361
619
a->h_child_inode ? a->h_child_inode->i_ino : 0);
363
#if 0//def ForceInotify
364
Dbg("mask 0x%x %s, i%lu, hi%lu, hci%lu\n",
365
a->mask, in_name(a->mask), a->dir->i_ino, a->h_dir->i_ino,
366
a->h_child_inode ? a->h_child_inode->i_ino : 0);
623
vfsub_i_lock(a->dir);
370
624
sb = a->dir->i_sb;
371
si_read_lock(sb); // consider write_lock
626
si_read_lock(sb, !AuLock_FLUSH);
628
ii_read_lock_parent(a->dir);
630
bend = ibend(a->dir);
631
for (bindex = ibstart(a->dir); bindex <= bend; bindex++)
632
if (au_h_iptr_i(a->dir, bindex) == a->h_dir) {
636
ii_read_unlock(a->dir);
637
if (unlikely(bfound < 0))
640
xino = (AuFlag(sbinfo, f_xino) != AuXino_NONE);
642
if (a->h_child_inode)
643
h_ino = a->h_child_inode->i_ino;
645
if (a->h_child_nlen && a->jobs[CHILD].digen)
646
dentry = lookup_wlock_by_name(a->h_child_name, a->h_child_nlen,
649
inode = dentry->d_inode;
650
if (xino && !inode && h_ino
651
&& (a->jobs[CHILD].xino0
652
|| a->jobs[CHILD].iigen
653
|| a->jobs[CHILD].digen
654
|| a->jobs[CHILD].attr))
655
inode = lookup_wlock_by_ino(sb, bfound, h_ino);
657
args.jobs = a->jobs + CHILD;
658
args.dentry = dentry;
660
args.h_inode = a->h_child_inode;
662
args.h_dir = a->h_dir;
663
args.h_name = a->h_child_name;
664
args.h_nlen = a->h_child_nlen;
665
err = hin_job(&args);
667
di_write_unlock(dentry);
670
ii_write_unlock(inode);
372
674
ii_write_lock_parent(a->dir);
374
/* make dir entries obsolete */
375
vdir = ivdir(a->dir);
381
* special handling root directory,
382
* sine d_revalidate may not be called later.
383
* main purpose is maintaining i_nlink.
385
if (unlikely(a->dir->i_ino == AUFS_ROOT_INO))
386
au_cpup_attr_all(a->dir);
388
if (a->h_child_inode && au_flag_test(sb, AuFlag_XINO)) {
389
if (a->dir->i_ino != AUFS_ROOT_INO)
391
} else if (a->mask & (IN_MOVE_SELF | IN_DELETE_SELF))
675
args.jobs = a->jobs + PARENT;
678
args.h_inode = a->h_dir;
683
err = hin_job(&args);
394
684
ii_write_unlock(a->dir);
395
687
si_read_unlock(sb);
688
vfsub_i_unlock(a->dir);
689
au_nwt_dec(&sbinfo->si_nowait);
398
691
iput(a->h_child_inode);
402
695
//au_debug_off();
700
#define ilog2(n) ffz(~(n))
405
703
static void aufs_inotify(struct inotify_watch *watch, u32 wd, u32 mask,
406
704
u32 cookie, const char *h_child_name,
407
705
struct inode *h_child_inode)
409
707
struct aufs_hinotify *hinotify;
410
708
struct postproc_args *args;
709
int len, wkq_err, isdir, isroot, wh, idx;
413
711
struct inode *dir;
414
//static DECLARE_WAIT_QUEUE_HEAD(wq);
712
union hin_job jobs[2];
713
struct super_block *sb;
417
716
LKTRTrace("i%lu, wd %d, mask 0x%x %s, cookie 0x%x, hcname %s, hi%lu\n",
418
717
watch->inode->i_ino, wd, mask, in_name(mask), cookie,
419
718
h_child_name ? h_child_name : "",
420
719
h_child_inode ? h_child_inode->i_ino : 0);
423
720
#if 0 //defined(ForceInotify) || defined(DbgInotify)
424
Dbg("i%lu, wd %d, mask 0x%x %s, cookie 0x%x, hcname %s, hi%lu\n",
425
watch->inode->i_ino, wd, mask, in_name(mask), cookie,
426
h_child_name ? h_child_name : "",
427
h_child_inode ? h_child_inode->i_ino : 0);
721
AuDbg("i%lu, wd %d, mask 0x%x %s, cookie 0x%x, hcname %s, hi%lu\n",
722
watch->inode->i_ino, wd, mask, in_name(mask), cookie,
723
h_child_name ? h_child_name : "",
724
h_child_inode ? h_child_inode->i_ino : 0);
429
726
/* if IN_UNMOUNT happens, there must be another bug */
430
727
if (mask & (IN_IGNORED | IN_UNMOUNT)) {
728
//WARN_ON(watch->inode->i_ino == 15);
431
729
put_inotify_watch(watch);
734
if (!h_child_name || strcmp(h_child_name, AUFS_XINO_FNAME))
735
AuDbg("i%lu, wd %d, mask 0x%x %s, cookie 0x%x, hcname %s,"
737
watch->inode->i_ino, wd, mask, in_name(mask), cookie,
738
h_child_name ? h_child_name : "",
739
h_child_inode ? h_child_inode->i_ino : 0);
743
hinotify = container_of(watch, struct aufs_hinotify, hin_watch);
744
AuDebugOn(!hinotify || !hinotify->hin_aufs_inode);
745
idx = ilog2(mask & IN_ALL_EVENTS);
746
AuDebugOn(au_hin_nignore <= idx);
747
cnt = hinotify->hin_ignore + idx;
748
if (0 <= atomic_dec_return(cnt))
750
atomic_inc_return(cnt);
753
AuDbg("i%lu, wd %d, mask 0x%x %s, cookie 0x%x, hcname %s, hi%lu\n",
754
watch->inode->i_ino, wd, mask, in_name(mask), cookie,
755
h_child_name ? h_child_name : "",
756
h_child_inode ? h_child_inode->i_ino : 0);
758
if (!h_child_name || strcmp(h_child_name, AUFS_XINO_FNAME))
762
dir = hinotify->hin_aufs_inode;
763
isroot = (dir->i_ino == AUFS_ROOT_INO);
767
len = strlen(h_child_name);
768
if (unlikely(!memcmp(h_child_name, AUFS_WH_PFX,
770
h_child_name += AUFS_WH_PFX_LEN;
771
len -= AUFS_WH_PFX_LEN;
778
isdir = !!S_ISDIR(h_child_inode->i_mode);
779
jobs[PARENT].flags = 0;
780
jobs[CHILD].flags = 0;
435
781
switch (mask & IN_ALL_EVENTS) {
787
jobs[CHILD].attr = 1;
789
jobs[PARENT].attr = 1;
792
/* IN_MOVED_FROM is the first event in rename(2) */
442
793
case IN_MOVED_FROM:
443
794
case IN_MOVED_TO:
795
AuDebugOn(!h_child_name || !h_child_inode);
796
jobs[CHILD].iigen = 1;
797
jobs[CHILD].attr = 1;
798
jobs[CHILD].xino0 = 1;//!!isdir;
799
jobs[CHILD].digen = 1;
800
jobs[PARENT].attr = 1;
801
jobs[PARENT].dirent = 1;
445
805
AuDebugOn(!h_child_name || !h_child_inode);
806
jobs[PARENT].attr = 1;
807
jobs[PARENT].dirent = 1;
808
jobs[CHILD].digen = 1;
809
jobs[CHILD].iigen = 1;
811
jobs[CHILD].attr = (!isdir && h_child_inode->i_nlink > 1);
449
816
* aufs never be able to get this child inode.
450
* revalidation should be in d_revalide()
817
* revalidation should be in d_revalidate()
451
818
* by checking i_nlink, i_generation or d_unhashed().
453
820
AuDebugOn(!h_child_name);
821
jobs[PARENT].attr = 1;
822
jobs[PARENT].dirent = 1;
823
jobs[CHILD].iigen = 1;
824
jobs[CHILD].digen = 1;
456
827
case IN_DELETE_SELF:
828
jobs[PARENT].iigen = !isroot;
457
831
case IN_MOVE_SELF:
458
832
AuDebugOn(h_child_name || h_child_inode);
833
if (unlikely(isroot)) {
834
AuWarn("root branch was moved\n");
840
jobs[PARENT].xino0 = !isroot;
841
jobs[PARENT].iigen = !isroot;
842
jobs[PARENT].digen = !isroot;
843
jobs[PARENT].attr = !isroot;
844
jobs[PARENT].dirent = !isroot;
852
#if 0 //def DbgInotify
470
/* iput() will be called in postproc() */
471
hinotify = container_of(watch, struct aufs_hinotify, hin_watch);
472
AuDebugOn(!hinotify || !hinotify->hin_aufs_inode);
473
dir = hinotify->hin_aufs_inode;
475
/* force re-lookup in next d_revalidate() */
476
if (dir->i_ino != AUFS_ROOT_INO)
479
if (h_child_name && dec_gen_by_name(dir, h_child_name, mask))
480
len = strlen(h_child_name);
482
//wait_event(wq, (args = kmalloc(sizeof(*args), GFP_KERNEL)));
483
args = kmalloc(sizeof(*args) + len + 1, GFP_KERNEL);
857
h_child_inode = NULL;
859
/* iput() and kfree() will be called in postproc() */
860
args = kmalloc(sizeof(*args) + len + 1, GFP_TEMPORARY);
484
861
if (unlikely(!args)) {
862
AuErr1("no memory\n");
865
memcpy(args->jobs, jobs, sizeof(jobs));
488
866
args->mask = mask;
489
867
args->dir = igrab(dir);
490
868
args->h_dir = igrab(watch->inode);
491
args->h_child_inode = NULL;
870
igrab(h_child_inode);
871
args->h_child_inode = h_child_inode;
872
args->h_child_nlen = len;
494
args->h_child_inode = igrab(h_child_inode);
496
args->h_child_name = p + sizeof(*args);
497
memcpy(args->h_child_name, h_child_name, len + 1);
499
//atomic_inc(&stosi(args->dir->i_sb)->si_hinotify);
500
wkq_err = au_wkq_nowait(postproc, args, dir->i_sb, /*dlgt*/0);
501
if (unlikely(wkq_err))
502
Err("wkq %d\n", wkq_err);
876
memcpy(p, h_child_name, len + 1);
880
au_nwt_inc(&stosi(sb)->si_nowait);
881
wkq_err = au_wkq_nowait(postproc, args, sb, /*dlgt*/0);
882
if (unlikely(wkq_err)) {
883
AuErr("wkq %d\n", wkq_err);
884
au_nwt_dec(&stosi(sb)->si_nowait);
505
888
static void aufs_inotify_destroy(struct inotify_watch *watch)