2
2
(http://archive.ubuntu.com/ubuntu/pool/main/l/linux-source-2.6.22/
3
3
linux-source-2.6.22_2.6.22-14.46_all.deb), not a generic patch for apparmor v2.
5
This patch is against aufs version 20080226.
5
7
This patch is NOT tested because I am not an ubuntu user.
8
9
Index: fs/aufs/cpup.c
9
10
===================================================================
10
11
RCS file: /cvsroot/aufs/aufs/fs/aufs/cpup.c,v
11
retrieving revision 1.58
12
diff -u -p -r1.58 cpup.c
13
--- fs/aufs/cpup.c 26 Nov 2007 01:34:04 -0000 1.58
14
+++ fs/aufs/cpup.c 26 Nov 2007 14:15:19 -0000
15
@@ -119,7 +119,8 @@ void au_cpup_attr_all(struct inode *inod
12
retrieving revision 1.62
13
diff -u -p -r1.62 cpup.c
14
--- fs/aufs/cpup.c 18 Feb 2008 04:35:36 -0000 1.62
15
+++ fs/aufs/cpup.c 28 Feb 2008 13:45:59 -0000
16
@@ -120,7 +120,8 @@ void au_cpup_attr_all(struct inode *inod
17
18
/* keep the timestamps of the parent dir when cpup */
18
19
void au_dtime_store(struct au_dtime *dt, struct dentry *dentry,
19
- aufs_bindex_t bindex, struct dentry *h_dentry)
20
+ aufs_bindex_t bindex, struct dentry *h_dentry,
21
+ struct vfsmount *h_mnt)
20
- struct dentry *h_dentry, struct aufs_hinode *hdir)
21
+ struct dentry *h_dentry, struct vfsmount *h_mnt,
22
+ struct aufs_hinode *hdir)
23
24
struct inode *inode;
25
@@ -128,6 +129,7 @@ void au_dtime_store(struct au_dtime *dt,
26
@@ -129,6 +130,7 @@ void au_dtime_store(struct au_dtime *dt,
27
28
dt->dt_dentry = dentry;
28
29
dt->dt_h_dentry = h_dentry;
29
+ dt->dt_h_mnt = h_mnt;
30
dt->dt_bindex = bindex;
30
+ dt->dt_h_mnt = h_mnt;
31
32
inode = h_dentry->d_inode;
32
33
dt->dt_atime = inode->i_atime;
33
@@ -156,17 +158,20 @@ void au_dtime_revert(struct au_dtime *dt
34
parent = dget_parent(dt->dt_dentry);
35
vfsub_ign_hinode(&vargs, IN_ATTRIB,
36
itohi(parent->d_inode, dt->dt_bindex));
37
- err = vfsub_notify_change(dt->dt_h_dentry, &attr, &vargs);
38
+ err = vfsub_notify_change(dt->dt_h_dentry, dt->dt_h_mnt, &attr,
42
- err = vfsub_notify_change(dt->dt_h_dentry, &attr, &vargs);
43
+ err = vfsub_notify_change(dt->dt_h_dentry, dt->dt_h_mnt, &attr,
34
@@ -153,14 +155,15 @@ void au_dtime_revert(struct au_dtime *dt
35
vfsub_args_init(&vargs, &ign, au_need_dlgt(dt->dt_dentry->d_sb), 0);
36
if (unlikely(dt->dt_hdir))
37
vfsub_ign_hinode(&vargs, IN_ATTRIB, dt->dt_hdir);
38
- err = vfsub_notify_change(dt->dt_h_dentry, &attr, &vargs);
39
+ err = vfsub_notify_change(dt->dt_h_dentry, dt->dt_h_mnt, &attr, &vargs);
46
41
AuWarn("restoring timestamps failed(%d). ignored\n", err);
137
132
//{vfs_unlink(h_dir, h_dst); err = -1;}
139
@@ -388,7 +398,8 @@ static int cpup_entry(struct dentry *den
134
@@ -391,7 +399,7 @@ static int cpup_entry(struct dentry *den
143
- err = vfsub_mknod(h_dir, h_dst, mode, h_inode->i_rdev, dlgt);
144
+ err = vfsub_mknod(h_dir, h_dst, h_mnt, mode, h_inode->i_rdev,
138
- err = vfsub_mknod(h_dir, h_dst, mode,
139
+ err = vfsub_mknod(h_dir, h_dst, h_mnt, mode,
140
au_h_rdev(h_inode, /*h_mnt*/NULL, h_src),
146
142
//if (LktrCond) {vfs_unlink(h_dir, h_dst); err = -1;}
149
@@ -419,6 +430,7 @@ int au_cpup_single(struct dentry *dentry
143
@@ -425,6 +433,7 @@ int au_cpup_single(struct dentry *dentry
151
144
struct vfsub_args vargs;
152
145
struct aufs_sbinfo *sbinfo;
153
+ struct vfsmount *h_mnt;
146
struct aufs_hinode *hgdir;
147
+ struct vfsmount *h_mnt;
155
LKTRTrace("%.*s, i%lu, bdst %d, bsrc %d, len %Ld, dtime %u\n",
149
LKTRTrace("%.*s, i%lu, bdst %d, bsrc %d, len %Ld, flags 0x%x\n",
156
150
AuDLNPair(dentry), dentry->d_inode->i_ino, bdst, bsrc, len,
157
@@ -438,6 +450,7 @@ int au_cpup_single(struct dentry *dentry
151
@@ -444,6 +453,7 @@ int au_cpup_single(struct dentry *dentry
158
152
dir = parent->d_inode;
160
154
sbinfo = stosi(sb);
198
192
au_dtime_revert(&dt);
200
@@ -671,6 +685,7 @@ int au_cpup_wh(struct dentry *dentry, au
194
@@ -688,6 +699,7 @@ int au_cpup_wh(struct dentry *dentry, au
201
195
struct au_dtime dt;
202
196
struct aufs_dinfo *dinfo;
203
197
aufs_bindex_t bstart;
204
198
+ struct vfsmount *h_mnt;
205
199
struct vfsub_args vargs;
200
struct aufs_hinode *hgdir;
206
201
struct aufs_ndx ndx = {
208
@@ -701,7 +716,8 @@ int au_cpup_wh(struct dentry *dentry, au
209
if (IS_ERR(wh_dentry))
212
- au_dtime_store(&dt, parent, bdst, h_parent);
213
+ h_mnt = sbr_mnt(sb, bdst);
214
+ au_dtime_store(&dt, parent, bdst, h_parent, h_mnt);
202
@@ -727,7 +739,8 @@ int au_cpup_wh(struct dentry *dentry, au
203
hgdir = itohi(gparent->d_inode, bdst);
206
- au_dtime_store(&dt, parent, h_parent, hgdir);
207
+ h_mnt = sbr_mnt(sb, bdst);
208
+ au_dtime_store(&dt, parent, h_parent, h_mnt, hgdir);
215
209
dinfo = dtodi(dentry);
216
210
bstart = dinfo->di_bstart;
217
211
h_dentry_bdst = dinfo->di_hdentry[0 + bdst].hd_dentry;
218
@@ -727,7 +743,7 @@ int au_cpup_wh(struct dentry *dentry, au
212
@@ -753,7 +766,7 @@ int au_cpup_wh(struct dentry *dentry, au
219
213
/* dget first to force sillyrename on nfs */
221
vfsub_args_init(&vargs, NULL, ndx.dlgt, 0);
215
vfsub_args_init(&vargs, NULL, dlgt, 0);
222
216
- err = vfsub_unlink(h_dir, wh_dentry, &vargs);
223
217
+ err = vfsub_unlink(h_dir, wh_dentry, h_mnt, &vargs);
224
218
//if (LktrCond) err = -1;
227
221
Index: fs/aufs/cpup.h
228
222
===================================================================
229
223
RCS file: /cvsroot/aufs/aufs/fs/aufs/cpup.h,v
230
retrieving revision 1.25
231
diff -u -p -r1.25 cpup.h
232
--- fs/aufs/cpup.h 12 Nov 2007 01:39:39 -0000 1.25
233
+++ fs/aufs/cpup.h 26 Nov 2007 14:15:19 -0000
234
@@ -75,11 +75,13 @@ int au_test_and_cpup_dirs(struct dentry
224
retrieving revision 1.28
225
diff -u -p -r1.28 cpup.h
226
--- fs/aufs/cpup.h 18 Feb 2008 04:35:43 -0000 1.28
227
+++ fs/aufs/cpup.h 28 Feb 2008 13:45:59 -0000
228
@@ -76,11 +76,13 @@ int au_test_and_cpup_dirs(struct dentry
235
229
/* keep timestamps when copyup */
236
230
struct au_dtime {
237
231
struct dentry *dt_dentry, *dt_h_dentry;
238
+ struct vfsmount *dt_h_mnt;
239
aufs_bindex_t dt_bindex;
232
+ struct vfsmount *dt_h_mnt;
233
struct aufs_hinode *dt_hdir;
240
234
struct timespec dt_atime, dt_mtime;
242
236
void au_dtime_store(struct au_dtime *dt, struct dentry *dentry,
243
- aufs_bindex_t bindex, struct dentry *h_dentry);
244
+ aufs_bindex_t bindex, struct dentry *h_dentry,
245
+ struct vfsmount *h_mnt);
237
- struct dentry *h_dentry, struct aufs_hinode *hdir);
238
+ struct dentry *h_dentry, struct vfsmount *h_mnt,
239
+ struct aufs_hinode *hdir);
246
240
void au_dtime_revert(struct au_dtime *dt);
248
242
#endif /* __KERNEL__ */
249
243
Index: fs/aufs/i_op.c
250
244
===================================================================
251
245
RCS file: /cvsroot/aufs/aufs/fs/aufs/i_op.c,v
252
retrieving revision 1.51
253
diff -u -p -r1.51 i_op.c
254
--- fs/aufs/i_op.c 26 Nov 2007 01:34:25 -0000 1.51
255
+++ fs/aufs/i_op.c 26 Nov 2007 14:15:19 -0000
256
@@ -531,7 +531,7 @@ static int aufs_setattr(struct dentry *d
257
vfsub_ign_hinode(&vargs, events, itohi(dir, bcpup));
246
retrieving revision 1.56
247
diff -u -p -r1.56 i_op.c
248
--- fs/aufs/i_op.c 24 Feb 2008 23:47:13 -0000 1.56
249
+++ fs/aufs/i_op.c 28 Feb 2008 13:46:00 -0000
250
@@ -766,7 +766,8 @@ static int aufs_setattr(struct dentry *d
251
vfsub_ign_hinode(&vargs, events,
252
itohi(rargs.dir, rargs.btgt));
260
- err = vfsub_notify_change(h_dentry, ia, &vargs);
261
+ err = vfsub_notify_change(h_dentry, sbr_mnt(sb, bcpup), ia, &vargs);
254
- err = vfsub_notify_change(rargs.h_dentry, ia, &vargs);
255
+ err = vfsub_notify_change(rargs.h_dentry, sbr_mnt(sb, rargs.btgt), ia,
264
259
au_cpup_attr_changeable(inode);
265
260
Index: fs/aufs/i_op_add.c
266
261
===================================================================
267
262
RCS file: /cvsroot/aufs/aufs/fs/aufs/i_op_add.c,v
268
retrieving revision 1.55
269
diff -u -p -r1.55 i_op_add.c
270
--- fs/aufs/i_op_add.c 12 Nov 2007 01:40:23 -0000 1.55
271
+++ fs/aufs/i_op_add.c 26 Nov 2007 14:15:19 -0000
263
retrieving revision 1.60
264
diff -u -p -r1.60 i_op_add.c
265
--- fs/aufs/i_op_add.c 18 Feb 2008 04:37:16 -0000 1.60
266
+++ fs/aufs/i_op_add.c 28 Feb 2008 13:46:00 -0000
272
267
@@ -27,7 +27,7 @@
273
268
* if it failed, re-create the removed whiteout.
289
284
if (unlikely(err))
290
@@ -120,7 +120,8 @@ lock_hdir_lkup_wh(struct dentry *dentry,
291
h_dir = h_parent->d_inode;
292
hdir_lock(h_dir, dir, bcpup);
285
@@ -240,7 +240,8 @@ lock_hdir_lkup_wh(struct dentry *dentry,
294
- au_dtime_store(dt, parent, bcpup, h_parent);
295
+ au_dtime_store(dt, parent, bcpup, h_parent,
296
+ sbr_mnt(parent->d_sb, bcpup));
289
- au_dtime_store(dt, parent, h_parent, hgdir);
290
+ au_dtime_store(dt, parent, h_parent,
291
+ sbr_mnt(parent->d_sb, bcpup), hgdir);
297
292
wh_dentry = NULL;
298
293
if (/* bcpup != bstart || */ bcpup != dbwh(dentry))
299
294
goto out; /* success */
300
@@ -168,6 +169,7 @@ static int add_simple(struct inode *dir,
295
@@ -285,6 +286,7 @@ static int add_simple(struct inode *dir,
301
296
struct au_dtime dt;
302
297
struct vfsub_args vargs;
303
298
struct super_block *sb;
304
299
+ struct vfsmount *h_mnt;
305
300
struct au_wr_dir_args wr_dir_args = {
306
301
.force_btgt = -1,
308
@@ -194,6 +196,7 @@ static int add_simple(struct inode *dir,
302
.flags = AuWrDir_ADD_ENTRY
303
@@ -309,6 +311,7 @@ static int add_simple(struct inode *dir,
309
304
IMustLock(h_dir);
311
306
dlgt = au_need_dlgt(sb);
471
466
Index: fs/aufs/i_op_del.c
472
467
===================================================================
473
468
RCS file: /cvsroot/aufs/aufs/fs/aufs/i_op_del.c,v
474
retrieving revision 1.55
475
diff -u -p -r1.55 i_op_del.c
476
--- fs/aufs/i_op_del.c 19 Nov 2007 01:07:10 -0000 1.55
477
+++ fs/aufs/i_op_del.c 26 Nov 2007 14:15:19 -0000
478
@@ -122,7 +122,8 @@ lock_hdir_create_wh(struct dentry *dentr
479
h_parent = au_h_dptr_i(parent, *bcpup);
480
h_dir = h_parent->d_inode;
481
hdir_lock(h_dir, dir, *bcpup);
482
- au_dtime_store(dt, parent, *bcpup, h_parent);
483
+ au_dtime_store(dt, parent, *bcpup, h_parent,
484
+ sbr_mnt(dentry->d_sb, *bcpup));
469
retrieving revision 1.59
470
diff -u -p -r1.59 i_op_del.c
471
--- fs/aufs/i_op_del.c 18 Feb 2008 04:37:26 -0000 1.59
472
+++ fs/aufs/i_op_del.c 28 Feb 2008 13:46:00 -0000
473
@@ -232,7 +232,8 @@ lock_hdir_create_wh(struct dentry *dentr
477
- au_dtime_store(dt, parent, h_parent, hgdir);
478
+ au_dtime_store(dt, parent, h_parent,
479
+ sbr_mnt(dentry->d_sb, bcpup), hgdir);
485
480
wh_dentry = NULL;
487
482
goto out; /* success, no need to create whiteout */
488
@@ -212,16 +213,17 @@ struct revert_flags {
483
@@ -326,7 +327,8 @@ static void epilog(struct inode *dir, st
484
#define au_fset_rev(flags, name) { (flags) |= AuRev_##name; }
485
#define au_fclr_rev(flags, name) { (flags) &= ~AuRev_##name; }
492
487
-static int do_revert(int err, struct dentry *wh_dentry, struct dentry *dentry,
493
- aufs_bindex_t bwh, struct au_dtime *dt,
494
- struct revert_flags *flags)
495
488
+static int do_revert(int err, struct dentry *wh_dentry, struct vfsmount *h_mnt,
496
+ struct dentry *dentry, aufs_bindex_t bwh,
497
+ struct au_dtime *dt, struct revert_flags *flags)
489
+ struct dentry *dentry,
490
aufs_bindex_t bwh, struct au_dtime *dt,
493
@@ -335,7 +337,7 @@ static int do_revert(int err, struct den
502
495
dir = wh_dentry->d_parent->d_inode; /* dir inode is locked */
504
- rerr = au_unlink_wh_dentry(dir, wh_dentry, dentry, dir, !!flags->dlgt);
497
- rerr = au_unlink_wh_dentry(dir, wh_dentry, dentry, dir,
505
498
+ rerr = au_unlink_wh_dentry(dir, wh_dentry, h_mnt, dentry, dir,
499
au_ftest_rev(flags, DLGT));
509
set_dbwh(dentry, bwh);
510
@@ -244,6 +246,7 @@ int aufs_unlink(struct inode *dir, struc
502
@@ -359,6 +361,7 @@ int aufs_unlink(struct inode *dir, struc
511
503
struct au_dtime dt;
512
504
aufs_bindex_t bwh, bindex, bstart;
513
505
struct super_block *sb;
532
524
/* dir inode is locked */
533
@@ -308,7 +312,8 @@ int aufs_unlink(struct inode *dir, struc
534
struct revert_flags rev_flags = {
537
- rerr = do_revert(err, wh_dentry, dentry, bwh, &dt, &rev_flags);
538
+ rerr = do_revert(err, wh_dentry, h_mnt, dentry, bwh, &dt,
525
@@ -425,7 +429,7 @@ int aufs_unlink(struct inode *dir, struc
528
au_fset_rev(rev_flags, DLGT);
529
- rerr = do_revert(err, wh_dentry, dentry, bwh, &dt, rev_flags);
530
+ rerr = do_revert(err, wh_dentry, h_mnt, dentry, bwh, &dt, rev_flags);
543
@@ -334,6 +339,7 @@ int aufs_rmdir(struct inode *dir, struct
534
@@ -451,6 +455,7 @@ int aufs_rmdir(struct inode *dir, struct
544
535
struct rmdir_whtmp_args *args;
545
536
struct aufs_nhash *whlist;
546
537
struct super_block *sb;
558
549
if (bindex == bstart) {
559
@@ -418,7 +425,8 @@ int aufs_rmdir(struct inode *dir, struct
560
struct revert_flags rev_flags = {
561
.dlgt = au_need_dlgt(sb)
563
- rerr = do_revert(err, wh_dentry, dentry, bwh, &dt, &rev_flags);
564
+ rerr = do_revert(err, wh_dentry, h_mnt, dentry, bwh, &dt,
550
@@ -537,7 +543,7 @@ int aufs_rmdir(struct inode *dir, struct
552
if (unlikely(au_need_dlgt(sb)))
553
au_fset_rev(rev_flags, DLGT);
554
- rerr = do_revert(err, wh_dentry, dentry, bwh, &dt, rev_flags);
555
+ rerr = do_revert(err, wh_dentry, h_mnt, dentry, bwh, &dt, rev_flags);
569
559
Index: fs/aufs/i_op_ren.c
570
560
===================================================================
571
561
RCS file: /cvsroot/aufs/aufs/fs/aufs/i_op_ren.c,v
572
retrieving revision 1.61
573
diff -u -p -r1.61 i_op_ren.c
574
--- fs/aufs/i_op_ren.c 19 Nov 2007 01:09:25 -0000 1.61
575
+++ fs/aufs/i_op_ren.c 26 Nov 2007 14:15:19 -0000
576
@@ -26,6 +26,7 @@ struct rename_args {
562
retrieving revision 1.66
563
diff -u -p -r1.66 i_op_ren.c
564
--- fs/aufs/i_op_ren.c 24 Feb 2008 23:47:47 -0000 1.66
565
+++ fs/aufs/i_op_ren.c 28 Feb 2008 13:46:00 -0000
566
@@ -36,6 +36,7 @@ struct rename_args {
577
567
struct aufs_nhash whlist;
578
568
aufs_bindex_t btgt, bstart[2];
579
569
struct super_block *sb;
580
570
+ struct vfsmount *h_mnt;
582
unsigned int isdir:1;
583
unsigned int issamedir:1;
584
@@ -146,8 +147,9 @@ static int do_rename(struct inode *src_d
585
if (unlikely(a->udba && a->isdir))
573
} __aligned(sizeof(long));
574
@@ -152,8 +153,9 @@ static int do_rename(struct inode *src_d
575
&& au_ftest_ren(a->flags, ISDIR)))
586
576
vfsub_ign_hinode(&vargs, IN_MOVE_SELF,
587
577
itohi(src_dentry->d_inode, a->btgt));
588
578
- err = vfsub_rename(h_dir[SRC], au_h_dptr(src_dentry),
616
@@ -264,7 +266,8 @@ static int do_rename(struct inode *src_d
606
@@ -272,7 +274,7 @@ static int do_rename(struct inode *src_d
617
607
RevertFailure("rename %.*s", AuDLNPair(src_dentry));
619
vfsub_args_init(&vargs, NULL, a->dlgt, 0);
609
vfsub_args_init(&vargs, NULL, au_ftest_ren(a->flags, DLGT), 0);
620
610
- rerr = vfsub_unlink(h_dir[DST], a->h_dentry[DST], &vargs);
621
+ rerr = vfsub_unlink(h_dir[DST], a->h_dentry[DST], a->h_mnt,
611
+ rerr = vfsub_unlink(h_dir[DST], a->h_dentry[DST], a->h_mnt, &vargs);
624
613
set_h_dptr(src_dentry, a->btgt, NULL);
625
614
set_dbstart(src_dentry, a->bstart[SRC]);
626
@@ -294,7 +297,8 @@ static int do_rename(struct inode *src_d
627
if (unlikely(0 && a->udba && a->isdir))
615
@@ -302,7 +304,8 @@ static int do_rename(struct inode *src_d
616
&& au_ftest_ren(a->flags, ISDIR)))
628
617
vfsub_ign_hinode(&vargs, IN_MOVE_SELF,
629
618
itohi(dentry->d_inode, a->btgt));
630
619
- rerr = vfsub_rename(h_dir[DST], h_dst, h_dir[DST], d, &vargs);
636
@@ -311,7 +315,7 @@ static int do_rename(struct inode *src_d
625
@@ -318,7 +321,7 @@ static int do_rename(struct inode *src_d
626
wh_dentry[DST] = NULL;
638
628
if (wh_dentry[SRC]) {
640
629
- rerr = au_unlink_wh_dentry(h_dir[SRC], wh_dentry[SRC],
641
630
+ rerr = au_unlink_wh_dentry(h_dir[SRC], wh_dentry[SRC], a->h_mnt,
642
631
src_dentry, src_dir, /*dlgt*/0);
645
@@ -531,6 +535,7 @@ int aufs_rename(struct inode *src_dir, s
634
@@ -639,6 +642,7 @@ int aufs_rename(struct inode *src_dir, s
637
au_hgdirs(hgdir, &p->a);
649
638
+ p->a.h_mnt = sbr_mnt(p->a.sb, p->a.btgt);
650
639
p->a.h_parent[SRC] = au_h_dptr_i(p->a.parent[SRC], p->a.btgt);
651
640
p->a.h_parent[DST] = au_h_dptr_i(p->a.parent[DST], p->a.btgt);
652
641
dirs[0] = src_dir;
653
@@ -539,18 +544,18 @@ int aufs_rename(struct inode *src_dir, s
642
@@ -664,17 +668,17 @@ int aufs_rename(struct inode *src_dir, s
655
644
/* store timestamps to be revertible */
656
au_dtime_store(p->dt[PARENT] + SRC, p->a.parent[SRC], p->a.btgt,
657
- p->a.h_parent[SRC]);
658
+ p->a.h_parent[SRC], p->a.h_mnt);
660
au_dtime_store(p->dt[PARENT] + DST, p->a.parent[DST], p->a.btgt,
661
- p->a.h_parent[DST]);
662
+ p->a.h_parent[DST], p->a.h_mnt);
645
au_dtime_store(p->dt[PARENT] + SRC, p->a.parent[SRC],
646
- p->a.h_parent[SRC], hgdir[SRC]);
647
+ p->a.h_parent[SRC], p->a.h_mnt, hgdir[SRC]);
648
if (!au_ftest_ren(p->a.flags, ISSAMEDIR))
649
au_dtime_store(p->dt[PARENT] + DST, p->a.parent[DST],
650
- p->a.h_parent[DST], hgdir[DST]);
651
+ p->a.h_parent[DST], p->a.h_mnt, hgdir[DST]);
663
652
do_dt_dstdir = 0;
665
au_dtime_store(p->dt[CHILD] + SRC, src_dentry, p->a.btgt,
666
- p->a.h_dentry[SRC]);
667
+ p->a.h_dentry[SRC], p->a.h_mnt);
653
if (au_ftest_ren(p->a.flags, ISDIR)) {
655
if (unlikely(p->a.udba == AuUdba_INOTIFY))
656
hdir = itohi(p->a.parent[SRC]->d_inode, p->a.btgt);
658
- (p->dt[CHILD] + SRC, src_dentry, p->a.h_dentry[SRC],
659
+ (p->dt[CHILD] + SRC, src_dentry, p->a.h_dentry[SRC], p->a.h_mnt,
668
661
if (p->a.h_dentry[DST]->d_inode) {
669
662
do_dt_dstdir = 1;
670
au_dtime_store(p->dt[CHILD] + DST, dentry, p->a.btgt,
671
- p->a.h_dentry[DST]);
672
+ p->a.h_dentry[DST], p->a.h_mnt);
663
@@ -683,7 +687,7 @@ int aufs_rename(struct inode *src_dir, s
666
(p->dt[CHILD] + DST, dentry, p->a.h_dentry[DST],
676
672
Index: fs/aufs/misc.c
677
673
===================================================================
678
674
RCS file: /cvsroot/aufs/aufs/fs/aufs/misc.c,v
679
retrieving revision 1.47
680
diff -u -p -r1.47 misc.c
681
--- fs/aufs/misc.c 12 Nov 2007 01:40:06 -0000 1.47
682
+++ fs/aufs/misc.c 26 Nov 2007 14:15:19 -0000
675
retrieving revision 1.48
676
diff -u -p -r1.48 misc.c
677
--- fs/aufs/misc.c 18 Feb 2008 04:38:15 -0000 1.48
678
+++ fs/aufs/misc.c 28 Feb 2008 13:46:00 -0000
683
679
@@ -154,7 +154,7 @@ int au_h_create(struct inode *h_dir, str
684
680
/* ---------------------------------------------------------------------- */
730
726
+ struct dentry *h_dentry, struct vfsmount *h_mnt,
731
727
+ struct vfsmount *nfsmnt, struct super_block *sb)
734
730
struct dentry *h_tgt;
735
@@ -142,9 +142,9 @@ static int do_whplink(char *tgt, int len
736
vfsub_args_init(&vargs, NULL, ndx.dlgt, 0);
731
@@ -149,9 +149,9 @@ static int do_whplink(char *tgt, int len
732
vfsub_args_init(&vargs, NULL, dlgt, 0);
737
733
h_dir = h_parent->d_inode;
738
734
if (unlikely(h_tgt->d_inode && h_tgt->d_inode != h_dentry->d_inode))
739
735
- err = vfsub_unlink(h_dir, h_tgt, &vargs);
740
736
+ err = vfsub_unlink(h_dir, h_tgt, h_mnt, &vargs);
741
737
if (!err && !h_tgt->d_inode) {
742
- err = vfsub_link(h_dentry, h_dir, h_tgt, ndx.dlgt);
743
+ err = vfsub_link(h_dentry, h_mnt, h_dir, h_tgt, h_mnt, ndx.dlgt);
738
- err = vfsub_link(h_dentry, h_dir, h_tgt, dlgt);
739
+ err = vfsub_link(h_dentry, h_mnt, h_dir, h_tgt, h_mnt, dlgt);
744
740
//inode->i_nlink++;
747
@@ -160,6 +160,7 @@ struct do_whplink_args {
743
@@ -167,6 +167,7 @@ struct do_whplink_args {
749
745
struct dentry *h_parent;
750
746
struct dentry *h_dentry;
781
777
Index: fs/aufs/vfsub.c
782
778
===================================================================
783
779
RCS file: /cvsroot/aufs/aufs/fs/aufs/vfsub.c,v
784
retrieving revision 1.23
785
diff -u -p -r1.23 vfsub.c
786
--- fs/aufs/vfsub.c 5 Nov 2007 01:38:24 -0000 1.23
787
+++ fs/aufs/vfsub.c 26 Nov 2007 14:15:19 -0000
788
@@ -156,6 +156,7 @@ struct symlink_args {
780
retrieving revision 1.31
781
diff -u -p -r1.31 vfsub.c
782
--- fs/aufs/vfsub.c 26 Feb 2008 13:20:08 -0000 1.31
783
+++ fs/aufs/vfsub.c 28 Feb 2008 13:46:00 -0000
784
@@ -103,7 +103,7 @@ int do_vfsub_create(struct inode *dir, s
787
int do_vfsub_symlink(struct inode *dir, struct dentry *dentry,
788
- const char *symname, int mode)
789
+ struct vfsmount *mnt, const char *symname, int mode)
793
@@ -111,7 +111,7 @@ int do_vfsub_symlink(struct inode *dir,
794
dir->i_ino, AuDLNPair(dentry), symname, mode);
797
- err = vfs_symlink(dir, dentry, symname, mode);
798
+ err = vfs_symlink(dir, dentry, mnt, symname, mode);
800
/* dir inode is locked */
801
au_update_fuse_h_inode(NULL, dentry->d_parent); /*ignore*/
802
@@ -120,15 +120,15 @@ int do_vfsub_symlink(struct inode *dir,
806
-int do_vfsub_mknod(struct inode *dir, struct dentry *dentry, int mode,
808
+int do_vfsub_mknod(struct inode *dir, struct dentry *dentry,
809
+ struct vfsmount *mnt, int mode, dev_t dev)
813
LKTRTrace("i%lu, %.*s, 0x%x\n", dir->i_ino, AuDLNPair(dentry), mode);
816
- err = vfs_mknod(dir, dentry, mode, dev);
817
+ err = vfs_mknod(dir, dentry, mnt, mode, dev);
819
/* dir inode is locked */
820
au_update_fuse_h_inode(NULL, dentry->d_parent); /*ignore*/
821
@@ -137,8 +137,8 @@ int do_vfsub_mknod(struct inode *dir, st
825
-int do_vfsub_link(struct dentry *src_dentry, struct inode *dir,
826
- struct dentry *dentry)
827
+int do_vfsub_link(struct dentry *src_dentry, struct vfsmount *src_mnt, struct inode *dir,
828
+ struct dentry *dentry, struct vfsmount *mnt)
832
@@ -147,7 +147,7 @@ int do_vfsub_link(struct dentry *src_den
836
- err = vfs_link(src_dentry, dir, dentry);
837
+ err = vfs_link(src_dentry, src_mnt, dir, dentry, mnt);
840
LKTRTrace("src_i %p, dst_i %p\n",
841
@@ -162,7 +162,9 @@ int do_vfsub_link(struct dentry *src_den
844
int do_vfsub_rename(struct inode *src_dir, struct dentry *src_dentry,
845
- struct inode *dir, struct dentry *dentry)
846
+ struct vfsmount *src_mnt,
847
+ struct inode *dir, struct dentry *dentry,
848
+ struct vfsmount *mnt)
852
@@ -173,7 +175,7 @@ int do_vfsub_rename(struct inode *src_di
856
- err = vfs_rename(src_dir, src_dentry, dir, dentry);
857
+ err = vfs_rename(src_dir, src_dentry, src_mnt, dir, dentry, mnt);
860
/* dir inode is locked */
861
@@ -184,14 +186,15 @@ int do_vfsub_rename(struct inode *src_di
865
-int do_vfsub_mkdir(struct inode *dir, struct dentry *dentry, int mode)
866
+int do_vfsub_mkdir(struct inode *dir, struct dentry *dentry,
867
+ struct vfsmount *mnt, int mode)
871
LKTRTrace("i%lu, %.*s, 0x%x\n", dir->i_ino, AuDLNPair(dentry), mode);
874
- err = vfs_mkdir(dir, dentry, mode);
875
+ err = vfs_mkdir(dir, dentry, mnt, mode);
877
/* dir inode is locked */
878
au_update_fuse_h_inode(NULL, dentry->d_parent); /*ignore*/
879
@@ -200,7 +203,8 @@ int do_vfsub_mkdir(struct inode *dir, st
883
-int do_vfsub_rmdir(struct inode *dir, struct dentry *dentry)
884
+int do_vfsub_rmdir(struct inode *dir, struct dentry *dentry,
885
+ struct vfsmount *mnt)
889
@@ -208,7 +212,7 @@ int do_vfsub_rmdir(struct inode *dir, st
893
- err = vfs_rmdir(dir, dentry);
894
+ err = vfs_rmdir(dir, dentry, mnt);
896
/* dir inode is locked */
898
@@ -216,7 +220,8 @@ int do_vfsub_rmdir(struct inode *dir, st
902
-int do_vfsub_unlink(struct inode *dir, struct dentry *dentry)
903
+int do_vfsub_unlink(struct inode *dir, struct dentry *dentry,
904
+ struct vfsmount *mnt)
908
@@ -225,7 +230,7 @@ int do_vfsub_unlink(struct inode *dir, s
910
/* vfs_unlink() locks inode */
912
- err = vfs_unlink(dir, dentry);
913
+ err = vfs_unlink(dir, dentry, mnt);
915
/* dir inode is locked */
917
@@ -427,6 +432,7 @@ struct symlink_args {
790
919
struct inode *dir;
791
920
struct dentry *dentry;
1151
1280
Index: fs/aufs/vfsub.h
1152
1281
===================================================================
1153
1282
RCS file: /cvsroot/aufs/aufs/fs/aufs/vfsub.h,v
1154
retrieving revision 1.25
1155
diff -u -p -r1.25 vfsub.h
1156
--- fs/aufs/vfsub.h 12 Nov 2007 01:43:10 -0000 1.25
1157
+++ fs/aufs/vfsub.h 26 Nov 2007 14:15:19 -0000
1158
@@ -337,7 +337,7 @@ int do_vfsub_create(struct inode *dir, s
1283
retrieving revision 1.31
1284
diff -u -p -r1.31 vfsub.h
1285
--- fs/aufs/vfsub.h 24 Feb 2008 23:47:21 -0000 1.31
1286
+++ fs/aufs/vfsub.h 28 Feb 2008 13:46:00 -0000
1287
@@ -338,16 +338,22 @@ int vfsub_vfs_path_lookup(struct dentry
1288
int do_vfsub_create(struct inode *dir, struct dentry *dentry, int mode,
1289
struct nameidata *nd);
1161
1290
int do_vfsub_symlink(struct inode *dir, struct dentry *dentry,
1162
- const char *symname, int mode)
1163
+ struct vfsmount *mnt, const char *symname, int mode)
1167
@@ -345,7 +345,7 @@ int do_vfsub_symlink(struct inode *dir,
1168
dir->i_ino, AuDLNPair(dentry), symname, mode);
1171
- err = vfs_symlink(dir, dentry, symname, mode);
1172
+ err = vfs_symlink(dir, dentry, mnt, symname, mode);
1174
/* dir inode is locked */
1175
au_update_fuse_h_inode(NULL, dentry->d_parent); /*ignore*/
1176
@@ -355,15 +355,15 @@ int do_vfsub_symlink(struct inode *dir,
1291
- const char *symname, int mode);
1180
1292
-int do_vfsub_mknod(struct inode *dir, struct dentry *dentry, int mode,
1294
-int do_vfsub_link(struct dentry *src_dentry, struct inode *dir,
1295
- struct dentry *dentry);
1296
+ struct vfsmount *mnt, const char *symname, int mode);
1182
1297
+int do_vfsub_mknod(struct inode *dir, struct dentry *dentry,
1183
+ struct vfsmount *mnt, int mode, dev_t dev)
1187
LKTRTrace("i%lu, %.*s, 0x%x\n", dir->i_ino, AuDLNPair(dentry), mode);
1190
- err = vfs_mknod(dir, dentry, mode, dev);
1191
+ err = vfs_mknod(dir, dentry, mnt, mode, dev);
1193
/* dir inode is locked */
1194
au_update_fuse_h_inode(NULL, dentry->d_parent); /*ignore*/
1195
@@ -373,8 +373,9 @@ int do_vfsub_mknod(struct inode *dir, st
1199
-int do_vfsub_link(struct dentry *src_dentry, struct inode *dir,
1200
- struct dentry *dentry)
1298
+ struct vfsmount *mnt, int mode, dev_t dev);
1201
1299
+int do_vfsub_link(struct dentry *src_dentry, struct vfsmount *src_mnt,
1202
1300
+ struct inode *dir, struct dentry *dentry,
1203
+ struct vfsmount *mnt)
1207
@@ -383,7 +384,7 @@ int do_vfsub_link(struct dentry *src_den
1211
- err = vfs_link(src_dentry, dir, dentry);
1212
+ err = vfs_link(src_dentry, src_mnt, dir, dentry, mnt);
1215
LKTRTrace("src_i %p, dst_i %p\n",
1216
@@ -399,7 +400,9 @@ int do_vfsub_link(struct dentry *src_den
1301
+ struct vfsmount *mnt);
1219
1302
int do_vfsub_rename(struct inode *src_dir, struct dentry *src_dentry,
1220
- struct inode *dir, struct dentry *dentry)
1303
- struct inode *dir, struct dentry *dentry);
1304
-int do_vfsub_mkdir(struct inode *dir, struct dentry *dentry, int mode);
1305
-int do_vfsub_rmdir(struct inode *dir, struct dentry *dentry);
1306
-int do_vfsub_unlink(struct inode *dir, struct dentry *dentry);
1221
1307
+ struct vfsmount *src_mnt,
1222
1308
+ struct inode *dir, struct dentry *dentry,
1223
+ struct vfsmount *mnt)
1227
@@ -410,7 +413,7 @@ int do_vfsub_rename(struct inode *src_di
1231
- err = vfs_rename(src_dir, src_dentry, dir, dentry);
1232
+ err = vfs_rename(src_dir, src_dentry, src_mnt, dir, dentry, mnt);
1235
/* dir inode is locked */
1236
@@ -422,14 +425,15 @@ int do_vfsub_rename(struct inode *src_di
1240
-int do_vfsub_mkdir(struct inode *dir, struct dentry *dentry, int mode)
1309
+ struct vfsmount *mnt);
1241
1310
+int do_vfsub_mkdir(struct inode *dir, struct dentry *dentry,
1242
+ struct vfsmount *mnt, int mode)
1246
LKTRTrace("i%lu, %.*s, 0x%x\n", dir->i_ino, AuDLNPair(dentry), mode);
1249
- err = vfs_mkdir(dir, dentry, mode);
1250
+ err = vfs_mkdir(dir, dentry, mnt, mode);
1252
/* dir inode is locked */
1253
au_update_fuse_h_inode(NULL, dentry->d_parent); /*ignore*/
1254
@@ -438,7 +442,8 @@ int do_vfsub_mkdir(struct inode *dir, st
1258
-static inline int do_vfsub_rmdir(struct inode *dir, struct dentry *dentry)
1259
+static inline int do_vfsub_rmdir(struct inode *dir, struct dentry *dentry,
1260
+ struct vfsmount *mnt)
1264
@@ -446,7 +451,7 @@ static inline int do_vfsub_rmdir(struct
1268
- err = vfs_rmdir(dir, dentry);
1269
+ err = vfs_rmdir(dir, dentry, mnt);
1271
/* dir inode is locked */
1273
@@ -454,7 +459,8 @@ static inline int do_vfsub_rmdir(struct
1277
-static inline int do_vfsub_unlink(struct inode *dir, struct dentry *dentry)
1278
+static inline int do_vfsub_unlink(struct inode *dir, struct dentry *dentry,
1279
+ struct vfsmount *mnt)
1283
@@ -463,7 +469,7 @@ static inline int do_vfsub_unlink(struct
1285
/* vfs_unlink() locks inode */
1287
- err = vfs_unlink(dir, dentry);
1288
+ err = vfs_unlink(dir, dentry, mnt);
1290
/* dir inode is locked */
1292
@@ -689,54 +695,57 @@ int vfsub_create(struct inode *dir, stru
1311
+ struct vfsmount *mnt, int mode);
1312
+int do_vfsub_rmdir(struct inode *dir, struct dentry *dentry,
1313
+ struct vfsmount *mnt);
1314
+int do_vfsub_unlink(struct inode *dir, struct dentry *dentry,
1315
+ struct vfsmount *mnt);
1317
/* ---------------------------------------------------------------------- */
1319
@@ -464,54 +470,57 @@ int vfsub_create(struct inode *dir, stru
1428
1455
LKTRTrace("%.*s, b%d\n", AuDLNPair(dentry), bdst);
1429
1456
AuDebugOn(dbstart(dentry) <= bdst
1430
@@ -84,9 +86,10 @@ static int au_cpdown_dir(struct dentry *
1457
@@ -84,10 +86,11 @@ static int au_cpdown_dir(struct dentry *
1431
1458
err = au_lkup_neg(dentry, bdst);
1432
1459
if (unlikely(err < 0))
1434
1461
+ h_mnt = sbr_mnt(dentry->d_sb, bdst);
1435
1462
h_dentry = au_h_dptr_i(dentry, bdst);
1436
1463
dlgt = au_need_dlgt(dentry->d_sb);
1437
- err = vfsub_sio_mkdir(h_dir, h_dentry, 0755, dlgt);
1438
+ err = vfsub_sio_mkdir(h_dir, h_dentry, h_mnt, 0755, dlgt);
1464
- err = vfsub_sio_mkdir(h_dir, h_dentry, S_IRWXU | S_IRUGO | S_IXUGO,
1466
+ err = vfsub_sio_mkdir(h_dir, h_dentry, h_mnt,
1467
+ S_IRWXU | S_IRUGO | S_IXUGO, dlgt);
1439
1468
if (unlikely(err))
1442
@@ -112,7 +115,7 @@ static int au_cpdown_dir(struct dentry *
1471
@@ -113,7 +116,7 @@ static int au_cpdown_dir(struct dentry *