1
This patch makes aufs version 20080128 to support the ubuntu kernel only
2
(http://archive.ubuntu.com/ubuntu/pool/main/l/linux/linux-source-2.6.24_2.6.24-5.8_all.deb).
3
You may also want to try the updated lhash patch posted by an aufs user,
4
see Tips file in detail.
6
This patch is NOT tested because I am not an ubuntu user.
10
===================================================================
11
RCS file: /cvsroot/aufs/aufs/fs/aufs/cpup.c,v
12
retrieving revision 1.60
13
diff -u -p -r1.60 cpup.c
14
--- fs/aufs/cpup.c 21 Jan 2008 04:55:55 -0000 1.60
15
+++ fs/aufs/cpup.c 29 Jan 2008 14:42:07 -0000
16
@@ -120,7 +120,8 @@ void au_cpup_attr_all(struct inode *inod
18
/* keep the timestamps of the parent dir when cpup */
19
void au_dtime_store(struct au_dtime *dt, struct dentry *dentry,
20
- struct dentry *h_dentry, struct aufs_hinode *hdir)
21
+ struct dentry *h_dentry, struct aufs_hinode *hdir,
22
+ struct vfsmount *h_mnt)
26
@@ -130,6 +131,7 @@ void au_dtime_store(struct au_dtime *dt,
27
dt->dt_dentry = dentry;
28
dt->dt_h_dentry = h_dentry;
30
+ dt->dt_h_mnt = h_mnt;
31
inode = h_dentry->d_inode;
32
dt->dt_atime = inode->i_atime;
33
dt->dt_mtime = inode->i_mtime;
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);
41
AuWarn("restoring timestamps failed(%d). ignored\n", err);
44
/* ---------------------------------------------------------------------- */
46
-static int cpup_iattr(struct dentry *h_dst, struct dentry *h_src, int dlgt)
47
+static int cpup_iattr(struct dentry *h_dst, struct dentry *h_src,
48
+ struct vfsmount *h_dst_mnt, int dlgt)
52
@@ -184,7 +187,7 @@ static int cpup_iattr(struct dentry *h_d
53
sbits = !!(ia.ia_mode & (S_ISUID | S_ISGID));
55
vfsub_args_init(&vargs, NULL, dlgt, /*force_unlink*/0);
56
- err = vfsub_notify_change(h_dst, &ia, &vargs);
57
+ err = vfsub_notify_change(h_dst, h_dst_mnt, &ia, &vargs);
58
//if (LktrCond) err = -1;
60
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24)
61
@@ -192,7 +195,7 @@ static int cpup_iattr(struct dentry *h_d
62
if (!err && sbits && au_test_nfs(h_dst->d_sb)) {
63
ia.ia_valid = ATTR_FORCE | ATTR_MODE;
64
ia.ia_mode = h_isrc->i_mode;
65
- err = vfsub_notify_change(h_dst, &ia, &vargs);
66
+ err = vfsub_notify_change(h_dst, h_dst_mnt, &ia, &vargs);
70
@@ -263,7 +266,8 @@ static int cpup_regular(struct dentry *d
72
/* stop updating while we copyup */
73
IMustLock(hidden[SRC].dentry->d_inode);
74
- err = au_copy_file(hidden[DST].file, hidden[SRC].file, len, sb);
75
+ err = au_copy_file(hidden[DST].file, hidden[SRC].file, len, sb,
79
fput(hidden[DST].file);
80
@@ -289,6 +293,7 @@ static int cpup_entry(struct dentry *den
83
struct super_block *sb;
84
+ struct vfsmount *h_mnt;
85
struct vfsub_args vargs;
86
struct aufs_hinode *hgdir;
87
const int do_dt = flags->dtime;
88
@@ -299,6 +304,7 @@ static int cpup_entry(struct dentry *den
90
AuDebugOn(bdst >= bsrc || au_test_ro(sb, bdst, NULL));
91
/* bsrc branch can be ro/rw. */
92
+ h_mnt = sbr_mnt(sb, bdst);
94
h_src = au_h_dptr_i(dentry, bsrc);
96
@@ -322,7 +328,7 @@ static int cpup_entry(struct dentry *den
97
hgdir = itohi(gparent->d_inode, bdst);
100
- au_dtime_store(&dt, parent, h_parent, hgdir);
101
+ au_dtime_store(&dt, parent, h_parent, hgdir, h_mnt);
104
mode = h_inode->i_mode;
105
@@ -344,7 +350,8 @@ static int cpup_entry(struct dentry *den
108
vfsub_args_init(&vargs, NULL, dlgt, 0);
109
- rerr = vfsub_unlink(h_dir, h_dst, &vargs);
110
+ rerr = vfsub_unlink(h_dir, h_dst, h_mnt,
113
AuIOErr("failed unlinking cpup-ed %.*s"
115
@@ -355,7 +362,7 @@ static int cpup_entry(struct dentry *den
119
- err = vfsub_mkdir(h_dir, h_dst, mode, dlgt);
120
+ err = vfsub_mkdir(h_dir, h_dst, h_mnt, mode, dlgt);
121
//if (LktrCond) {vfs_rmdir(h_dir, h_dst); err = -1;}
123
/* setattr case: dir is not locked */
124
@@ -379,7 +386,8 @@ static int cpup_entry(struct dentry *den
128
- err = vfsub_symlink(h_dir, h_dst, sym, mode, dlgt);
129
+ err = vfsub_symlink(h_dir, h_dst, h_mnt, sym, mode,
132
//{vfs_unlink(h_dir, h_dst); err = -1;}
134
@@ -391,7 +399,7 @@ static int cpup_entry(struct dentry *den
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),
142
//if (LktrCond) {vfs_unlink(h_dir, h_dst); err = -1;}
143
@@ -425,6 +433,7 @@ int au_cpup_single(struct dentry *dentry
144
struct vfsub_args vargs;
145
struct aufs_sbinfo *sbinfo;
146
struct aufs_hinode *hgdir;
147
+ struct vfsmount *h_mnt;
149
LKTRTrace("%.*s, i%lu, bdst %d, bsrc %d, len %Ld, dtime %u\n",
150
AuDLNPair(dentry), dentry->d_inode->i_ino, bdst, bsrc, len,
151
@@ -444,6 +453,7 @@ int au_cpup_single(struct dentry *dentry
152
dir = parent->d_inode;
155
+ h_mnt = sbr_mnt(sb, bdst);
156
dlgt = au_need_dlgt(sb);
157
dst_inode = au_h_iptr_i(inode, bdst);
158
if (unlikely(dst_inode)) {
159
@@ -460,7 +470,8 @@ int au_cpup_single(struct dentry *dentry
162
AuDebugOn(!h_src->d_inode);
163
- err = vfsub_link(h_src, h_dir, h_dst, dlgt);
164
+ err = vfsub_link(h_src, h_mnt, h_dir, h_dst, h_mnt,
169
@@ -477,7 +488,7 @@ int au_cpup_single(struct dentry *dentry
170
vfsub_i_lock_nested(dst_inode, AuLsc_I_CHILD2);
173
- err = cpup_iattr(h_dst, h_src, dlgt);
174
+ err = cpup_iattr(h_dst, h_src, h_mnt, dlgt);
175
//if (LktrCond) err = -1;
178
@@ -506,12 +517,12 @@ int au_cpup_single(struct dentry *dentry
179
hgdir = itohi(gparent->d_inode, bdst);
182
- au_dtime_store(&dt, parent, h_parent, hgdir);
183
+ au_dtime_store(&dt, parent, h_parent, hgdir, h_mnt);
184
vfsub_args_init(&vargs, NULL, dlgt, 0);
186
- rerr = vfsub_unlink(h_dir, h_dst, &vargs);
187
+ rerr = vfsub_unlink(h_dir, h_dst, h_mnt, &vargs);
189
- rerr = vfsub_rmdir(h_dir, h_dst, &vargs);
190
+ rerr = vfsub_rmdir(h_dir, h_dst, h_mnt, &vargs);
192
au_dtime_revert(&dt);
194
@@ -689,6 +700,7 @@ int au_cpup_wh(struct dentry *dentry, au
196
struct aufs_dinfo *dinfo;
197
aufs_bindex_t bstart;
198
+ struct vfsmount *h_mnt;
199
struct vfsub_args vargs;
200
struct aufs_hinode *hgdir;
201
struct aufs_ndx ndx = {
202
@@ -726,7 +738,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, hgdir, h_mnt);
209
dinfo = dtodi(dentry);
210
bstart = dinfo->di_bstart;
211
h_dentry_bdst = dinfo->di_hdentry[0 + bdst].hd_dentry;
212
@@ -752,7 +765,7 @@ int au_cpup_wh(struct dentry *dentry, au
213
/* dget first to force sillyrename on nfs */
215
vfsub_args_init(&vargs, NULL, ndx.dlgt, 0);
216
- err = vfsub_unlink(h_dir, wh_dentry, &vargs);
217
+ err = vfsub_unlink(h_dir, wh_dentry, h_mnt, &vargs);
218
//if (LktrCond) err = -1;
220
AuIOErr("failed remove copied-up tmp file %.*s(%d)\n",
221
Index: fs/aufs/cpup.h
222
===================================================================
223
RCS file: /cvsroot/aufs/aufs/fs/aufs/cpup.h,v
224
retrieving revision 1.26
225
diff -u -p -r1.26 cpup.h
226
--- fs/aufs/cpup.h 21 Jan 2008 04:56:10 -0000 1.26
227
+++ fs/aufs/cpup.h 29 Jan 2008 14:42:07 -0000
228
@@ -76,10 +76,12 @@ int au_test_and_cpup_dirs(struct dentry
230
struct dentry *dt_dentry, *dt_h_dentry;
231
struct aufs_hinode *dt_hdir;
232
+ struct vfsmount *dt_h_mnt;
233
struct timespec dt_atime, dt_mtime;
235
void au_dtime_store(struct au_dtime *dt, struct dentry *dentry,
236
- struct dentry *h_dentry, struct aufs_hinode *hdir);
237
+ struct dentry *h_dentry, struct aufs_hinode *hdir,
238
+ struct vfsmount *h_mnt);
239
void au_dtime_revert(struct au_dtime *dt);
241
#endif /* __KERNEL__ */
242
Index: fs/aufs/i_op.c
243
===================================================================
244
RCS file: /cvsroot/aufs/aufs/fs/aufs/i_op.c,v
245
retrieving revision 1.53
246
diff -u -p -r1.53 i_op.c
247
--- fs/aufs/i_op.c 28 Jan 2008 05:01:42 -0000 1.53
248
+++ fs/aufs/i_op.c 29 Jan 2008 14:42:07 -0000
249
@@ -547,7 +547,7 @@ static int aufs_setattr(struct dentry *d
250
vfsub_ign_hinode(&vargs, events, itohi(dir, bcpup));
253
- err = vfsub_notify_change(h_dentry, ia, &vargs);
254
+ err = vfsub_notify_change(h_dentry, sbr_mnt(sb, bcpup), ia, &vargs);
257
au_cpup_attr_changeable(inode);
258
Index: fs/aufs/i_op_add.c
259
===================================================================
260
RCS file: /cvsroot/aufs/aufs/fs/aufs/i_op_add.c,v
261
retrieving revision 1.58
262
diff -u -p -r1.58 i_op_add.c
263
--- fs/aufs/i_op_add.c 28 Jan 2008 05:02:00 -0000 1.58
264
+++ fs/aufs/i_op_add.c 29 Jan 2008 14:42:08 -0000
266
* if it failed, re-create the removed whiteout.
268
static int epilog(struct inode *dir, struct dentry *wh_dentry,
269
- struct dentry *dentry)
270
+ struct vfsmount *h_mnt, struct dentry *dentry)
274
@@ -42,7 +42,7 @@ static int epilog(struct inode *dir, str
275
h_dir = wh_dentry->d_parent->d_inode; /* dir inode is locked */
278
- err = au_unlink_wh_dentry(h_dir, wh_dentry, dentry, dir,
279
+ err = au_unlink_wh_dentry(h_dir, wh_dentry, h_mnt, dentry, dir,
283
@@ -148,7 +148,8 @@ lock_hdir_lkup_wh(struct dentry *dentry,
287
- au_dtime_store(dt, parent, h_parent, hgdir);
288
+ au_dtime_store(dt, parent, h_parent, hgdir,
289
+ sbr_mnt(parent->d_sb, bcpup));
291
if (/* bcpup != bstart || */ bcpup != dbwh(dentry))
292
goto out; /* success */
293
@@ -197,6 +198,7 @@ static int add_simple(struct inode *dir,
295
struct vfsub_args vargs;
296
struct super_block *sb;
297
+ struct vfsmount *h_mnt;
298
struct au_wr_dir_args wr_dir_args = {
301
@@ -223,6 +225,7 @@ static int add_simple(struct inode *dir,
304
dlgt = au_need_dlgt(sb);
305
+ h_mnt = sbr_mnt(sb, dbstart(dentry));
307
#if 1 // partial testing
309
@@ -232,11 +235,11 @@ static int add_simple(struct inode *dir,
310
arg->u.c.nd, au_nfsmnt(sb, dbstart(dentry)));
313
- err = vfsub_symlink(h_dir, h_dentry,
314
+ err = vfsub_symlink(h_dir, h_dentry, h_mnt,
315
arg->u.s.symname, S_IALLUGO, dlgt);
318
- err = vfsub_mknod(h_dir, h_dentry,
319
+ err = vfsub_mknod(h_dir, h_dentry, h_mnt,
320
arg->u.m.mode, arg->u.m.dev, dlgt);
323
@@ -247,14 +250,14 @@ static int add_simple(struct inode *dir,
327
- err = epilog(dir, wh_dentry, dentry);
328
+ err = epilog(dir, wh_dentry, h_mnt, dentry);
332
if (unlikely(created && err && h_dentry->d_inode)) {
334
vfsub_args_init(&vargs, NULL, dlgt, 0);
335
- rerr = vfsub_unlink(h_dir, h_dentry, &vargs);
336
+ rerr = vfsub_unlink(h_dir, h_dentry, h_mnt, &vargs);
339
AuIOErr("%.*s revert failure(%d, %d)\n",
340
@@ -403,6 +406,7 @@ static int cpup_or_link(struct dentry *s
341
aufs_bindex_t bstart;
342
struct super_block *sb;
343
struct au_cpup_flags cflags;
344
+ struct vfsmount *h_mnt;
348
@@ -412,8 +416,11 @@ static int cpup_or_link(struct dentry *s
349
h_inode = h_dentry->d_inode;
350
bstart = ibstart(inode);
352
- if (bstart <= a->bdst)
354
+ if (bstart <= a->bdst) {
355
h_dst_inode = au_h_iptr_i(inode, a->bdst);
356
+ h_mnt = sbr_mnt(sb, a->bdst);
359
if (!h_dst_inode || !h_dst_inode->i_nlink) {
360
/* copyup src_dentry as the name of dentry. */
361
@@ -431,8 +438,8 @@ static int cpup_or_link(struct dentry *s
362
/* the inode of src_dentry already exists on a.bdst branch */
363
h_dentry = d_find_alias(h_dst_inode);
365
- err = vfsub_link(h_dentry, a->h_dir,
366
- a->h_dentry, a->dlgt);
367
+ err = vfsub_link(h_dentry, h_mnt, a->h_dir, a->h_dentry,
371
AuIOErr("no dentry found for i%lu on b%d\n",
372
@@ -456,6 +463,7 @@ int aufs_link(struct dentry *src_dentry,
375
struct super_block *sb;
376
+ struct vfsmount *h_mnt;
377
struct vfsub_args vargs;
378
struct au_wr_dir_args wr_dir_args = {
380
@@ -499,6 +507,7 @@ int aufs_link(struct dentry *src_dentry,
381
a.bsrc = dbstart(src_dentry);
382
a.bdst = dbstart(dentry);
383
h_src_dentry = au_h_dptr(src_dentry);
384
+ h_mnt = sbr_mnt(sb, a.bdst);
385
if (unlikely(!AuFlag(stosi(sb), f_plink))) {
387
* copyup src_dentry to the branch we process,
388
@@ -511,8 +520,8 @@ int aufs_link(struct dentry *src_dentry,
389
err = cpup_before_link(src_dentry, dir, &a);
391
h_src_dentry = au_h_dptr(src_dentry);
392
- err = vfsub_link(h_src_dentry, a.h_dir,
393
- a.h_dentry, a.dlgt);
394
+ err = vfsub_link(h_src_dentry, h_mnt, a.h_dir,
395
+ a.h_dentry, h_mnt, a.dlgt);
399
@@ -521,15 +530,15 @@ int aufs_link(struct dentry *src_dentry,
400
err = cpup_or_link(src_dentry, &a);
402
h_src_dentry = au_h_dptr(src_dentry);
403
- err = vfsub_link(h_src_dentry, a.h_dir,
404
- a.h_dentry, a.dlgt);
405
+ err = vfsub_link(h_src_dentry, h_mnt, a.h_dir,
406
+ a.h_dentry, h_mnt, a.dlgt);
413
- err = au_unlink_wh_dentry(a.h_dir, wh_dentry, dentry,
414
+ err = au_unlink_wh_dentry(a.h_dir, wh_dentry, h_mnt, dentry,
418
@@ -600,7 +609,7 @@ int aufs_link(struct dentry *src_dentry,
421
vfsub_args_init(&vargs, NULL, a.dlgt, 0);
422
- rerr = vfsub_unlink(a.h_dir, a.h_dentry, &vargs);
423
+ rerr = vfsub_unlink(a.h_dir, a.h_dentry, h_mnt, &vargs);
427
@@ -635,6 +644,7 @@ int aufs_mkdir(struct inode *dir, struct
429
aufs_bindex_t bindex;
430
struct super_block *sb;
431
+ struct vfsmount *h_mnt;
432
struct vfsub_args vargs;
433
struct au_wr_dir_args wr_dir_args = {
435
@@ -664,8 +674,9 @@ int aufs_mkdir(struct inode *dir, struct
436
h_dir = h_parent->d_inode;
438
dlgt = au_need_dlgt(sb);
439
+ h_mnt = sbr_mnt(sb, bindex);
441
- err = vfsub_mkdir(h_dir, h_dentry, mode, dlgt);
442
+ err = vfsub_mkdir(h_dir, h_dentry, h_mnt, mode, dlgt);
446
@@ -685,7 +696,7 @@ int aufs_mkdir(struct inode *dir, struct
450
- err = epilog(dir, wh_dentry, dentry);
451
+ err = epilog(dir, wh_dentry, h_mnt, dentry);
455
@@ -709,7 +720,7 @@ int aufs_mkdir(struct inode *dir, struct
457
LKTRLabel(revert dir);
458
vfsub_args_init(&vargs, NULL, dlgt, 0);
459
- rerr = vfsub_rmdir(h_dir, h_dentry, &vargs);
460
+ rerr = vfsub_rmdir(h_dir, h_dentry, h_mnt, &vargs);
463
AuIOErr("%.*s reverting dir failed(%d, %d)\n",
464
Index: fs/aufs/i_op_del.c
465
===================================================================
466
RCS file: /cvsroot/aufs/aufs/fs/aufs/i_op_del.c,v
467
retrieving revision 1.57
468
diff -u -p -r1.57 i_op_del.c
469
--- fs/aufs/i_op_del.c 28 Jan 2008 05:02:03 -0000 1.57
470
+++ fs/aufs/i_op_del.c 29 Jan 2008 14:42:08 -0000
471
@@ -153,7 +153,8 @@ lock_hdir_create_wh(struct dentry *dentr
472
revalidate h_positive
475
- au_dtime_store(dt, parent, h_parent, hgdir);
476
+ au_dtime_store(dt, parent, h_parent, hgdir,
477
+ sbr_mnt(dentry->d_sb, bcpup));
480
goto out; /* success, no need to create whiteout */
481
@@ -243,16 +244,17 @@ struct revert_flags {
485
-static int do_revert(int err, struct dentry *wh_dentry, struct dentry *dentry,
486
- aufs_bindex_t bwh, struct au_dtime *dt,
487
- struct revert_flags *flags)
488
+static int do_revert(int err, struct dentry *wh_dentry, struct vfsmount *h_mnt,
489
+ struct dentry *dentry, aufs_bindex_t bwh,
490
+ struct au_dtime *dt, struct revert_flags *flags)
495
dir = wh_dentry->d_parent->d_inode; /* dir inode is locked */
497
- rerr = au_unlink_wh_dentry(dir, wh_dentry, dentry, dir, !!flags->dlgt);
498
+ rerr = au_unlink_wh_dentry(dir, wh_dentry, h_mnt, dentry, dir,
502
set_dbwh(dentry, bwh);
503
@@ -275,6 +277,7 @@ int aufs_unlink(struct inode *dir, struc
505
aufs_bindex_t bwh, bindex, bstart;
506
struct super_block *sb;
507
+ struct vfsmount *h_mnt;
508
struct vfsub_args vargs;
510
LKTRTrace("i%lu, %.*s\n", dir->i_ino, AuDLNPair(dentry));
511
@@ -301,12 +304,13 @@ int aufs_unlink(struct inode *dir, struc
512
dlgt = au_need_dlgt(sb);
513
h_dentry = au_h_dptr(dentry);
515
+ h_mnt = sbr_mnt(sb, dbstart(dentry));
517
if (bindex == bstart) {
518
vfsub_args_init(&vargs, NULL, dlgt, 0);
519
h_dir = h_dentry->d_parent->d_inode; /* dir inode is locked */
521
- err = vfsub_unlink(h_dir, h_dentry, &vargs);
522
+ err = vfsub_unlink(h_dir, h_dentry, h_mnt, &vargs);
525
/* dir inode is locked */
526
@@ -339,7 +343,8 @@ int aufs_unlink(struct inode *dir, struc
527
struct revert_flags rev_flags = {
530
- rerr = do_revert(err, wh_dentry, dentry, bwh, &dt, &rev_flags);
531
+ rerr = do_revert(err, wh_dentry, h_mnt, dentry, bwh, &dt,
536
@@ -365,6 +370,7 @@ int aufs_rmdir(struct inode *dir, struct
537
struct rmdir_whtmp_args *args;
538
struct aufs_nhash *whlist;
539
struct super_block *sb;
540
+ struct vfsmount *h_mnt;
542
LKTRTrace("i%lu, %.*s\n", dir->i_ino, AuDLNPair(dentry));
544
@@ -403,6 +409,7 @@ int aufs_rmdir(struct inode *dir, struct
546
h_dentry = au_h_dptr(dentry);
548
+ h_mnt = sbr_mnt(dentry->d_sb, dbstart(dentry));
551
if (bindex == bstart) {
552
@@ -449,7 +456,8 @@ int aufs_rmdir(struct inode *dir, struct
553
struct revert_flags rev_flags = {
554
.dlgt = au_need_dlgt(sb)
556
- rerr = do_revert(err, wh_dentry, dentry, bwh, &dt, &rev_flags);
557
+ rerr = do_revert(err, wh_dentry, h_mnt, dentry, bwh, &dt,
562
Index: fs/aufs/i_op_ren.c
563
===================================================================
564
RCS file: /cvsroot/aufs/aufs/fs/aufs/i_op_ren.c,v
565
retrieving revision 1.63
566
diff -u -p -r1.63 i_op_ren.c
567
--- fs/aufs/i_op_ren.c 28 Jan 2008 05:02:03 -0000 1.63
568
+++ fs/aufs/i_op_ren.c 29 Jan 2008 14:42:08 -0000
569
@@ -26,6 +26,7 @@ struct rename_args {
570
struct aufs_nhash whlist;
571
aufs_bindex_t btgt, bstart[2];
572
struct super_block *sb;
573
+ struct vfsmount *h_mnt;
575
unsigned int isdir:1;
576
unsigned int issamedir:1;
577
@@ -146,8 +147,9 @@ static int do_rename(struct inode *src_d
578
if (unlikely(a->udba && a->isdir))
579
vfsub_ign_hinode(&vargs, IN_MOVE_SELF,
580
itohi(src_dentry->d_inode, a->btgt));
581
- err = vfsub_rename(h_dir[SRC], au_h_dptr(src_dentry),
582
- h_dir[DST], a->h_dentry[DST], &vargs);
583
+ err = vfsub_rename(h_dir[SRC], au_h_dptr(src_dentry), a->h_mnt,
584
+ h_dir[DST], a->h_dentry[DST], a->h_mnt,
589
@@ -185,7 +187,7 @@ static int do_rename(struct inode *src_d
591
/* remove whiteout for dentry */
592
if (wh_dentry[DST]) {
593
- err = au_unlink_wh_dentry(h_dir[DST], wh_dentry[DST],
594
+ err = au_unlink_wh_dentry(h_dir[DST], wh_dentry[DST], a->h_mnt,
595
dentry, dir, /*dlgt*/0);
598
@@ -254,8 +256,8 @@ static int do_rename(struct inode *src_d
599
vfsub_ign_hinode(&vargs, IN_MOVE_SELF,
600
itohi(src_dentry->d_inode, a->btgt));
602
- (h_dir[DST], au_h_dptr_i(src_dentry, a->btgt),
603
- h_dir[SRC], d, &vargs);
604
+ (h_dir[DST], au_h_dptr_i(src_dentry, a->btgt), a->h_mnt,
605
+ h_dir[SRC], d, a->h_mnt, &vargs);
609
@@ -264,7 +266,8 @@ static int do_rename(struct inode *src_d
610
RevertFailure("rename %.*s", AuDLNPair(src_dentry));
612
vfsub_args_init(&vargs, NULL, a->dlgt, 0);
613
- rerr = vfsub_unlink(h_dir[DST], a->h_dentry[DST], &vargs);
614
+ rerr = vfsub_unlink(h_dir[DST], a->h_dentry[DST], a->h_mnt,
617
set_h_dptr(src_dentry, a->btgt, NULL);
618
set_dbstart(src_dentry, a->bstart[SRC]);
619
@@ -294,7 +297,8 @@ static int do_rename(struct inode *src_d
620
if (unlikely(0 && a->udba && a->isdir))
621
vfsub_ign_hinode(&vargs, IN_MOVE_SELF,
622
itohi(dentry->d_inode, a->btgt));
623
- rerr = vfsub_rename(h_dir[DST], h_dst, h_dir[DST], d, &vargs);
624
+ rerr = vfsub_rename(h_dir[DST], h_dst, a->h_mnt, h_dir[DST], d,
629
@@ -311,7 +315,7 @@ static int do_rename(struct inode *src_d
631
if (wh_dentry[SRC]) {
633
- rerr = au_unlink_wh_dentry(h_dir[SRC], wh_dentry[SRC],
634
+ rerr = au_unlink_wh_dentry(h_dir[SRC], wh_dentry[SRC], a->h_mnt,
635
src_dentry, src_dir, /*dlgt*/0);
638
@@ -572,6 +576,7 @@ int aufs_rename(struct inode *src_dir, s
641
au_hgdirs(hgdir, &p->a);
642
+ p->a.h_mnt = sbr_mnt(p->a.sb, p->a.btgt);
643
p->a.h_parent[SRC] = au_h_dptr_i(p->a.parent[SRC], p->a.btgt);
644
p->a.h_parent[DST] = au_h_dptr_i(p->a.parent[DST], p->a.btgt);
646
@@ -602,20 +607,22 @@ int aufs_rename(struct inode *src_dir, s
648
/* store timestamps to be revertible */
649
au_dtime_store(p->dt[PARENT] + SRC, p->a.parent[SRC],
650
- p->a.h_parent[SRC], hgdir[SRC]);
651
+ p->a.h_parent[SRC], hgdir[SRC], p->a.h_mnt);
653
au_dtime_store(p->dt[PARENT] + DST, p->a.parent[DST],
654
- p->a.h_parent[DST], hgdir[DST]);
655
+ p->a.h_parent[DST], hgdir[DST], p->a.h_mnt);
659
(p->dt[CHILD] + SRC, src_dentry, p->a.h_dentry[SRC],
660
- itohi(p->a.parent[SRC]->d_inode, p->a.btgt));
661
+ itohi(p->a.parent[SRC]->d_inode, p->a.btgt),
663
if (p->a.h_dentry[DST]->d_inode) {
666
(p->dt[CHILD] + DST, dentry, p->a.h_dentry[DST],
667
- itohi(p->a.parent[DST]->d_inode, p->a.btgt));
668
+ itohi(p->a.parent[DST]->d_inode, p->a.btgt),
673
Index: fs/aufs/misc.c
674
===================================================================
675
RCS file: /cvsroot/aufs/aufs/fs/aufs/misc.c,v
676
retrieving revision 1.47
677
diff -u -p -r1.47 misc.c
678
--- fs/aufs/misc.c 12 Nov 2007 01:40:06 -0000 1.47
679
+++ fs/aufs/misc.c 29 Jan 2008 14:42:08 -0000
680
@@ -154,7 +154,7 @@ int au_h_create(struct inode *h_dir, str
681
/* ---------------------------------------------------------------------- */
683
int au_copy_file(struct file *dst, struct file *src, loff_t len,
684
- struct super_block *sb)
685
+ struct super_block *sb, struct vfsmount *dst_mnt)
688
unsigned long blksize;
689
@@ -265,10 +265,9 @@ int au_copy_file(struct file *dst, struc
690
} while (err == -EAGAIN || err == -EINTR);
692
ia->ia_size = dst->f_pos;
693
- ia->ia_valid = ATTR_SIZE | ATTR_FILE;
695
+ ia->ia_valid = ATTR_SIZE;
696
vfsub_i_lock_nested(h_i, AuLsc_I_CHILD2);
697
- err = vfsub_notify_change(h_d, ia, &vargs);
698
+ err = vfsub_notify_change(h_d, dst_mnt, ia, &vargs);
702
Index: fs/aufs/misc.h
703
===================================================================
704
RCS file: /cvsroot/aufs/aufs/fs/aufs/misc.h,v
705
retrieving revision 1.39
706
diff -u -p -r1.39 misc.h
707
--- fs/aufs/misc.h 21 Jan 2008 04:57:48 -0000 1.39
708
+++ fs/aufs/misc.h 29 Jan 2008 14:42:08 -0000
709
@@ -201,7 +201,7 @@ int au_h_create(struct inode *h_dir, str
710
int dlgt, struct nameidata *nd, struct vfsmount *nfsmnt);
712
int au_copy_file(struct file *dst, struct file *src, loff_t len,
713
- struct super_block *sb);
714
+ struct super_block *sb, struct vfsmount *dst_mnt);
715
int au_test_ro(struct super_block *sb, aufs_bindex_t bindex,
716
struct inode *inode);
717
int au_test_perm(struct inode *h_inode, int mask, int dlgt);
718
Index: fs/aufs/plink.c
719
===================================================================
720
RCS file: /cvsroot/aufs/aufs/fs/aufs/plink.c,v
721
retrieving revision 1.16
722
diff -u -p -r1.16 plink.c
723
--- fs/aufs/plink.c 29 Oct 2007 04:41:10 -0000 1.16
724
+++ fs/aufs/plink.c 29 Jan 2008 14:42:08 -0000
725
@@ -119,8 +119,8 @@ struct dentry *au_lkup_plink(struct supe
728
static int do_whplink(char *tgt, int len, struct dentry *h_parent,
729
- struct dentry *h_dentry, struct vfsmount *nfsmnt,
730
- struct super_block *sb)
731
+ struct dentry *h_dentry, struct vfsmount *h_mnt,
732
+ struct vfsmount *nfsmnt, struct super_block *sb)
735
struct dentry *h_tgt;
736
@@ -142,9 +142,9 @@ static int do_whplink(char *tgt, int len
737
vfsub_args_init(&vargs, NULL, ndx.dlgt, 0);
738
h_dir = h_parent->d_inode;
739
if (unlikely(h_tgt->d_inode && h_tgt->d_inode != h_dentry->d_inode))
740
- err = vfsub_unlink(h_dir, h_tgt, &vargs);
741
+ err = vfsub_unlink(h_dir, h_tgt, h_mnt, &vargs);
742
if (!err && !h_tgt->d_inode) {
743
- err = vfsub_link(h_dentry, h_dir, h_tgt, ndx.dlgt);
744
+ err = vfsub_link(h_dentry, h_mnt, h_dir, h_tgt, h_mnt, ndx.dlgt);
748
@@ -160,6 +160,7 @@ struct do_whplink_args {
750
struct dentry *h_parent;
751
struct dentry *h_dentry;
752
+ struct vfsmount *h_mnt;
753
struct vfsmount *nfsmnt;
754
struct super_block *sb;
756
@@ -168,7 +169,7 @@ static void call_do_whplink(void *args)
758
struct do_whplink_args *a = args;
759
*a->errp = do_whplink(a->tgt, a->len, a->h_parent, a->h_dentry,
761
+ a->h_mnt, a->nfsmnt, a->sb);
764
static int whplink(struct dentry *h_dentry, struct inode *inode,
765
@@ -198,6 +199,7 @@ static int whplink(struct dentry *h_dent
767
.h_parent = h_parent,
768
.h_dentry = h_dentry,
769
+ .h_mnt = br->br_mnt,
770
.nfsmnt = au_do_nfsmnt(br->br_mnt),
773
@@ -206,7 +208,7 @@ static int whplink(struct dentry *h_dent
776
err = do_whplink(tgtname, len, h_parent, h_dentry,
777
- au_do_nfsmnt(br->br_mnt), sb);
778
+ br->br_mnt, au_do_nfsmnt(br->br_mnt), sb);
779
vfsub_i_unlock(h_dir);
782
Index: fs/aufs/vfsub.c
783
===================================================================
784
RCS file: /cvsroot/aufs/aufs/fs/aufs/vfsub.c,v
785
retrieving revision 1.26
786
diff -u -p -r1.26 vfsub.c
787
--- fs/aufs/vfsub.c 28 Jan 2008 05:01:42 -0000 1.26
788
+++ fs/aufs/vfsub.c 29 Jan 2008 14:42:08 -0000
789
@@ -369,6 +369,7 @@ struct symlink_args {
792
struct dentry *dentry;
793
+ struct vfsmount *mnt;
797
@@ -376,20 +377,22 @@ struct symlink_args {
798
static void call_symlink(void *args)
800
struct symlink_args *a = args;
801
- *a->errp = do_vfsub_symlink(a->dir, a->dentry, a->symname, a->mode);
802
+ *a->errp = do_vfsub_symlink(a->dir, a->dentry, a->mnt, a->symname,
806
-int vfsub_symlink(struct inode *dir, struct dentry *dentry, const char *symname,
807
- int mode, int dlgt)
808
+int vfsub_symlink(struct inode *dir, struct dentry *dentry,
809
+ struct vfsmount *mnt, const char *symname, int mode, int dlgt)
812
- return do_vfsub_symlink(dir, dentry, symname, mode);
813
+ return do_vfsub_symlink(dir, dentry, mnt, symname, mode);
816
struct symlink_args args = {
824
@@ -404,6 +407,7 @@ struct mknod_args {
827
struct dentry *dentry;
828
+ struct vfsmount *mnt;
832
@@ -411,20 +415,21 @@ struct mknod_args {
833
static void call_mknod(void *args)
835
struct mknod_args *a = args;
836
- *a->errp = do_vfsub_mknod(a->dir, a->dentry, a->mode, a->dev);
837
+ *a->errp = do_vfsub_mknod(a->dir, a->dentry, a->mnt, a->mode, a->dev);
840
-int vfsub_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev,
842
+int vfsub_mknod(struct inode *dir, struct dentry *dentry, struct vfsmount *mnt,
843
+ int mode, dev_t dev, int dlgt)
846
- return do_vfsub_mknod(dir, dentry, mode, dev);
847
+ return do_vfsub_mknod(dir, dentry, mnt, mode, dev);
850
struct mknod_args args = {
858
@@ -439,25 +444,28 @@ struct mkdir_args {
861
struct dentry *dentry;
862
+ struct vfsmount *mnt;
866
static void call_mkdir(void *args)
868
struct mkdir_args *a = args;
869
- *a->errp = do_vfsub_mkdir(a->dir, a->dentry, a->mode);
870
+ *a->errp = do_vfsub_mkdir(a->dir, a->dentry, a->mnt, a->mode);
873
-int vfsub_mkdir(struct inode *dir, struct dentry *dentry, int mode, int dlgt)
874
+int vfsub_mkdir(struct inode *dir, struct dentry *dentry, struct vfsmount *mnt,
875
+ int mode, int dlgt)
878
- return do_vfsub_mkdir(dir, dentry, mode);
879
+ return do_vfsub_mkdir(dir, dentry, mnt, mode);
882
struct mkdir_args args = {
889
wkq_err = au_wkq_wait(call_mkdir, &args, /*dlgt*/1);
890
@@ -473,6 +481,7 @@ struct link_args {
893
struct dentry *src_dentry, *dentry;
894
+ struct vfsmount *src_mnt, *mnt;
897
static void call_link(void *args)
898
@@ -481,18 +490,21 @@ static void call_link(void *args)
899
*a->errp = do_vfsub_link(a->src_dentry, a->dir, a->dentry);
902
-int vfsub_link(struct dentry *src_dentry, struct inode *dir,
903
- struct dentry *dentry, int dlgt)
904
+int vfsub_link(struct dentry *src_dentry, struct vfsmount *src_mnt,
905
+ struct inode *dir, struct dentry *dentry,
906
+ struct vfsmount *mnt, int dlgt)
909
- return do_vfsub_link(src_dentry, dir, dentry);
910
+ return do_vfsub_link(src_dentry, src_mnt, dir, dentry, mnt);
913
struct link_args args = {
915
.src_dentry = src_dentry,
916
+ .src_mnt = src_mnt,
922
wkq_err = au_wkq_wait(call_link, &args, /*dlgt*/1);
923
if (unlikely(wkq_err))
924
@@ -505,6 +517,7 @@ struct rename_args {
926
struct inode *src_dir, *dir;
927
struct dentry *src_dentry, *dentry;
928
+ struct vfsmount *src_mnt, *mnt;
929
struct vfsub_args *vargs;
932
@@ -512,21 +525,23 @@ static void call_rename(void *args)
934
struct rename_args *a = args;
935
vfsub_ignore(a->vargs);
936
- *a->errp = do_vfsub_rename(a->src_dir, a->src_dentry, a->dir,
938
+ *a->errp = do_vfsub_rename(a->src_dir, a->src_dentry, a->src_mnt,
939
+ a->dir, a->dentry, a->mnt);
940
if (unlikely(*a->errp))
941
vfsub_unignore(a->vargs);
944
int vfsub_rename(struct inode *src_dir, struct dentry *src_dentry,
945
- struct inode *dir, struct dentry *dentry,
946
+ struct vfsmount *src_mnt,
947
+ struct inode *dir, struct dentry *dentry, struct vfsmount *mnt,
948
struct vfsub_args *vargs)
954
- err = do_vfsub_rename(src_dir, src_dentry, dir, dentry);
955
+ err = do_vfsub_rename(src_dir, src_dentry, src_mnt, dir, dentry,
958
vfsub_unignore(vargs);
960
@@ -535,8 +550,10 @@ int vfsub_rename(struct inode *src_dir,
963
.src_dentry = src_dentry,
964
+ .src_mnt = src_mnt,
970
wkq_err = au_wkq_wait(call_rename, &args, /*dlgt*/1);
971
@@ -550,6 +567,7 @@ struct rmdir_args {
974
struct dentry *dentry;
975
+ struct vfsmount *mnt;
976
struct vfsub_args *vargs;
979
@@ -557,19 +575,19 @@ static void call_rmdir(void *args)
981
struct rmdir_args *a = args;
982
vfsub_ignore(a->vargs);
983
- *a->errp = do_vfsub_rmdir(a->dir, a->dentry);
984
+ *a->errp = do_vfsub_rmdir(a->dir, a->dentry, a->mnt);
985
if (unlikely(*a->errp))
986
vfsub_unignore(a->vargs);
989
-int vfsub_rmdir(struct inode *dir, struct dentry *dentry,
990
+int vfsub_rmdir(struct inode *dir, struct dentry *dentry, struct vfsmount *mnt,
991
struct vfsub_args *vargs)
997
- err = do_vfsub_rmdir(dir, dentry);
998
+ err = do_vfsub_rmdir(dir, dentry, mnt);
1000
vfsub_unignore(vargs);
1002
@@ -578,6 +596,7 @@ int vfsub_rmdir(struct inode *dir, struc
1009
wkq_err = au_wkq_wait(call_rmdir, &args, /*dlgt*/1);
1010
@@ -975,6 +994,7 @@ struct au_vfsub_mkdir_args {
1013
struct dentry *dentry;
1014
+ struct vfsmount *mnt;
1018
@@ -982,11 +1002,11 @@ struct au_vfsub_mkdir_args {
1019
static void au_call_vfsub_mkdir(void *args)
1021
struct au_vfsub_mkdir_args *a = args;
1022
- *a->errp = vfsub_mkdir(a->dir, a->dentry, a->mode, a->dlgt);
1023
+ *a->errp = vfsub_mkdir(a->dir, a->dentry, a->mnt, a->mode, a->dlgt);
1026
-int vfsub_sio_mkdir(struct inode *dir, struct dentry *dentry, int mode,
1028
+int vfsub_sio_mkdir(struct inode *dir, struct dentry *dentry,
1029
+ struct vfsmount *mnt, int mode, int dlgt)
1031
int err, do_sio, wkq_err;
1033
@@ -994,12 +1014,13 @@ int vfsub_sio_mkdir(struct inode *dir, s
1035
do_sio = au_test_perm(dir, MAY_EXEC | MAY_WRITE, dlgt);
1037
- err = vfsub_mkdir(dir, dentry, mode, dlgt);
1038
+ err = vfsub_mkdir(dir, dentry, mnt, mode, dlgt);
1040
struct au_vfsub_mkdir_args args = {
1048
@@ -1016,16 +1037,18 @@ struct au_vfsub_rmdir_args {
1051
struct dentry *dentry;
1052
+ struct vfsmount *mnt;
1053
struct vfsub_args *vargs;
1056
static void au_call_vfsub_rmdir(void *args)
1058
struct au_vfsub_rmdir_args *a = args;
1059
- *a->errp = vfsub_rmdir(a->dir, a->dentry, a->vargs);
1060
+ *a->errp = vfsub_rmdir(a->dir, a->dentry, a->mnt, a->vargs);
1063
-int vfsub_sio_rmdir(struct inode *dir, struct dentry *dentry, int dlgt)
1064
+int vfsub_sio_rmdir(struct inode *dir, struct dentry *dentry,
1065
+ struct vfsmount *mnt, int dlgt)
1067
int err, do_sio, wkq_err;
1068
struct vfsub_args vargs;
1069
@@ -1035,12 +1058,13 @@ int vfsub_sio_rmdir(struct inode *dir, s
1070
vfsub_args_init(&vargs, /*ign*/NULL, dlgt, /*force_unlink*/0);
1071
do_sio = au_test_perm(dir, MAY_EXEC | MAY_WRITE, dlgt);
1073
- err = vfsub_rmdir(dir, dentry, &vargs);
1074
+ err = vfsub_rmdir(dir, dentry, mnt, &vargs);
1076
struct au_vfsub_rmdir_args args = {
1083
wkq_err = au_wkq_wait(au_call_vfsub_rmdir, &args, /*dlgt*/0);
1084
@@ -1057,6 +1081,7 @@ int vfsub_sio_rmdir(struct inode *dir, s
1085
struct notify_change_args {
1087
struct dentry *h_dentry;
1088
+ struct vfsmount *h_mnt;
1090
struct vfsub_args *vargs;
1092
@@ -1075,7 +1100,7 @@ static void call_notify_change(void *arg
1093
if (!IS_IMMUTABLE(h_inode) && !IS_APPEND(h_inode)) {
1094
vfsub_ignore(a->vargs);
1096
- *a->errp = notify_change(a->h_dentry, a->ia);
1097
+ *a->errp = notify_change(a->h_dentry, a->h_mnt, a->ia);
1100
au_update_fuse_h_inode(NULL, a->h_dentry); /*ignore*/
1101
@@ -1085,13 +1110,14 @@ static void call_notify_change(void *arg
1102
AuTraceErr(*a->errp);
1105
-int vfsub_notify_change(struct dentry *dentry, struct iattr *ia,
1106
- struct vfsub_args *vargs)
1107
+int vfsub_notify_change(struct dentry *dentry, struct vfsmount *mnt,
1108
+ struct iattr *ia, struct vfsub_args *vargs)
1111
struct notify_change_args args = {
1118
@@ -1119,6 +1145,7 @@ struct unlink_args {
1121
struct dentry *dentry;
1122
+ struct vfsmount *mnt;
1123
struct vfsub_args *vargs;
1126
@@ -1149,7 +1176,7 @@ static void call_unlink(void *args)
1130
- *a->errp = do_vfsub_unlink(a->dir, a->dentry);
1131
+ *a->errp = do_vfsub_unlink(a->dir, a->dentry, a->mnt);
1134
if (!stop_sillyrename)
1135
@@ -1164,7 +1191,7 @@ static void call_unlink(void *args)
1136
* @dir: must be locked.
1137
* @dentry: target dentry.
1139
-int vfsub_unlink(struct inode *dir, struct dentry *dentry,
1140
+int vfsub_unlink(struct inode *dir, struct dentry *dentry, struct vfsmount *mnt,
1141
struct vfsub_args *vargs)
1144
@@ -1172,6 +1199,7 @@ int vfsub_unlink(struct inode *dir, stru
1152
Index: fs/aufs/vfsub.h
1153
===================================================================
1154
RCS file: /cvsroot/aufs/aufs/fs/aufs/vfsub.h,v
1155
retrieving revision 1.28
1156
diff -u -p -r1.28 vfsub.h
1157
--- fs/aufs/vfsub.h 28 Jan 2008 05:01:42 -0000 1.28
1158
+++ fs/aufs/vfsub.h 29 Jan 2008 14:42:08 -0000
1159
@@ -368,7 +368,7 @@ int do_vfsub_create(struct inode *dir, s
1162
int do_vfsub_symlink(struct inode *dir, struct dentry *dentry,
1163
- const char *symname, int mode)
1164
+ struct vfsmount *mnt, const char *symname, int mode)
1168
@@ -376,7 +376,7 @@ int do_vfsub_symlink(struct inode *dir,
1169
dir->i_ino, AuDLNPair(dentry), symname, mode);
1172
- err = vfs_symlink(dir, dentry, symname, mode);
1173
+ err = vfs_symlink(dir, dentry, mnt, symname, mode);
1175
/* dir inode is locked */
1176
au_update_fuse_h_inode(NULL, dentry->d_parent); /*ignore*/
1177
@@ -386,15 +386,15 @@ int do_vfsub_symlink(struct inode *dir,
1181
-int do_vfsub_mknod(struct inode *dir, struct dentry *dentry, int mode,
1183
+int do_vfsub_mknod(struct inode *dir, struct dentry *dentry,
1184
+ struct vfsmount *mnt, int mode, dev_t dev)
1188
LKTRTrace("i%lu, %.*s, 0x%x\n", dir->i_ino, AuDLNPair(dentry), mode);
1191
- err = vfs_mknod(dir, dentry, mode, dev);
1192
+ err = vfs_mknod(dir, dentry, mnt, mode, dev);
1194
/* dir inode is locked */
1195
au_update_fuse_h_inode(NULL, dentry->d_parent); /*ignore*/
1196
@@ -404,8 +404,9 @@ int do_vfsub_mknod(struct inode *dir, st
1200
-int do_vfsub_link(struct dentry *src_dentry, struct inode *dir,
1201
- struct dentry *dentry)
1202
+int do_vfsub_link(struct dentry *src_dentry, struct vfsmount *src_mnt,
1203
+ struct inode *dir, struct dentry *dentry,
1204
+ struct vfsmount *mnt)
1208
@@ -414,7 +415,7 @@ int do_vfsub_link(struct dentry *src_den
1212
- err = vfs_link(src_dentry, dir, dentry);
1213
+ err = vfs_link(src_dentry, src_mnt, dir, dentry, mnt);
1216
LKTRTrace("src_i %p, dst_i %p\n",
1217
@@ -430,7 +431,9 @@ int do_vfsub_link(struct dentry *src_den
1220
int do_vfsub_rename(struct inode *src_dir, struct dentry *src_dentry,
1221
- struct inode *dir, struct dentry *dentry)
1222
+ struct vfsmount *src_mnt,
1223
+ struct inode *dir, struct dentry *dentry,
1224
+ struct vfsmount *mnt)
1228
@@ -441,7 +444,7 @@ int do_vfsub_rename(struct inode *src_di
1232
- err = vfs_rename(src_dir, src_dentry, dir, dentry);
1233
+ err = vfs_rename(src_dir, src_dentry, src_mnt, dir, dentry, mnt);
1236
/* dir inode is locked */
1237
@@ -453,14 +456,15 @@ int do_vfsub_rename(struct inode *src_di
1241
-int do_vfsub_mkdir(struct inode *dir, struct dentry *dentry, int mode)
1242
+int do_vfsub_mkdir(struct inode *dir, struct dentry *dentry,
1243
+ struct vfsmount *mnt, int mode)
1247
LKTRTrace("i%lu, %.*s, 0x%x\n", dir->i_ino, AuDLNPair(dentry), mode);
1250
- err = vfs_mkdir(dir, dentry, mode);
1251
+ err = vfs_mkdir(dir, dentry, mnt, mode);
1253
/* dir inode is locked */
1254
au_update_fuse_h_inode(NULL, dentry->d_parent); /*ignore*/
1255
@@ -469,7 +473,8 @@ int do_vfsub_mkdir(struct inode *dir, st
1259
-static inline int do_vfsub_rmdir(struct inode *dir, struct dentry *dentry)
1260
+static inline int do_vfsub_rmdir(struct inode *dir, struct dentry *dentry,
1261
+ struct vfsmount *mnt)
1265
@@ -477,7 +482,7 @@ static inline int do_vfsub_rmdir(struct
1269
- err = vfs_rmdir(dir, dentry);
1270
+ err = vfs_rmdir(dir, dentry, mnt);
1272
/* dir inode is locked */
1274
@@ -485,7 +490,8 @@ static inline int do_vfsub_rmdir(struct
1278
-static inline int do_vfsub_unlink(struct inode *dir, struct dentry *dentry)
1279
+static inline int do_vfsub_unlink(struct inode *dir, struct dentry *dentry,
1280
+ struct vfsmount *mnt)
1284
@@ -494,7 +500,7 @@ static inline int do_vfsub_unlink(struct
1286
/* vfs_unlink() locks inode */
1288
- err = vfs_unlink(dir, dentry);
1289
+ err = vfs_unlink(dir, dentry, mnt);
1291
/* dir inode is locked */
1293
@@ -721,54 +727,57 @@ int vfsub_create(struct inode *dir, stru
1297
-int vfsub_symlink(struct inode *dir, struct dentry *dentry, const char *symname,
1298
- int mode, int dlgt)
1299
+int vfsub_symlink(struct inode *dir, struct dentry *dentry,
1300
+ struct vfsmount *mnt, const char *symname, int mode, int dlgt)
1302
- return do_vfsub_symlink(dir, dentry, symname, mode);
1303
+ return do_vfsub_symlink(dir, dentry, mnt, symname, mode);
1307
-int vfsub_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev,
1309
+int vfsub_mknod(struct inode *dir, struct dentry *dentry, struct vfsmount *mnt,
1310
+ int mode, dev_t dev, int dlgt)
1312
- return do_vfsub_mknod(dir, dentry, mode, dev);
1313
+ return do_vfsub_mknod(dir, dentry, mnt, mode, dev);
1317
-int vfsub_link(struct dentry *src_dentry, struct inode *dir,
1318
- struct dentry *dentry, int dlgt)
1319
+int vfsub_link(struct dentry *src_dentry, struct vfsmount *src_mnt,
1320
+ struct inode *dir, struct dentry *dentry, struct vfsmount *mnt,
1323
- return do_vfsub_link(src_dentry, dir, dentry);
1324
+ return do_vfsub_link(src_dentry, src_mnt, dir, dentry, mnt);
1328
int vfsub_rename(struct inode *src_dir, struct dentry *src_dentry,
1329
- struct inode *dir, struct dentry *dentry,
1330
+ struct vfsmount *src_mnt,
1331
+ struct inode *dir, struct dentry *dentry, struct vfsmount *mnt,
1332
struct vfsub_args *vargs)
1336
vfsub_ignore(vargs);
1337
- err = do_vfsub_rename(src_dir, src_dentry, dir, dentry);
1338
+ err = do_vfsub_rename(src_dir, src_dentry, src_mnt, dir, dentry, mnt);
1340
vfsub_unignore(vargs);
1345
-int vfsub_mkdir(struct inode *dir, struct dentry *dentry, int mode, int dlgt)
1346
+int vfsub_mkdir(struct inode *dir, struct dentry *dentry, struct vfsmount *mnt,
1347
+ int mode, int dlgt)
1349
- return do_vfsub_mkdir(dir, dentry, mode);
1350
+ return do_vfsub_mkdir(dir, dentry, mnt, mode);
1354
-int vfsub_rmdir(struct inode *dir, struct dentry *dentry,
1355
+int vfsub_rmdir(struct inode *dir, struct dentry *dentry, struct vfsmount *mnt,
1356
struct vfsub_args *vargs)
1360
vfsub_ignore(vargs);
1361
- err = do_vfsub_rmdir(dir, dentry);
1362
+ err = do_vfsub_rmdir(dir, dentry, mnt);
1364
vfsub_unignore(vargs);
1366
@@ -851,15 +860,16 @@ static inline int vfsub_getattr(struct v
1368
/* ---------------------------------------------------------------------- */
1370
-int vfsub_sio_mkdir(struct inode *dir, struct dentry *dentry, int mode,
1372
-int vfsub_sio_rmdir(struct inode *dir, struct dentry *dentry, int dlgt);
1373
+int vfsub_sio_mkdir(struct inode *dir, struct dentry *dentry,
1374
+ struct vfsmount *mnt, int mode, int dlgt);
1375
+int vfsub_sio_rmdir(struct inode *dir, struct dentry *dentry,
1376
+ struct vfsmount *mnt, int dlgt);
1378
/* ---------------------------------------------------------------------- */
1380
-int vfsub_notify_change(struct dentry *dentry, struct iattr *ia,
1381
- struct vfsub_args *vargs);
1382
-int vfsub_unlink(struct inode *dir, struct dentry *dentry,
1383
+int vfsub_notify_change(struct dentry *dentry, struct vfsmount *mnt,
1384
+ struct iattr *ia, struct vfsub_args *vargs);
1385
+int vfsub_unlink(struct inode *dir, struct dentry *dentry, struct vfsmount *mnt,
1386
struct vfsub_args *vargs);
1387
int vfsub_statfs(void *arg, struct kstatfs *buf, int dlgt);
1389
Index: fs/aufs/wbr_policy.c
1390
===================================================================
1391
RCS file: /cvsroot/aufs/aufs/fs/aufs/wbr_policy.c,v
1392
retrieving revision 1.5
1393
diff -u -p -r1.5 wbr_policy.c
1394
--- fs/aufs/wbr_policy.c 26 Nov 2007 01:34:50 -0000 1.5
1395
+++ fs/aufs/wbr_policy.c 29 Jan 2008 14:42:08 -0000
1397
#include <linux/statfs.h>
1400
-static int au_cpdown_attr(struct dentry *h_dst, struct dentry *h_src, int dlgt)
1401
+static int au_cpdown_attr(struct dentry *h_dst, struct dentry *h_src,
1402
+ struct vfsmount *h_dst_mnt, int dlgt)
1406
@@ -41,14 +42,14 @@ static int au_cpdown_attr(struct dentry
1407
sbits = !!(ia.ia_mode & (S_ISUID | S_ISGID));
1409
vfsub_args_init(&vargs, NULL, dlgt, /*force_unlink*/0);
1410
- err = vfsub_notify_change(h_dst, &ia, &vargs);
1411
+ err = vfsub_notify_change(h_dst, h_dst_mnt, &ia, &vargs);
1413
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24)
1414
/* is this nfs only? */
1415
if (!err && sbits && au_test_nfs(h_dst->d_sb)) {
1416
ia.ia_valid = ATTR_FORCE | ATTR_MODE;
1417
ia.ia_mode = h_isrc->i_mode;
1418
- err = vfsub_notify_change(h_dst, &ia, &vargs);
1419
+ err = vfsub_notify_change(h_dst, h_dst_mnt, &ia, &vargs);
1423
@@ -71,6 +72,7 @@ static int au_cpdown_dir(struct dentry *
1424
aufs_bindex_t bend, bopq;
1425
struct dentry *h_dentry, *opq_dentry, *wh_dentry;
1426
struct inode *h_dir, *h_inode, *inode;
1427
+ struct vfsmount *h_mnt;
1429
LKTRTrace("%.*s, b%d\n", AuDLNPair(dentry), bdst);
1430
AuDebugOn(dbstart(dentry) <= bdst
1431
@@ -84,9 +86,10 @@ static int au_cpdown_dir(struct dentry *
1432
err = au_lkup_neg(dentry, bdst);
1433
if (unlikely(err < 0))
1435
+ h_mnt = sbr_mnt(dentry->d_sb, bdst);
1436
h_dentry = au_h_dptr_i(dentry, bdst);
1437
dlgt = au_need_dlgt(dentry->d_sb);
1438
- err = vfsub_sio_mkdir(h_dir, h_dentry, 0755, dlgt);
1439
+ err = vfsub_sio_mkdir(h_dir, h_dentry, h_mnt, 0755, dlgt);
1443
@@ -112,7 +115,7 @@ static int au_cpdown_dir(struct dentry *
1447
- err = au_cpdown_attr(h_dentry, au_h_dptr(dentry), dlgt);
1448
+ err = au_cpdown_attr(h_dentry, au_h_dptr(dentry), h_mnt, dlgt);
1449
vfsub_i_unlock(h_inode);
1452
@@ -125,8 +128,8 @@ static int au_cpdown_dir(struct dentry *
1455
if (wh_dentry->d_inode)
1456
- err = au_unlink_wh_dentry(h_dir, wh_dentry, dentry,
1458
+ err = au_unlink_wh_dentry(h_dir, wh_dentry, h_mnt,
1459
+ dentry, NULL, dlgt);
1463
@@ -153,7 +156,7 @@ static int au_cpdown_dir(struct dentry *
1467
- rerr = vfsub_sio_rmdir(h_dir, h_dentry, dlgt);
1468
+ rerr = vfsub_sio_rmdir(h_dir, h_dentry, h_mnt, dlgt);
1469
if (unlikely(rerr)) {
1470
AuIOErr("failed removing %.*s b%d (%d)\n",
1471
AuDLNPair(dentry), bdst, rerr);
1472
Index: fs/aufs/whout.c
1473
===================================================================
1474
RCS file: /cvsroot/aufs/aufs/fs/aufs/whout.c,v
1475
retrieving revision 1.30
1476
diff -u -p -r1.30 whout.c
1477
--- fs/aufs/whout.c 28 Jan 2008 05:01:42 -0000 1.30
1478
+++ fs/aufs/whout.c 29 Jan 2008 14:42:08 -0000
1479
@@ -219,6 +219,7 @@ int rename_whtmp(struct inode *dir, stru
1480
struct dentry *h_dentry, *h_parent, *tmp_dentry;
1481
struct super_block *sb;
1482
struct aufs_hin_ignore ign;
1483
+ struct vfsmount *h_mnt;
1484
struct vfsub_args vargs;
1485
struct aufs_ndx ndx = {
1487
@@ -240,13 +241,15 @@ int rename_whtmp(struct inode *dir, stru
1488
err = PTR_ERR(tmp_dentry);
1489
if (!IS_ERR(tmp_dentry)) {
1490
/* under the same dir, no need to lock_rename() */
1491
+ h_mnt = sbr_mnt(sb, bindex);
1492
vfsub_args_init(&vargs, &ign, ndx.dlgt, 0);
1493
AuDebugOn(!S_ISDIR(dentry->d_inode->i_mode));
1494
if (unlikely(au_flag_test_udba_inotify(sb)
1496
vfsub_ign_hinode(&vargs, IN_MOVE_SELF,
1497
itohi(dentry->d_inode, bindex));
1498
- err = vfsub_rename(h_dir, h_dentry, h_dir, tmp_dentry, &vargs);
1499
+ err = vfsub_rename(h_dir, h_dentry, h_mnt, h_dir, tmp_dentry,
1501
//if (LktrCond) err = -1; //unavailable
1504
@@ -259,7 +262,7 @@ int rename_whtmp(struct inode *dir, stru
1505
/* ---------------------------------------------------------------------- */
1507
static int do_unlink_wh(struct inode *h_dir, struct dentry *wh_dentry,
1508
- struct inode *dir, int dlgt)
1509
+ struct vfsmount *h_mnt, struct inode *dir, int dlgt)
1511
struct vfsub_args vargs;
1513
@@ -274,11 +277,12 @@ static int do_unlink_wh(struct inode *h_
1514
vfsub_args_init(&vargs, NULL, dlgt,
1515
(h_dir->i_mode & S_ISVTX)
1516
&& wh_dentry->d_inode->i_uid != current->fsuid);
1517
- return vfsub_unlink(h_dir, wh_dentry, &vargs);
1518
+ return vfsub_unlink(h_dir, wh_dentry, h_mnt, &vargs);
1521
int au_unlink_wh_dentry(struct inode *h_dir, struct dentry *wh_dentry,
1522
- struct dentry *dentry, struct inode *dir, int dlgt)
1523
+ struct vfsmount *h_mnt, struct dentry *dentry,
1524
+ struct inode *dir, int dlgt)
1528
@@ -288,7 +292,7 @@ int au_unlink_wh_dentry(struct inode *h_
1529
|| !wh_dentry->d_inode
1530
|| !S_ISREG(wh_dentry->d_inode->i_mode));
1532
- err = do_unlink_wh(h_dir, wh_dentry, dir, dlgt);
1533
+ err = do_unlink_wh(h_dir, wh_dentry, h_mnt, dir, dlgt);
1534
//if (LktrCond) err = -1; // unavailable
1536
set_dbwh(dentry, -1);
1537
@@ -298,7 +302,8 @@ int au_unlink_wh_dentry(struct inode *h_
1540
static int unlink_wh_name(struct dentry *h_parent, struct qstr *wh,
1541
- struct inode *dir, struct aufs_ndx *ndx)
1542
+ struct vfsmount *h_mnt, struct inode *dir,
1543
+ struct aufs_ndx *ndx)
1546
struct inode *h_dir;
1547
@@ -314,7 +319,8 @@ static int unlink_wh_name(struct dentry
1549
if (h_dentry->d_inode
1550
&& S_ISREG(h_dentry->d_inode->i_mode))
1551
- err = do_unlink_wh(h_dir, h_dentry, dir, ndx->dlgt);
1552
+ err = do_unlink_wh(h_dir, h_dentry, h_mnt, dir,
1556
err = PTR_ERR(h_dentry);
1557
@@ -325,7 +331,8 @@ static int unlink_wh_name(struct dentry
1559
/* ---------------------------------------------------------------------- */
1561
-static void clean_wh(struct inode *h_dir, struct dentry *wh)
1562
+static void clean_wh(struct inode *h_dir, struct dentry *wh,
1563
+ struct vfsmount *h_mnt)
1566
struct vfsub_args vargs;
1567
@@ -334,14 +341,15 @@ static void clean_wh(struct inode *h_dir
1570
vfsub_args_init(&vargs, NULL, 0, 0);
1571
- err = vfsub_unlink(h_dir, wh, &vargs);
1572
+ err = vfsub_unlink(h_dir, wh, h_mnt, &vargs);
1574
AuWarn("failed unlink %.*s (%d), ignored.\n",
1575
AuDLNPair(wh), err);
1579
-static void clean_plink(struct inode *h_dir, struct dentry *plink)
1580
+static void clean_plink(struct inode *h_dir, struct dentry *plink,
1581
+ struct vfsmount *h_mnt)
1584
struct vfsub_args vargs;
1585
@@ -350,7 +358,7 @@ static void clean_plink(struct inode *h_
1587
if (plink->d_inode) {
1588
vfsub_args_init(&vargs, NULL, 0, 0);
1589
- err = vfsub_rmdir(h_dir, plink, &vargs);
1590
+ err = vfsub_rmdir(h_dir, plink, h_mnt, &vargs);
1592
AuWarn("failed rmdir %.*s (%d), ignored.\n",
1593
AuDLNPair(plink), err);
1594
@@ -364,7 +372,8 @@ static int test_linkable(struct inode *h
1598
-static int plink_dir(struct inode *h_dir, struct dentry *plink)
1599
+static int plink_dir(struct inode *h_dir, struct dentry *plink,
1600
+ struct vfsmount *h_mnt)
1604
@@ -373,7 +382,7 @@ static int plink_dir(struct inode *h_dir
1606
if (unlikely(au_test_nfs(plink->d_sb)))
1608
- err = vfsub_mkdir(h_dir, plink, mode, /*dlgt*/0);
1609
+ err = vfsub_mkdir(h_dir, plink, h_mnt, mode, /*dlgt*/0);
1610
} else if (S_ISDIR(plink->d_inode->i_mode))
1613
@@ -439,23 +448,23 @@ int init_wh(struct dentry *h_root, struc
1617
- clean_wh(h_dir, wh);
1618
- clean_plink(h_dir, plink);
1619
+ clean_wh(h_dir, wh, br->br_mnt);
1620
+ clean_plink(h_dir, plink, br->br_mnt);
1623
case AuBr_RWNoLinkWH:
1624
- clean_wh(h_dir, wh);
1625
+ clean_wh(h_dir, wh, br->br_mnt);
1627
err = test_linkable(h_dir);
1631
- err = plink_dir(h_dir, plink);
1632
+ err = plink_dir(h_dir, plink, br->br_mnt);
1635
br->br_plink = dget(plink);
1637
- clean_plink(h_dir, plink);
1638
+ clean_plink(h_dir, plink, br->br_mnt);
1642
@@ -484,12 +493,12 @@ int init_wh(struct dentry *h_root, struc
1646
- err = plink_dir(h_dir, plink);
1647
+ err = plink_dir(h_dir, plink, br->br_mnt);
1650
br->br_plink = dget(plink);
1652
- clean_plink(h_dir, plink);
1653
+ clean_plink(h_dir, plink, br->br_mnt);
1654
br->br_wh = dget(wh);
1657
@@ -550,7 +559,7 @@ static void reinit_br_wh(void *arg)
1660
br_wh_write_lock(a->br);
1661
- err = vfsub_unlink(h_dir, a->br->br_wh, &vargs);
1662
+ err = vfsub_unlink(h_dir, a->br->br_wh, a->br->br_mnt, &vargs);
1663
//if (LktrCond) err = -1;
1665
a->br->br_wh = NULL;
1666
@@ -624,7 +633,8 @@ static int link_or_create_wh(struct dent
1667
br = stobr(sb, bindex);
1668
br_wh_read_lock(br);
1670
- err = vfsub_link(br->br_wh, h_dir, wh, dlgt);
1671
+ err = vfsub_link(br->br_wh, br->br_mnt, h_dir, wh, br->br_mnt,
1673
if (!err || err != -EMLINK)
1676
@@ -688,8 +698,8 @@ static struct dentry *do_diropq(struct d
1678
AuDebugOn(/* !S_ISDIR(dentry->d_inode->i_mode)
1679
* || */!opq_dentry->d_inode);
1680
- err = do_unlink_wh(h_dir, opq_dentry, dentry->d_inode,
1682
+ err = do_unlink_wh(h_dir, opq_dentry, sbr_mnt(sb, bindex),
1683
+ dentry->d_inode, ndx.dlgt);
1684
//if (LktrCond) err = -1;
1686
set_dbdiropq(dentry, -1);
1687
@@ -820,6 +830,7 @@ static int del_wh_children(struct aufs_n
1688
struct aufs_wh *tpos;
1689
struct hlist_node *pos;
1690
struct aufs_destr *str;
1691
+ struct vfsmount *h_mnt;
1693
LKTRTrace("%.*s\n", AuDLNPair(h_parent));
1694
h_dir = h_parent->d_inode;
1695
@@ -837,6 +848,7 @@ static int del_wh_children(struct aufs_n
1697
/* already checked by au_test_perm(). */
1699
+ h_mnt = sbr_mnt(inode->i_sb, bindex);
1700
for (i = 0; !err && i < AuSize_NHASH; i++) {
1701
head = whlist->heads + i;
1702
hlist_for_each_entry(tpos, pos, head, wh_hash) {
1703
@@ -846,8 +858,8 @@ static int del_wh_children(struct aufs_n
1704
if (str->len + AUFS_WH_PFX_LEN <= PATH_MAX) {
1705
memcpy(p, str->name, str->len);
1706
wh_name.len = AUFS_WH_PFX_LEN + str->len;
1707
- err = unlink_wh_name(h_parent, &wh_name, inode,
1709
+ err = unlink_wh_name(h_parent, &wh_name, h_mnt,
1711
//if (LktrCond) err = -1;
1714
@@ -949,7 +961,7 @@ int rmdir_whtmp(struct dentry *h_dentry,
1716
vfsub_ign_hinode(&vargs, IN_DELETE_SELF,
1717
itohi(inode, bindex));
1718
- err = vfsub_rmdir(h_dir, h_dentry, &vargs);
1719
+ err = vfsub_rmdir(h_dir, h_dentry, sbr_mnt(sb, bindex), &vargs);
1721
//if (LktrCond) err = -1;
1723
Index: fs/aufs/whout.h
1724
===================================================================
1725
RCS file: /cvsroot/aufs/aufs/fs/aufs/whout.h,v
1726
retrieving revision 1.13
1727
diff -u -p -r1.13 whout.h
1728
--- fs/aufs/whout.h 1 Oct 2007 04:48:51 -0000 1.13
1729
+++ fs/aufs/whout.h 29 Jan 2008 14:42:08 -0000
1730
@@ -39,7 +39,8 @@ struct dentry *lkup_whtmp(struct dentry
1731
int rename_whtmp(struct inode *dir, struct dentry *dentry, aufs_bindex_t bindex,
1733
int au_unlink_wh_dentry(struct inode *h_dir, struct dentry *wh_dentry,
1734
- struct dentry *dentry, struct inode *dir, int dlgt);
1735
+ struct vfsmount *h_mnt, struct dentry *dentry,
1736
+ struct inode *dir, int dlgt);
1739
int init_wh(struct dentry *h_parent, struct aufs_branch *br,
1740
Index: fs/aufs/xino.c
1741
===================================================================
1742
RCS file: /cvsroot/aufs/aufs/fs/aufs/xino.c,v
1743
retrieving revision 1.47
1744
diff -u -p -r1.47 xino.c
1745
--- fs/aufs/xino.c 10 Dec 2007 01:19:54 -0000 1.47
1746
+++ fs/aufs/xino.c 29 Jan 2008 14:42:08 -0000
1747
@@ -520,7 +520,7 @@ struct file *xino_create(struct super_bl
1748
h_dir = h_parent->d_inode;
1749
vfsub_args_init(&vargs, NULL, 0, 0);
1750
vfsub_i_lock_nested(h_dir, AuLsc_I_PARENT);
1751
- err = vfsub_unlink(h_dir, file->f_dentry, &vargs);
1752
+ err = vfsub_unlink(h_dir, file->f_dentry, file->f_vfsmnt, &vargs);
1753
vfsub_i_unlock(h_dir);
1755
if (unlikely(err)) {
1756
@@ -611,7 +611,7 @@ static struct file *xino_create2(struct
1759
vfsub_args_init(&vargs, NULL, 0, 0);
1760
- err = vfsub_unlink(dir, dentry, &vargs);
1761
+ err = vfsub_unlink(dir, dentry, file->f_vfsmnt, &vargs);
1762
//if (LktrCond) err = -1;
1763
if (unlikely(err)) {
1764
AuErr("%.*s unlink err %d\n", AuLNPair(name), err);
1765
@@ -620,7 +620,8 @@ static struct file *xino_create2(struct
1767
if (unlikely(copy_src)) {
1768
inode = copy_src->f_dentry->d_inode;
1769
- err = au_copy_file(file, copy_src, i_size_read(inode), sb);
1770
+ err = au_copy_file(file, copy_src, i_size_read(inode), sb,
1772
if (unlikely(err)) {
1773
AuErr("%.*s copy err %d\n", AuLNPair(name), err);