2
* Copyright (C) 2005, 2006, 2007 Junjiro Okajima
2
* Copyright (C) 2005, 2006, 2007, 2008 Junjiro Okajima
4
4
* This program, aufs is free software; you can redistribute it and/or modify
5
5
* it under the terms of the GNU General Public License as published by
16
16
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
/* $Id: dentry.c,v 1.65 2008/01/21 04:57:48 sfjro Exp $ */
19
/* $Id: dentry.c,v 1.72 2008/03/31 07:42:05 sfjro Exp $ */
21
21
//#include <linux/fs.h>
22
22
//#include <linux/namei.h>
163
163
tmp_nd.dentry = dget(parent);
164
164
tmp_nd.mnt = mntget(ndx->nfsmnt);
165
165
#ifndef CONFIG_AUFS_DLGT
166
167
dentry = vfsub__lookup_hash(&this, parent, &tmp_nd);
169
dirperm1 = au_ftest_ndx(ndx->flags, DIRPERM1);
170
if (!dirperm1 && !au_ftest_ndx(ndx->flags, DLGT))
169
171
dentry = vfsub__lookup_hash(&this, parent, &tmp_nd);
250
253
struct dentry *dentry;
252
LKTRTrace("%.*s/%.*s, ndx{%d, %d}\n",
253
AuDLNPair(parent), len, name, !!ndx->nfsmnt, ndx->dlgt);
255
LKTRTrace("%.*s/%.*s, ndx{%d, 0x%x}\n",
256
AuDLNPair(parent), len, name, !!ndx->nfsmnt, ndx->flags);
255
258
ndx->nd_file = NULL;
256
259
if (!ndx->nfsmnt) {
257
260
#ifndef CONFIG_AUFS_DLGT
258
261
dentry = vfsub_lookup_one_len(name, parent, len);
263
int dirperm1 = au_ftest_ndx(ndx->flags, DIRPERM1);
264
if (!dirperm1 && !au_ftest_ndx(ndx->flags, DLGT))
261
265
dentry = vfsub_lookup_one_len(name, parent, len);
283
287
#endif /* !defined(AuNoNfsBranch) || defined(CONFIG_AUFS_DLGT) */
289
#ifdef CONFIG_AUFS_ROBR
290
static int au_test_robr_wh(struct qstr *name, struct dentry *h_parent,
291
struct qstr *wh_name, int try_sio,
292
struct aufs_ndx *ndx)
294
if (strncmp(name->name, AUFS_WH_PFX, AUFS_WH_PFX_LEN))
295
return au_test_wh(h_parent, wh_name, try_sio, ndx);
299
static int au_test_robr_shwh(struct super_block *sb, const struct qstr *name)
306
static int au_test_robr_wh(struct qstr *name, struct dentry *h_parent,
307
struct qstr *wh_name, int try_sio,
308
struct aufs_ndx *ndx)
310
return au_test_wh(h_parent, wh_name, try_sio, ndx);
313
static int au_test_robr_shwh(struct super_block *sb, const struct qstr *name)
315
if (unlikely(!au_flag_test_shwh(sb)
316
&& !strncmp(name->name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)))
321
#endif /* CONFIG_AUFS_ROBR */
285
323
struct au_lkup_one_args {
286
324
struct dentry **errp;
287
325
const char *name;
296
334
*a->errp = au_lkup_one(a->name, a->parent, a->len, a->ndx);
337
#define AuLkup_ALLOW_NEG 1
338
#define AuLkup_DLGT (1 << 1)
339
#define AuLkup_DIRPERM1 (1 << 2)
340
#define au_ftest_lkup(flags, name) ((flags) & AuLkup_##name)
341
#define au_fset_lkup(flags, name) { (flags) |= AuLkup_##name; }
342
#define au_fclr_lkup(flags, name) { (flags) &= ~AuLkup_##name; }
299
344
struct au_do_lookup_args {
300
unsigned int allow_neg:1;
303
347
struct nameidata *nd;
315
359
struct dentry *h_dentry;
316
360
int wh_found, wh_able, opq;
317
struct inode *h_dir, *h_inode;
361
struct inode *h_dir, *h_inode, *inode;
318
362
struct qstr *name;
319
363
struct super_block *sb;
320
364
struct nameidata tmp_nd;
321
365
struct aufs_ndx ndx = {
369
const int allow_neg = au_ftest_lkup(args->flags, ALLOW_NEG);
326
LKTRTrace("%.*s/%.*s, b%d, {allow_neg %d, type 0%o, dlgt %d, nd %d}\n",
371
LKTRTrace("%.*s/%.*s, b%d, {flags 0x%x, type 0%o, nd %d}\n",
327
372
AuDLNPair(h_parent), AuDLNPair(dentry), bindex,
328
args->allow_neg, args->type, args->dlgt, !!args->nd);
373
args->flags, args->type, !!args->nd);
329
374
AuDebugOn(IS_ROOT(dentry));
330
375
h_dir = h_parent->d_inode;
333
378
sb = dentry->d_sb;
334
379
ndx.nfsmnt = au_nfsmnt(sb, bindex);
380
if (unlikely(au_ftest_lkup(args->flags, DLGT)))
381
au_fset_ndx(ndx.flags, DLGT);
382
if (unlikely(au_ftest_lkup(args->flags, DIRPERM1)))
383
au_fset_ndx(ndx.flags, DIRPERM1);
335
384
LKTRTrace("nfsmnt %p\n", ndx.nfsmnt);
336
385
ndx.br = stobr(sb, bindex);
337
386
wh_able = br_whable(ndx.br->br_perm);
338
387
name = &dentry->d_name;
339
if (unlikely(wh_able)) {
340
#ifdef CONFIG_AUFS_ROBR
342
if (strncmp(name->name, AUFS_WH_PFX, AUFS_WH_PFX_LEN))
343
wh_found = au_test_wh(h_parent, wh_name, /*try_sio*/0,
346
wh_found = au_test_wh(h_parent, wh_name, /*try_sio*/0, &ndx);
388
if (unlikely(wh_able))
389
wh_found = au_test_robr_wh(name, h_parent, wh_name,
349
391
//if (LktrCond) wh_found = -1;
350
392
h_dentry = ERR_PTR(wh_found);
356
398
/* We found a whiteout */
357
399
//set_dbend(dentry, bindex);
358
400
set_dbwh(dentry, bindex);
359
if (!args->allow_neg)
360
402
return NULL; /* success */
361
403
if (unlikely(ndx.nd
362
404
&& au_test_nfs(h_parent->d_sb)
407
if (!h_inode || !S_ISDIR(h_inode->i_mode) || !wh_able)
449
inode = dentry->d_inode;
450
if (!h_inode || !S_ISDIR(h_inode->i_mode) || !wh_able
451
|| (inode && !S_ISDIR(inode->i_mode)))
408
452
return h_dentry; /* success */
410
454
vfsub_i_lock_nested(h_inode, AuLsc_I_CHILD);
431
475
* returns the number of hidden positive dentries,
432
476
* otherwise an error.
477
* can be called at unlinking with @type is zero.
434
479
int au_lkup_dentry(struct dentry *dentry, aufs_bindex_t bstart, mode_t type,
435
480
struct nameidata *nd)
482
int npositive, err, isdir;
438
483
struct dentry *parent;
439
aufs_bindex_t bindex, btail;
484
aufs_bindex_t bindex, btail, bdiropq;
440
485
const struct qstr *name = &dentry->d_name;
441
486
struct qstr whname;
442
487
struct super_block *sb;
443
489
struct au_do_lookup_args args = {
451
497
/* dir may not be locked */
452
498
parent = dget_parent(dentry);
454
#ifndef CONFIG_AUFS_ROBR
456
if (unlikely(!strncmp(name->name, AUFS_WH_PFX, AUFS_WH_PFX_LEN)))
500
err = au_test_robr_shwh(dentry->d_sb, name);
460
504
err = au_alloc_whname(name->name, name->len, &whname);
461
505
//if (LktrCond) {au_free_whname(&whname); err = -1;}
465
509
sb = dentry->d_sb;
466
args.dlgt = !!au_need_dlgt(sb);
467
args.allow_neg = !type;
510
inode = dentry->d_inode;
511
isdir = (inode && S_ISDIR(inode->i_mode));
513
if (unlikely(au_need_dlgt(sb)))
514
au_fset_lkup(args.flags, DLGT);
515
if (unlikely(au_need_dirperm1(sb)))
516
au_fset_lkup(args.flags, DIRPERM1);
518
au_fset_lkup(args.flags, ALLOW_NEG);
469
520
btail = dbtaildir(parent);
470
521
for (bindex = bstart; bindex <= btail; bindex++) {
509
560
args.type = h_inode->i_mode & S_IFMT;
510
561
if (args.type != S_IFDIR)
512
else if (dbdiropq(dentry) >= 0)
564
/* the type of lowers may be different */
565
bdiropq = dbdiropq(dentry);
566
if (bdiropq >= 0 && bdiropq <= bindex)
536
591
LKTRTrace("%.*s/%.*s\n", AuDLNPair(parent), len, name);
538
if (!au_test_perm(parent->d_inode, MAY_EXEC, ndx->dlgt))
593
if (!au_test_perm_sio(parent->d_inode, MAY_EXEC,
594
au_ftest_ndx(ndx->flags, DLGT)))
539
595
dentry = au_lkup_one(name, parent, len, ndx);
542
int dlgt = ndx->dlgt;
598
unsigned int flags = ndx->flags;
543
599
struct au_lkup_one_args args = {
607
au_fclr_ndx(ndx->flags, DLGT);
608
au_fclr_ndx(ndx->flags, DIRPERM1);
552
609
wkq_err = au_wkq_wait(au_call_lkup_one, &args, /*dlgt*/0);
553
610
if (unlikely(wkq_err))
554
611
dentry = ERR_PTR(wkq_err);
558
615
AuTraceErrPtr(dentry);
586
644
sb = dentry->d_sb;
587
645
ndx.nfsmnt = au_nfsmnt(sb, bindex);
588
ndx.dlgt = au_need_dlgt(sb);
646
if (unlikely(au_need_dlgt(sb)))
647
au_fset_ndx(ndx.flags, DLGT);
648
if (unlikely(au_need_dirperm1(sb)))
649
au_fset_ndx(ndx.flags, DIRPERM1);
589
650
h_dentry = au_sio_lkup_one(dentry->d_name.name, h_parent,
590
651
dentry->d_name.len, &ndx);
591
652
//if (LktrCond) {dput(h_dentry); h_dentry = ERR_PTR(-1);}
625
686
struct dentry *parent;
626
687
aufs_bindex_t bindex, parent_bend, parent_bstart, bwh, bdiropq, bend;
627
688
struct aufs_hdentry *p;
629
691
LKTRTrace("%.*s, type 0%o\n", AuDLNPair(dentry), type);
630
692
DiMustWriteLock(dentry);
631
693
sb = dentry->d_sb;
632
694
AuDebugOn(IS_ROOT(dentry));
633
696
parent = dget_parent(dentry);
634
AuDebugOn(au_digen(parent) != au_sigen(sb));
697
AuDebugOn(au_digen(parent) != sgen
698
|| au_iigen(parent->d_inode) != sgen);
636
700
npositive = -ENOMEM;
637
701
new_sz = sizeof(*dinfo->di_hdentry) * (sbend(sb) + 1);
727
791
return npositive;
794
#ifdef CONFIG_AUFS_FAKE_DM
796
static int au_lock_nd(struct dentry *dentry, struct nameidata *nd)
801
static void au_unlock_nd(int locked, struct nameidata *nd)
808
static int au_lock_nd(struct dentry *dentry, struct nameidata *nd)
811
if (nd && dentry != nd->dentry) {
812
di_read_lock_parent(nd->dentry, 0);
818
static void au_unlock_nd(int locked, struct nameidata *nd)
821
di_read_unlock(nd->dentry, 0);
824
#endif /* CONFIG_AUFS_FAKE_DM */
730
826
static int h_d_revalidate(struct dentry *dentry, struct inode *inode,
731
827
struct nameidata *nd, int do_udba)
774
870
if (inode && S_ISDIR(inode->i_mode))
775
871
btail = dbtaildir(dentry);
777
#ifndef CONFIG_AUFS_FAKE_DM
778
if (nd && dentry != nd->dentry) {
779
di_read_lock_parent(nd->dentry, 0);
872
locked = au_lock_nd(dentry, nd);
783
873
for (bindex = bstart; bindex <= btail; bindex++) {
784
874
h_dentry = au_h_dptr_i(dentry, bindex);
785
if (unlikely(!h_dentry))
878
LKTRTrace("b%d, %.*s\n", bindex, AuDLNPair(h_dentry));
879
//#define TestingFuse
881
/* force re-lookup for fuse, in order to update attributes */
882
if (unlikely(au_test_fuse(h_dentry->d_sb)))
787
886
if (unlikely(do_udba
789
888
&& (unhashed != d_unhashed(h_dentry)
917
1018
inode = dentry->d_inode;
918
1019
AuDebugOn(!inode);
920
if (au_digen(dentry) == sgen)
1021
if (au_digen(dentry) == sgen && au_iigen(inode) == sgen)
923
1024
parent = dget_parent(dentry);
924
1025
di_read_lock_parent(parent, AuLock_IR);
925
AuDebugOn(au_digen(parent) != sgen);
1026
AuDebugOn(au_digen(parent) != sgen
1027
|| au_iigen(parent->d_inode) != sgen);
926
1028
#ifdef CONFIG_AUFS_DEBUG
965
1067
AuDebugOn(!dentry->d_inode);
966
1068
DiMustWriteLock(dentry);
968
if (!stosi(dentry->d_sb)->si_failed_refresh_dirs)
1070
if (!au_ftest_si(stosi(dentry->d_sb), FAILED_REFRESH_DIRS))
969
1071
return simple_reval_dpath(dentry, sgen);
971
1073
/* slow loop, keep it simple and stupid */
972
1074
/* cf: au_cpup_dirs() */
975
while (au_digen(dentry) != sgen) {
1077
while (au_digen(dentry) != sgen || au_iigen(dentry->d_inode) != sgen) {
979
1081
parent = dget_parent(d);
980
if (au_digen(parent) == sgen)
1082
if (au_digen(parent) == sgen
1083
&& au_iigen(parent->d_inode) == sgen)
991
1094
/* someone might update our dentry while we were sleeping */
992
if (au_digen(d) != sgen) {
1095
if (au_digen(d) != sgen || au_iigen(d->d_inode) != sgen) {
993
1096
di_read_lock_parent(parent, AuLock_IR);
994
1097
/* returns a number of positive dentries */
995
1098
err = au_refresh_hdentry(d, inode->i_mode & S_IFMT);
1048
1151
#ifdef ForceInotify
1049
1152
AuDbg("UDBA or digen, %.*s\n", AuDLNPair(dentry));
1051
//di_read_lock_child(dentry, AuLock_IR);err = -EINVAL; goto out;
1052
//vfsub_i_lock(inode);
1053
1154
di_write_lock_child(dentry);
1055
1156
err = au_reval_dpath(dentry, sgen);
1057
1158
di_downgrade_lock(dentry, AuLock_IR);
1058
//vfsub_i_unlock(inode);
1059
1159
if (unlikely(err))
1061
ii_read_unlock(inode);
1062
AuDebugOn(au_iigen(inode) != sgen);
1162
ii_read_unlock(inode);
1163
AuDebugOn(au_digen(dentry) != sgen);