~ubuntu-branches/ubuntu/quantal/aufs/quantal

« back to all changes in this revision

Viewing changes to patch/ubuntu-2.6.22-14.46.patch

  • Committer: Bazaar Package Importer
  • Author(s): Julian Andres Klode
  • Date: 2008-04-01 18:26:37 UTC
  • mfrom: (1.1.4 upstream)
  • Revision ID: james.westby@ubuntu.com-20080401182637-ujuqq47eiggw4y5w
Tags: 0+20080401-1
* New upstream snapshot
  - Remove bashisms in script (Closes: #471288)
* debian/conf.mk, linux-patch-aufs.kpatches.sysfs_get_dentry:
  - Remove support for this patch, no longer used
* debian/conf.mk:
  - Add hacks for arm to armel (Closes: #473767)
* debian/control:
  - Add Dm-Upload-Allowed
* debian/copyright:
  - Use http://wiki.debian.org/Proposals/CopyrightFormat
* debian/linux-patch-aufs.kpatches.{splice,put_filp}:
  - Add support for Kernel 2.6.24 (and 2.6.25)
* debian/patches:
  - 01_vserver_apparmor: Update patch
  - 06_rt: Add patch for realtime kernel
  - 07_splice_hack: Add hack to support splice operations (Closes: #473430)

Show diffs side-by-side

added added

removed removed

Lines of Context:
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.
4
4
 
 
5
This patch is against aufs version 20080226.
 
6
 
5
7
This patch is NOT tested because I am not an ubuntu user.
6
8
 
7
 
 
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
16
17
 
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)
22
23
 {
23
24
        struct inode *inode;
24
25
 
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,
26
27
 
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
        dt->dt_hdir = hdir;
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,
39
 
+                                         &vargs);
40
 
                dput(parent);
41
 
        } else
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,
44
 
+                                         &vargs);
 
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);
45
40
        if (unlikely(err))
46
41
                AuWarn("restoring timestamps failed(%d). ignored\n", err);
47
42
 }
54
49
 {
55
50
        int err, sbits;
56
51
        struct iattr ia;
57
 
@@ -190,7 +195,7 @@ static int cpup_iattr(struct dentry *h_d
 
52
@@ -184,7 +187,7 @@ static int cpup_iattr(struct dentry *h_d
58
53
        sbits = !!(ia.ia_mode & (S_ISUID | S_ISGID));
59
54
 
60
55
        vfsub_args_init(&vargs, NULL, dlgt, /*force_unlink*/0);
63
58
        //if (LktrCond) err = -1;
64
59
 
65
60
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24)
66
 
@@ -198,7 +203,7 @@ static int cpup_iattr(struct dentry *h_d
 
61
@@ -192,7 +195,7 @@ static int cpup_iattr(struct dentry *h_d
67
62
        if (!err && sbits && au_test_nfs(h_dst->d_sb)) {
68
63
                ia.ia_valid = ATTR_FORCE | ATTR_MODE;
69
64
                ia.ia_mode = h_isrc->i_mode;
72
67
        }
73
68
 #endif
74
69
        if (!err)
75
 
@@ -269,7 +274,8 @@ static int cpup_regular(struct dentry *d
 
70
@@ -263,7 +266,8 @@ static int cpup_regular(struct dentry *d
76
71
 
77
72
        /* stop updating while we copyup */
78
73
        IMustLock(hidden[SRC].dentry->d_inode);
82
77
 
83
78
  out_dst_file:
84
79
        fput(hidden[DST].file);
85
 
@@ -295,6 +301,7 @@ static int cpup_entry(struct dentry *den
 
80
@@ -289,6 +293,7 @@ static int cpup_entry(struct dentry *den
86
81
        char *sym;
87
82
        mm_segment_t old_fs;
88
83
        struct super_block *sb;
89
84
+       struct vfsmount *h_mnt;
90
85
        struct vfsub_args vargs;
91
 
        const int do_dt = flags->dtime;
92
 
 
93
 
@@ -304,6 +311,7 @@ static int cpup_entry(struct dentry *den
 
86
        struct aufs_hinode *hgdir;
 
87
        const int do_dt = au_ftest_cpup(flags, DTIME);
 
88
@@ -299,6 +304,7 @@ static int cpup_entry(struct dentry *den
94
89
        sb = dentry->d_sb;
95
90
        AuDebugOn(bdst >= bsrc || au_test_ro(sb, bdst, NULL));
96
91
        /* bsrc branch can be ro/rw. */
98
93
 
99
94
        h_src = au_h_dptr_i(dentry, bsrc);
100
95
        AuDebugOn(!h_src);
101
 
@@ -320,7 +328,7 @@ static int cpup_entry(struct dentry *den
102
 
        IMustLock(h_dir);
103
 
 
104
 
        if (do_dt)
105
 
-               au_dtime_store(&dt, parent, bdst, h_parent);
106
 
+               au_dtime_store(&dt, parent, bdst, h_parent, h_mnt);
 
96
@@ -322,7 +328,7 @@ static int cpup_entry(struct dentry *den
 
97
                        hgdir = itohi(gparent->d_inode, bdst);
 
98
                        dput(gparent);
 
99
                }
 
100
-               au_dtime_store(&dt, parent, h_parent, hgdir);
 
101
+               au_dtime_store(&dt, parent, h_parent, h_mnt, hgdir);
 
102
        }
107
103
 
108
104
        mode = h_inode->i_mode;
109
 
        switch (mode & S_IFMT) {
110
 
@@ -341,7 +349,8 @@ static int cpup_entry(struct dentry *den
 
105
@@ -344,7 +350,8 @@ static int cpup_entry(struct dentry *den
111
106
                        if (unlikely(err)) {
112
107
                                int rerr;
113
108
                                vfsub_args_init(&vargs, NULL, dlgt, 0);
117
112
                                if (rerr) {
118
113
                                        AuIOErr("failed unlinking cpup-ed %.*s"
119
114
                                                "(%d, %d)\n",
120
 
@@ -352,7 +361,7 @@ static int cpup_entry(struct dentry *den
 
115
@@ -355,7 +362,7 @@ static int cpup_entry(struct dentry *den
121
116
                }
122
117
                break;
123
118
        case S_IFDIR:
126
121
                //if (LktrCond) {vfs_rmdir(h_dir, h_dst); err = -1;}
127
122
                if (!err) {
128
123
                        /* setattr case: dir is not locked */
129
 
@@ -376,7 +385,8 @@ static int cpup_entry(struct dentry *den
 
124
@@ -379,7 +386,8 @@ static int cpup_entry(struct dentry *den
130
125
                set_fs(old_fs);
131
126
                if (symlen > 0) {
132
127
                        sym[symlen] = 0;
136
131
                        //if (LktrCond)
137
132
                        //{vfs_unlink(h_dir, h_dst); err = -1;}
138
133
                }
139
 
@@ -388,7 +398,8 @@ static int cpup_entry(struct dentry *den
 
134
@@ -391,7 +399,7 @@ static int cpup_entry(struct dentry *den
140
135
                /*FALLTHROUGH*/
141
136
        case S_IFIFO:
142
137
        case S_IFSOCK:
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,
145
 
+                                 dlgt);
 
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),
 
141
                                  dlgt);
146
142
                //if (LktrCond) {vfs_unlink(h_dir, h_dst); err = -1;}
147
 
                break;
148
 
        default:
149
 
@@ -419,6 +430,7 @@ int au_cpup_single(struct dentry *dentry
150
 
        struct au_dtime dt;
 
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;
154
148
 
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;
159
153
 
160
154
        sbinfo = stosi(sb);
162
156
        dlgt = au_need_dlgt(sb);
163
157
        dst_inode = au_h_iptr_i(inode, bdst);
164
158
        if (unlikely(dst_inode)) {
165
 
@@ -454,7 +467,8 @@ int au_cpup_single(struct dentry *dentry
 
159
@@ -460,7 +470,8 @@ int au_cpup_single(struct dentry *dentry
166
160
                        if (IS_ERR(h_src))
167
161
                                goto out;
168
162
                        AuDebugOn(!h_src->d_inode);
172
166
                        dput(h_src);
173
167
                        goto out;
174
168
                } else
175
 
@@ -471,7 +485,7 @@ int au_cpup_single(struct dentry *dentry
 
169
@@ -477,7 +488,7 @@ int au_cpup_single(struct dentry *dentry
176
170
        vfsub_i_lock_nested(dst_inode, AuLsc_I_CHILD2);
177
171
 
178
172
        //todo: test dlgt
181
175
        //if (LktrCond) err = -1;
182
176
 #if 0 // xattr
183
177
        if (0 && !err)
184
 
@@ -494,12 +508,12 @@ int au_cpup_single(struct dentry *dentry
185
 
 
186
 
        /* revert */
187
 
        vfsub_i_unlock(dst_inode);
188
 
-       au_dtime_store(&dt, parent, bdst, h_parent);
189
 
+       au_dtime_store(&dt, parent, bdst, h_parent, h_mnt);
 
178
@@ -506,12 +517,12 @@ int au_cpup_single(struct dentry *dentry
 
179
                hgdir = itohi(gparent->d_inode, bdst);
 
180
                dput(gparent);
 
181
        }
 
182
-       au_dtime_store(&dt, parent, h_parent, hgdir);
 
183
+       au_dtime_store(&dt, parent, h_parent, h_mnt, hgdir);
190
184
        vfsub_args_init(&vargs, NULL, dlgt, 0);
191
185
        if (!isdir)
192
186
-               rerr = vfsub_unlink(h_dir, h_dst, &vargs);
197
191
        //rerr = -1;
198
192
        au_dtime_revert(&dt);
199
193
        if (rerr) {
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 = {
207
 
                .nd     = NULL,
208
 
@@ -701,7 +716,8 @@ int au_cpup_wh(struct dentry *dentry, au
209
 
        if (IS_ERR(wh_dentry))
210
 
                goto out;
211
 
 
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);
 
204
                dput(gparent);
 
205
        }
 
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 */
220
214
        dget(wh_dentry);
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;
241
235
 };
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);
247
241
 
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));
258
253
        }
259
 
        HiLock(bcpup);
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,
 
256
+                                 &vargs);
262
257
        //err = -1;
263
258
        if (!err)
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.
274
269
  */
287
282
                                          /*dlgt*/0);
288
283
                //err = -1;
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,
 
286
        }
 
287
 
293
288
        if (dt)
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,
307
 
                .add_entry      = 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);
310
305
        sb = dir->i_sb;
311
306
        dlgt = au_need_dlgt(sb);
313
308
 
314
309
 #if 1 // partial testing
315
310
        switch (arg->type) {
316
 
@@ -203,11 +206,11 @@ static int add_simple(struct inode *dir,
 
311
@@ -318,11 +321,11 @@ static int add_simple(struct inode *dir,
317
312
                                  arg->u.c.nd, au_nfsmnt(sb, dbstart(dentry)));
318
313
                break;
319
314
        case Symlink:
327
322
                                  arg->u.m.mode, arg->u.m.dev, dlgt);
328
323
                break;
329
324
        default:
330
 
@@ -217,14 +220,14 @@ static int add_simple(struct inode *dir,
331
 
        err = -1;
 
325
@@ -333,14 +336,14 @@ static int add_simple(struct inode *dir,
332
326
 #endif
 
327
        created = !err;
333
328
        if (!err)
334
329
-               err = epilog(dir, wh_dentry, dentry);
335
330
+               err = epilog(dir, wh_dentry, h_mnt, dentry);
336
331
        //err = -1;
337
332
 
338
333
        /* revert */
339
 
        if (unlikely(err && h_dentry->d_inode)) {
 
334
        if (unlikely(created && err && h_dentry->d_inode)) {
340
335
                int rerr;
341
336
                vfsub_args_init(&vargs, NULL, dlgt, 0);
342
337
-               rerr = vfsub_unlink(h_dir, h_dentry, &vargs);
344
339
                //rerr = -1;
345
340
                if (rerr) {
346
341
                        AuIOErr("%.*s revert failure(%d, %d)\n",
347
 
@@ -345,6 +348,7 @@ static int cpup_or_link(struct dentry *s
 
342
@@ -486,6 +489,7 @@ static int cpup_or_link(struct dentry *s
 
343
        struct dentry *h_dentry;
348
344
        aufs_bindex_t bstart;
349
345
        struct super_block *sb;
350
 
        struct au_cpup_flags cflags;
351
346
+       struct vfsmount *h_mnt;
352
347
 
353
348
        AuTraceEnter();
354
349
 
355
 
@@ -354,8 +358,11 @@ static int cpup_or_link(struct dentry *s
 
350
@@ -495,8 +499,11 @@ static int cpup_or_link(struct dentry *s
356
351
        h_inode = h_dentry->d_inode;
357
352
        bstart = ibstart(inode);
358
353
        h_dst_inode = NULL;
365
360
 
366
361
        if (!h_dst_inode || !h_dst_inode->i_nlink) {
367
362
                /* copyup src_dentry as the name of dentry. */
368
 
@@ -373,8 +380,8 @@ static int cpup_or_link(struct dentry *s
 
363
@@ -513,8 +520,8 @@ static int cpup_or_link(struct dentry *s
369
364
                /* the inode of src_dentry already exists on a.bdst branch */
370
365
                h_dentry = d_find_alias(h_dst_inode);
371
366
                if (h_dentry) {
376
371
                        dput(h_dentry);
377
372
                } else {
378
373
                        AuIOErr("no dentry found for i%lu on b%d\n",
379
 
@@ -398,6 +405,7 @@ int aufs_link(struct dentry *src_dentry,
 
374
@@ -538,6 +545,7 @@ int aufs_link(struct dentry *src_dentry,
380
375
        struct au_dtime dt;
381
376
        struct link_arg a;
382
377
        struct super_block *sb;
384
379
        struct vfsub_args vargs;
385
380
        struct au_wr_dir_args wr_dir_args = {
386
381
                //.force_btgt   = -1,
387
 
@@ -441,6 +449,7 @@ int aufs_link(struct dentry *src_dentry,
 
382
@@ -580,6 +588,7 @@ int aufs_link(struct dentry *src_dentry,
388
383
        a.bsrc = dbstart(src_dentry);
389
384
        a.bdst = dbstart(dentry);
390
385
        h_src_dentry = au_h_dptr(src_dentry);
392
387
        if (unlikely(!AuFlag(stosi(sb), f_plink))) {
393
388
                /*
394
389
                 * copyup src_dentry to the branch we process,
395
 
@@ -453,8 +462,8 @@ int aufs_link(struct dentry *src_dentry,
 
390
@@ -592,8 +601,8 @@ int aufs_link(struct dentry *src_dentry,
396
391
                        err = cpup_before_link(src_dentry, dir, &a);
397
392
                if (!err) {
398
393
                        h_src_dentry = au_h_dptr(src_dentry);
403
398
                        //err = -1;
404
399
                }
405
400
        } else {
406
 
@@ -463,15 +472,15 @@ int aufs_link(struct dentry *src_dentry,
 
401
@@ -602,15 +611,15 @@ int aufs_link(struct dentry *src_dentry,
407
402
                        err = cpup_or_link(src_dentry, &a);
408
403
                else {
409
404
                        h_src_dentry = au_h_dptr(src_dentry);
422
417
                                          dir, /*dlgt*/0);
423
418
                //err = -1;
424
419
                if (unlikely(err))
425
 
@@ -542,7 +551,7 @@ int aufs_link(struct dentry *src_dentry,
 
420
@@ -681,7 +690,7 @@ int aufs_link(struct dentry *src_dentry,
426
421
        }
427
422
 #endif
428
423
        vfsub_args_init(&vargs, NULL, a.dlgt, 0);
431
426
        //rerr = -1;
432
427
        if (!rerr)
433
428
                goto out_dt;
434
 
@@ -577,6 +586,7 @@ int aufs_mkdir(struct inode *dir, struct
 
429
@@ -716,6 +725,7 @@ int aufs_mkdir(struct inode *dir, struct
435
430
        struct au_dtime dt;
436
431
        aufs_bindex_t bindex;
437
432
        struct super_block *sb;
439
434
        struct vfsub_args vargs;
440
435
        struct au_wr_dir_args wr_dir_args = {
441
436
                .force_btgt     = -1,
442
 
@@ -606,8 +616,9 @@ int aufs_mkdir(struct inode *dir, struct
 
437
@@ -743,8 +753,9 @@ int aufs_mkdir(struct inode *dir, struct
443
438
        h_dir = h_parent->d_inode;
444
439
        IMustLock(h_dir);
445
440
        dlgt = au_need_dlgt(sb);
450
445
        //err = -1;
451
446
        if (unlikely(err))
452
447
                goto out_unlock;
453
 
@@ -627,7 +638,7 @@ int aufs_mkdir(struct inode *dir, struct
 
448
@@ -764,7 +775,7 @@ int aufs_mkdir(struct inode *dir, struct
454
449
                diropq = 1;
455
450
        }
456
451
 
459
454
        //err = -1;
460
455
        if (!err) {
461
456
                dir->i_nlink++;
462
 
@@ -651,7 +662,7 @@ int aufs_mkdir(struct inode *dir, struct
 
457
@@ -788,7 +799,7 @@ int aufs_mkdir(struct inode *dir, struct
463
458
  out_dir:
464
459
        LKTRLabel(revert dir);
465
460
        vfsub_args_init(&vargs, NULL, dlgt, 0);
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
 
474
                        goto out_dir;
 
475
        }
 
476
 
 
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;
486
481
        if (!need_wh)
487
482
                goto out; /* success, no need to create whiteout */
488
 
@@ -212,16 +213,17 @@ struct revert_flags {
489
 
        unsigned int    dlgt:1;
490
 
 };
 
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; }
491
486
 
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,
 
491
                     unsigned int flags)
498
492
 {
499
 
        int rerr;
500
 
        struct inode *dir;
 
493
@@ -335,7 +337,7 @@ static int do_revert(int err, struct den
501
494
 
502
495
        dir = wh_dentry->d_parent->d_inode; /* dir inode is locked */
503
496
        IMustLock(dir);
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,
506
 
+                                  !!flags->dlgt);
 
499
                                   au_ftest_rev(flags, DLGT));
507
500
        //rerr = -1;
508
501
        if (!rerr) {
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;
515
507
        struct vfsub_args vargs;
516
508
 
517
509
        LKTRTrace("i%lu, %.*s\n", dir->i_ino, AuDLNPair(dentry));
518
 
@@ -270,12 +273,13 @@ int aufs_unlink(struct inode *dir, struc
 
510
@@ -385,12 +388,13 @@ int aufs_unlink(struct inode *dir, struc
519
511
        dlgt = au_need_dlgt(sb);
520
512
        h_dentry = au_h_dptr(dentry);
521
513
        dget(h_dentry);
530
522
                //err = -1;
531
523
        } else {
532
524
                /* dir inode is locked */
533
 
@@ -308,7 +312,8 @@ int aufs_unlink(struct inode *dir, struc
534
 
                struct revert_flags rev_flags = {
535
 
                        .dlgt   = dlgt
536
 
                };
537
 
-               rerr = do_revert(err, wh_dentry, dentry, bwh, &dt, &rev_flags);
538
 
+               rerr = do_revert(err, wh_dentry, h_mnt, dentry, bwh, &dt,
539
 
+                                &rev_flags);
 
525
@@ -425,7 +429,7 @@ int aufs_unlink(struct inode *dir, struc
 
526
                rev_flags = 0;
 
527
                if (unlikely(dlgt))
 
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);
540
531
                if (rerr)
541
532
                        err = rerr;
542
533
        }
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;
548
539
 
549
540
        LKTRTrace("i%lu, %.*s\n", dir->i_ino, AuDLNPair(dentry));
550
541
        IMustLock(dir);
551
 
@@ -372,6 +378,7 @@ int aufs_rmdir(struct inode *dir, struct
 
542
@@ -489,6 +494,7 @@ int aufs_rmdir(struct inode *dir, struct
552
543
 
553
544
        h_dentry = au_h_dptr(dentry);
554
545
        dget(h_dentry);
556
547
 
557
548
        rmdir_later = 0;
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)
562
 
                };
563
 
-               rerr = do_revert(err, wh_dentry, dentry, bwh, &dt, &rev_flags);
564
 
+               rerr = do_revert(err, wh_dentry, h_mnt, dentry, bwh, &dt,
565
 
+                                &rev_flags);
 
550
@@ -537,7 +543,7 @@ int aufs_rmdir(struct inode *dir, struct
 
551
                rev_flags = 0;
 
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);
566
556
                if (rerr)
567
557
                        err = rerr;
568
558
        }
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;
581
 
 
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))
 
571
        unsigned int flags;
 
572
        unsigned int udba;
 
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),
593
583
                //err = -1;
594
584
        } else {
595
585
                bycpup = 1;
596
 
@@ -185,7 +187,7 @@ static int do_rename(struct inode *src_d
 
586
@@ -191,7 +193,7 @@ static int do_rename(struct inode *src_d
597
587
 
598
588
        /* remove whiteout for dentry */
599
589
        if (wh_dentry[DST]) {
602
592
                                          dentry, dir, /*dlgt*/0);
603
593
                //err = -1;
604
594
                if (unlikely(err))
605
 
@@ -254,8 +256,8 @@ static int do_rename(struct inode *src_d
 
595
@@ -262,8 +264,8 @@ static int do_rename(struct inode *src_d
606
596
                        vfsub_ign_hinode(&vargs, IN_MOVE_SELF,
607
597
                                         itohi(src_dentry->d_inode, a->btgt));
608
598
                rerr = vfsub_rename
613
603
                //rerr = -1;
614
604
                d_drop(d);
615
605
                dput(d);
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));
618
608
        } else {
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,
622
 
+                                   &vargs);
 
611
+               rerr = vfsub_unlink(h_dir[DST], a->h_dentry[DST], a->h_mnt, &vargs);
623
612
                //rerr = -1;
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);
633
622
                //rerr = -1;
634
623
                d_drop(d);
635
624
                dput(d);
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;
637
627
  out_whsrc:
638
628
        if (wh_dentry[SRC]) {
639
 
                LKTRLabel(here);
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);
643
632
                //rerr = -1;
644
633
                if (rerr)
645
 
@@ -531,6 +535,7 @@ int aufs_rename(struct inode *src_dir, s
646
 
                        goto out_children;
647
 
        }
648
 
 
 
634
@@ -639,6 +642,7 @@ int aufs_rename(struct inode *src_dir, s
 
635
        hgdir[SRC] = NULL;
 
636
        hgdir[DST] = NULL;
 
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
654
643
 
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);
659
 
        if (!p->a.issamedir)
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;
664
 
        if (p->a.isdir) {
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)) {
 
654
                hdir = NULL;
 
655
                if (unlikely(p->a.udba == AuUdba_INOTIFY))
 
656
                        hdir = itohi(p->a.parent[SRC]->d_inode, p->a.btgt);
 
657
                au_dtime_store
 
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,
 
660
                         hdir);
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
 
664
                                             p->a.btgt);
 
665
                        au_dtime_store
 
666
                                (p->dt[CHILD] + DST, dentry, p->a.h_dentry[DST],
 
667
-                                hdir);
 
668
+                                p->a.h_mnt, hdir);
673
669
                }
674
670
        }
675
671
 
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
 /* ---------------------------------------------------------------------- */
685
681
 
701
697
Index: fs/aufs/misc.h
702
698
===================================================================
703
699
RCS file: /cvsroot/aufs/aufs/fs/aufs/misc.h,v
704
 
retrieving revision 1.38
705
 
diff -u -p -r1.38 misc.h
706
 
--- fs/aufs/misc.h      12 Nov 2007 01:40:06 -0000      1.38
707
 
+++ fs/aufs/misc.h      26 Nov 2007 14:15:19 -0000
 
700
retrieving revision 1.40
 
701
diff -u -p -r1.40 misc.h
 
702
--- fs/aufs/misc.h      4 Feb 2008 04:22:46 -0000       1.40
 
703
+++ fs/aufs/misc.h      28 Feb 2008 13:46:00 -0000
708
704
@@ -201,7 +201,7 @@ int au_h_create(struct inode *h_dir, str
709
705
                int dlgt, struct nameidata *nd, struct vfsmount *nfsmnt);
710
706
 
717
713
Index: fs/aufs/plink.c
718
714
===================================================================
719
715
RCS file: /cvsroot/aufs/aufs/fs/aufs/plink.c,v
720
 
retrieving revision 1.16
721
 
diff -u -p -r1.16 plink.c
722
 
--- fs/aufs/plink.c     29 Oct 2007 04:41:10 -0000      1.16
723
 
+++ fs/aufs/plink.c     26 Nov 2007 14:15:19 -0000
724
 
@@ -119,8 +119,8 @@ struct dentry *au_lkup_plink(struct supe
 
716
retrieving revision 1.18
 
717
diff -u -p -r1.18 plink.c
 
718
--- fs/aufs/plink.c     18 Feb 2008 04:38:46 -0000      1.18
 
719
+++ fs/aufs/plink.c     28 Feb 2008 13:46:00 -0000
 
720
@@ -123,8 +123,8 @@ struct dentry *au_lkup_plink(struct supe
725
721
 }
726
722
 
727
723
 static int do_whplink(char *tgt, int len, struct dentry *h_parent,
730
726
+                     struct dentry *h_dentry, struct vfsmount *h_mnt,
731
727
+                     struct vfsmount *nfsmnt, struct super_block *sb)
732
728
 {
733
 
        int err;
 
729
        int err, dlgt;
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++;
745
741
        }
746
742
        dput(h_tgt);
747
 
@@ -160,6 +160,7 @@ struct do_whplink_args {
 
743
@@ -167,6 +167,7 @@ struct do_whplink_args {
748
744
        int len;
749
745
        struct dentry *h_parent;
750
746
        struct dentry *h_dentry;
752
748
        struct vfsmount *nfsmnt;
753
749
        struct super_block *sb;
754
750
 };
755
 
@@ -168,7 +169,7 @@ static void call_do_whplink(void *args)
 
751
@@ -175,7 +176,7 @@ static void call_do_whplink(void *args)
756
752
 {
757
753
        struct do_whplink_args *a = args;
758
754
        *a->errp = do_whplink(a->tgt, a->len, a->h_parent, a->h_dentry,
761
757
 }
762
758
 
763
759
 static int whplink(struct dentry *h_dentry, struct inode *inode,
764
 
@@ -198,6 +199,7 @@ static int whplink(struct dentry *h_dent
 
760
@@ -205,6 +206,7 @@ static int whplink(struct dentry *h_dent
765
761
                        .len            = len,
766
762
                        .h_parent       = h_parent,
767
763
                        .h_dentry       = h_dentry,
769
765
                        .nfsmnt         = au_do_nfsmnt(br->br_mnt),
770
766
                        .sb             = sb
771
767
                };
772
 
@@ -206,7 +208,7 @@ static int whplink(struct dentry *h_dent
 
768
@@ -213,7 +215,7 @@ static int whplink(struct dentry *h_dent
773
769
                        err = wkq_err;
774
770
        } else
775
771
                err = do_whplink(tgtname, len, h_parent, 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
 
785
 }
 
786
 
 
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)
 
790
 {
 
791
        int err;
 
792
 
 
793
@@ -111,7 +111,7 @@ int do_vfsub_symlink(struct inode *dir, 
 
794
                  dir->i_ino, AuDLNPair(dentry), symname, mode);
 
795
        IMustLock(dir);
 
796
 
 
797
-       err = vfs_symlink(dir, dentry, symname, mode);
 
798
+       err = vfs_symlink(dir, dentry, mnt, symname, mode);
 
799
        if (!err) {
 
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, 
 
803
        return err;
 
804
 }
 
805
 
 
806
-int do_vfsub_mknod(struct inode *dir, struct dentry *dentry, int mode,
 
807
-                  dev_t dev)
 
808
+int do_vfsub_mknod(struct inode *dir, struct dentry *dentry,
 
809
+                  struct vfsmount *mnt, int mode, dev_t dev)
 
810
 {
 
811
        int err;
 
812
 
 
813
        LKTRTrace("i%lu, %.*s, 0x%x\n", dir->i_ino, AuDLNPair(dentry), mode);
 
814
        IMustLock(dir);
 
815
 
 
816
-       err = vfs_mknod(dir, dentry, mode, dev);
 
817
+       err = vfs_mknod(dir, dentry, mnt, mode, dev);
 
818
        if (!err) {
 
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
 
822
        return err;
 
823
 }
 
824
 
 
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)
 
829
 {
 
830
        int err;
 
831
 
 
832
@@ -147,7 +147,7 @@ int do_vfsub_link(struct dentry *src_den
 
833
        IMustLock(dir);
 
834
 
 
835
        lockdep_off();
 
836
-       err = vfs_link(src_dentry, dir, dentry);
 
837
+       err = vfs_link(src_dentry, src_mnt, dir, dentry, mnt);
 
838
        lockdep_on();
 
839
        if (!err) {
 
840
                LKTRTrace("src_i %p, dst_i %p\n",
 
841
@@ -162,7 +162,9 @@ int do_vfsub_link(struct dentry *src_den
 
842
 }
 
843
 
 
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)
 
849
 {
 
850
        int err;
 
851
 
 
852
@@ -173,7 +175,7 @@ int do_vfsub_rename(struct inode *src_di
 
853
        IMustLock(src_dir);
 
854
 
 
855
        lockdep_off();
 
856
-       err = vfs_rename(src_dir, src_dentry, dir, dentry);
 
857
+       err = vfs_rename(src_dir, src_dentry, src_mnt, dir, dentry, mnt);
 
858
        lockdep_on();
 
859
        if (!err) {
 
860
                /* dir inode is locked */
 
861
@@ -184,14 +186,15 @@ int do_vfsub_rename(struct inode *src_di
 
862
        return err;
 
863
 }
 
864
 
 
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)
 
868
 {
 
869
        int err;
 
870
 
 
871
        LKTRTrace("i%lu, %.*s, 0x%x\n", dir->i_ino, AuDLNPair(dentry), mode);
 
872
        IMustLock(dir);
 
873
 
 
874
-       err = vfs_mkdir(dir, dentry, mode);
 
875
+       err = vfs_mkdir(dir, dentry, mnt, mode);
 
876
        if (!err) {
 
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
 
880
        return err;
 
881
 }
 
882
 
 
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)
 
886
 {
 
887
        int err;
 
888
 
 
889
@@ -208,7 +212,7 @@ int do_vfsub_rmdir(struct inode *dir, st
 
890
        IMustLock(dir);
 
891
 
 
892
        lockdep_off();
 
893
-       err = vfs_rmdir(dir, dentry);
 
894
+       err = vfs_rmdir(dir, dentry, mnt);
 
895
        lockdep_on();
 
896
        /* dir inode is locked */
 
897
        if (!err)
 
898
@@ -216,7 +220,8 @@ int do_vfsub_rmdir(struct inode *dir, st
 
899
        return err;
 
900
 }
 
901
 
 
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)
 
905
 {
 
906
        int err;
 
907
 
 
908
@@ -225,7 +230,7 @@ int do_vfsub_unlink(struct inode *dir, s
 
909
 
 
910
        /* vfs_unlink() locks inode */
 
911
        lockdep_off();
 
912
-       err = vfs_unlink(dir, dentry);
 
913
+       err = vfs_unlink(dir, dentry, mnt);
 
914
        lockdep_on();
 
915
        /* dir inode is locked */
 
916
        if (!err)
 
917
@@ -427,6 +432,7 @@ struct symlink_args {
789
918
        int *errp;
790
919
        struct inode *dir;
791
920
        struct dentry *dentry;
793
922
        const char *symname;
794
923
        int mode;
795
924
 };
796
 
@@ -163,20 +164,22 @@ struct symlink_args {
 
925
@@ -434,20 +440,22 @@ struct symlink_args {
797
926
 static void call_symlink(void *args)
798
927
 {
799
928
        struct symlink_args *a = args;
820
949
                        .symname        = symname,
821
950
                        .mode           = mode
822
951
                };
823
 
@@ -191,6 +194,7 @@ struct mknod_args {
 
952
@@ -462,6 +470,7 @@ struct mknod_args {
824
953
        int *errp;
825
954
        struct inode *dir;
826
955
        struct dentry *dentry;
828
957
        int mode;
829
958
        dev_t dev;
830
959
 };
831
 
@@ -198,20 +202,21 @@ struct mknod_args {
 
960
@@ -469,20 +478,21 @@ struct mknod_args {
832
961
 static void call_mknod(void *args)
833
962
 {
834
963
        struct mknod_args *a = args;
854
983
                        .mode   = mode,
855
984
                        .dev    = dev
856
985
                };
857
 
@@ -226,25 +231,28 @@ struct mkdir_args {
 
986
@@ -497,25 +507,28 @@ struct mkdir_args {
858
987
        int *errp;
859
988
        struct inode *dir;
860
989
        struct dentry *dentry;
886
1015
                        .mode   = mode
887
1016
                };
888
1017
                wkq_err = au_wkq_wait(call_mkdir, &args, /*dlgt*/1);
889
 
@@ -260,6 +268,7 @@ struct link_args {
 
1018
@@ -531,6 +544,7 @@ struct link_args {
890
1019
        int *errp;
891
1020
        struct inode *dir;
892
1021
        struct dentry *src_dentry, *dentry;
894
1023
 };
895
1024
 
896
1025
 static void call_link(void *args)
897
 
@@ -268,18 +277,21 @@ static void call_link(void *args)
 
1026
@@ -539,18 +553,21 @@ static void call_link(void *args)
898
1027
        *a->errp = do_vfsub_link(a->src_dentry, a->dir, a->dentry);
899
1028
 }
900
1029
 
920
1049
                };
921
1050
                wkq_err = au_wkq_wait(call_link, &args, /*dlgt*/1);
922
1051
                if (unlikely(wkq_err))
923
 
@@ -292,6 +304,7 @@ struct rename_args {
 
1052
@@ -563,6 +580,7 @@ struct rename_args {
924
1053
        int *errp;
925
1054
        struct inode *src_dir, *dir;
926
1055
        struct dentry *src_dentry, *dentry;
928
1057
        struct vfsub_args *vargs;
929
1058
 };
930
1059
 
931
 
@@ -299,21 +312,23 @@ static void call_rename(void *args)
 
1060
@@ -570,21 +588,24 @@ static void call_rename(void *args)
932
1061
 {
933
1062
        struct rename_args *a = args;
934
1063
        vfsub_ignore(a->vargs);
941
1070
 }
942
1071
 
943
1072
 int vfsub_rename(struct inode *src_dir, struct dentry *src_dentry,
944
 
-                struct inode *dir, struct dentry *dentry,
945
1073
+                struct vfsmount *src_mnt,
946
 
+                struct inode *dir, struct dentry *dentry, struct vfsmount *mnt,
 
1074
                 struct inode *dir, struct dentry *dentry,
 
1075
+                struct vfsmount *mnt,
947
1076
                 struct vfsub_args *vargs)
948
1077
 {
949
1078
        int err;
950
1079
 
951
 
        if (!vargs->dlgt) {
 
1080
        if (!vfsub_ftest(vargs->flags, DLGT)) {
952
1081
                vfsub_ignore(vargs);
953
1082
-               err = do_vfsub_rename(src_dir, src_dentry, dir, dentry);
954
1083
+               err = do_vfsub_rename(src_dir, src_dentry, src_mnt, dir, dentry,
956
1085
                if (unlikely(err))
957
1086
                        vfsub_unignore(vargs);
958
1087
        } else {
959
 
@@ -322,8 +337,10 @@ int vfsub_rename(struct inode *src_dir, 
 
1088
@@ -593,8 +614,10 @@ int vfsub_rename(struct inode *src_dir, 
960
1089
                        .errp           = &err,
961
1090
                        .src_dir        = src_dir,
962
1091
                        .src_dentry     = src_dentry,
967
1096
                        .vargs          = vargs
968
1097
                };
969
1098
                wkq_err = au_wkq_wait(call_rename, &args, /*dlgt*/1);
970
 
@@ -337,6 +354,7 @@ struct rmdir_args {
 
1099
@@ -608,6 +631,7 @@ struct rmdir_args {
971
1100
        int *errp;
972
1101
        struct inode *dir;
973
1102
        struct dentry *dentry;
975
1104
        struct vfsub_args *vargs;
976
1105
 };
977
1106
 
978
 
@@ -344,19 +362,19 @@ static void call_rmdir(void *args)
 
1107
@@ -615,19 +639,19 @@ static void call_rmdir(void *args)
979
1108
 {
980
1109
        struct rmdir_args *a = args;
981
1110
        vfsub_ignore(a->vargs);
991
1120
 {
992
1121
        int err;
993
1122
 
994
 
        if (!vargs->dlgt) {
 
1123
        if (!vfsub_ftest(vargs->flags, DLGT)) {
995
1124
                vfsub_ignore(vargs);
996
1125
-               err = do_vfsub_rmdir(dir, dentry);
997
1126
+               err = do_vfsub_rmdir(dir, dentry, mnt);
998
1127
                if (unlikely(err))
999
1128
                        vfsub_unignore(vargs);
1000
1129
        } else {
1001
 
@@ -365,6 +383,7 @@ int vfsub_rmdir(struct inode *dir, struc
 
1130
@@ -636,6 +660,7 @@ int vfsub_rmdir(struct inode *dir, struc
1002
1131
                        .errp   = &err,
1003
1132
                        .dir    = dir,
1004
1133
                        .dentry = dentry,
1006
1135
                        .vargs  = vargs
1007
1136
                };
1008
1137
                wkq_err = au_wkq_wait(call_rmdir, &args, /*dlgt*/1);
1009
 
@@ -762,6 +781,7 @@ struct au_vfsub_mkdir_args {
 
1138
@@ -1035,6 +1060,7 @@ struct au_vfsub_mkdir_args {
1010
1139
        int *errp;
1011
1140
        struct inode *dir;
1012
1141
        struct dentry *dentry;
1014
1143
        int mode;
1015
1144
        int dlgt;
1016
1145
 };
1017
 
@@ -769,11 +789,11 @@ struct au_vfsub_mkdir_args {
 
1146
@@ -1042,11 +1068,11 @@ struct au_vfsub_mkdir_args {
1018
1147
 static void au_call_vfsub_mkdir(void *args)
1019
1148
 {
1020
1149
        struct au_vfsub_mkdir_args *a = args;
1029
1158
 {
1030
1159
        int err, do_sio, wkq_err;
1031
1160
 
1032
 
@@ -781,12 +801,13 @@ int vfsub_sio_mkdir(struct inode *dir, s
 
1161
@@ -1054,12 +1080,13 @@ int vfsub_sio_mkdir(struct inode *dir, s
1033
1162
 
1034
1163
        do_sio = au_test_perm(dir, MAY_EXEC | MAY_WRITE, dlgt);
1035
1164
        if (!do_sio)
1044
1173
                        .mode   = mode,
1045
1174
                        .dlgt   = dlgt
1046
1175
                };
1047
 
@@ -803,16 +824,18 @@ struct au_vfsub_rmdir_args {
 
1176
@@ -1076,16 +1103,18 @@ struct au_vfsub_rmdir_args {
1048
1177
        int *errp;
1049
1178
        struct inode *dir;
1050
1179
        struct dentry *dentry;
1065
1194
 {
1066
1195
        int err, do_sio, wkq_err;
1067
1196
        struct vfsub_args vargs;
1068
 
@@ -822,12 +845,13 @@ int vfsub_sio_rmdir(struct inode *dir, s
 
1197
@@ -1095,12 +1124,13 @@ int vfsub_sio_rmdir(struct inode *dir, s
1069
1198
        vfsub_args_init(&vargs, /*ign*/NULL, dlgt, /*force_unlink*/0);
1070
1199
        do_sio = au_test_perm(dir, MAY_EXEC | MAY_WRITE, dlgt);
1071
1200
        if (!do_sio)
1080
1209
                        .vargs          = &vargs
1081
1210
                };
1082
1211
                wkq_err = au_wkq_wait(au_call_vfsub_rmdir, &args, /*dlgt*/0);
1083
 
@@ -844,6 +868,7 @@ int vfsub_sio_rmdir(struct inode *dir, s
 
1212
@@ -1117,6 +1147,7 @@ int vfsub_sio_rmdir(struct inode *dir, s
1084
1213
 struct notify_change_args {
1085
1214
        int *errp;
1086
1215
        struct dentry *h_dentry;
1088
1217
        struct iattr *ia;
1089
1218
        struct vfsub_args *vargs;
1090
1219
 };
1091
 
@@ -862,7 +887,7 @@ static void call_notify_change(void *arg
 
1220
@@ -1135,7 +1166,7 @@ static void call_notify_change(void *arg
1092
1221
        if (!IS_IMMUTABLE(h_inode) && !IS_APPEND(h_inode)) {
1093
1222
                vfsub_ignore(a->vargs);
1094
1223
                lockdep_off();
1097
1226
                lockdep_on();
1098
1227
                if (!*a->errp)
1099
1228
                        au_update_fuse_h_inode(NULL, a->h_dentry); /*ignore*/
1100
 
@@ -872,13 +897,14 @@ static void call_notify_change(void *arg
 
1229
@@ -1145,13 +1176,14 @@ static void call_notify_change(void *arg
1101
1230
        AuTraceErr(*a->errp);
1102
1231
 }
1103
1232
 
1114
1243
                .ia             = ia,
1115
1244
                .vargs          = vargs
1116
1245
        };
1117
 
@@ -906,6 +932,7 @@ struct unlink_args {
 
1246
@@ -1179,6 +1211,7 @@ struct unlink_args {
1118
1247
        int *errp;
1119
1248
        struct inode *dir;
1120
1249
        struct dentry *dentry;
1122
1251
        struct vfsub_args *vargs;
1123
1252
 };
1124
1253
 
1125
 
@@ -936,7 +963,7 @@ static void call_unlink(void *args)
 
1254
@@ -1209,7 +1242,7 @@ static void call_unlink(void *args)
1126
1255
                        err = -1;
1127
1256
        }
1128
1257
 #else
1131
1260
 #endif
1132
1261
 
1133
1262
        if (!stop_sillyrename)
1134
 
@@ -951,7 +978,7 @@ static void call_unlink(void *args)
 
1263
@@ -1224,7 +1257,7 @@ static void call_unlink(void *args)
1135
1264
  * @dir: must be locked.
1136
1265
  * @dentry: target dentry.
1137
1266
  */
1140
1269
                 struct vfsub_args *vargs)
1141
1270
 {
1142
1271
        int err;
1143
 
@@ -959,6 +986,7 @@ int vfsub_unlink(struct inode *dir, stru
 
1272
@@ -1232,6 +1265,7 @@ int vfsub_unlink(struct inode *dir, stru
1144
1273
                .errp   = &err,
1145
1274
                .dir    = dir,
1146
1275
                .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
1159
 
 
1160
 
 static inline
 
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)
1164
 
 {
1165
 
        int err;
1166
 
 
1167
 
@@ -345,7 +345,7 @@ int do_vfsub_symlink(struct inode *dir, 
1168
 
                  dir->i_ino, AuDLNPair(dentry), symname, mode);
1169
 
        IMustLock(dir);
1170
 
 
1171
 
-       err = vfs_symlink(dir, dentry, symname, mode);
1172
 
+       err = vfs_symlink(dir, dentry, mnt, symname, mode);
1173
 
        if (!err) {
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, 
1177
 
 }
1178
 
 
1179
 
 static inline
 
1291
-                    const char *symname, int mode);
1180
1292
-int do_vfsub_mknod(struct inode *dir, struct dentry *dentry, int mode,
1181
 
-                  dev_t dev)
 
1293
-                  dev_t dev);
 
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)
1184
 
 {
1185
 
        int err;
1186
 
 
1187
 
        LKTRTrace("i%lu, %.*s, 0x%x\n", dir->i_ino, AuDLNPair(dentry), mode);
1188
 
        IMustLock(dir);
1189
 
 
1190
 
-       err = vfs_mknod(dir, dentry, mode, dev);
1191
 
+       err = vfs_mknod(dir, dentry, mnt, mode, dev);
1192
 
        if (!err) {
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
1196
 
 }
1197
 
 
1198
 
 static inline
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)
1204
 
 {
1205
 
        int err;
1206
 
 
1207
 
@@ -383,7 +384,7 @@ int do_vfsub_link(struct dentry *src_den
1208
 
        IMustLock(dir);
1209
 
 
1210
 
        lockdep_off();
1211
 
-       err = vfs_link(src_dentry, dir, dentry);
1212
 
+       err = vfs_link(src_dentry, src_mnt, dir, dentry, mnt);
1213
 
        lockdep_on();
1214
 
        if (!err) {
1215
 
                LKTRTrace("src_i %p, dst_i %p\n",
1216
 
@@ -399,7 +400,9 @@ int do_vfsub_link(struct dentry *src_den
1217
 
 
1218
 
 static inline
 
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)
1224
 
 {
1225
 
        int err;
1226
 
 
1227
 
@@ -410,7 +413,7 @@ int do_vfsub_rename(struct inode *src_di
1228
 
        IMustLock(src_dir);
1229
 
 
1230
 
        lockdep_off();
1231
 
-       err = vfs_rename(src_dir, src_dentry, dir, dentry);
1232
 
+       err = vfs_rename(src_dir, src_dentry, src_mnt, dir, dentry, mnt);
1233
 
        lockdep_on();
1234
 
        if (!err) {
1235
 
                /* dir inode is locked */
1236
 
@@ -422,14 +425,15 @@ int do_vfsub_rename(struct inode *src_di
1237
 
 }
1238
 
 
1239
 
 static inline
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)
1243
 
 {
1244
 
        int err;
1245
 
 
1246
 
        LKTRTrace("i%lu, %.*s, 0x%x\n", dir->i_ino, AuDLNPair(dentry), mode);
1247
 
        IMustLock(dir);
1248
 
 
1249
 
-       err = vfs_mkdir(dir, dentry, mode);
1250
 
+       err = vfs_mkdir(dir, dentry, mnt, mode);
1251
 
        if (!err) {
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
1255
 
        return err;
1256
 
 }
1257
 
 
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)
1261
 
 {
1262
 
        int err;
1263
 
 
1264
 
@@ -446,7 +451,7 @@ static inline int do_vfsub_rmdir(struct 
1265
 
        IMustLock(dir);
1266
 
 
1267
 
        lockdep_off();
1268
 
-       err = vfs_rmdir(dir, dentry);
1269
 
+       err = vfs_rmdir(dir, dentry, mnt);
1270
 
        lockdep_on();
1271
 
        /* dir inode is locked */
1272
 
        if (!err)
1273
 
@@ -454,7 +459,8 @@ static inline int do_vfsub_rmdir(struct 
1274
 
        return err;
1275
 
 }
1276
 
 
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)
1280
 
 {
1281
 
        int err;
1282
 
 
1283
 
@@ -463,7 +469,7 @@ static inline int do_vfsub_unlink(struct
1284
 
 
1285
 
        /* vfs_unlink() locks inode */
1286
 
        lockdep_off();
1287
 
-       err = vfs_unlink(dir, dentry);
1288
 
+       err = vfs_unlink(dir, dentry, mnt);
1289
 
        lockdep_on();
1290
 
        /* dir inode is locked */
1291
 
        if (!err)
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);
 
1316
 
 
1317
 /* ---------------------------------------------------------------------- */
 
1318
 
 
1319
@@ -464,54 +470,57 @@ int vfsub_create(struct inode *dir, stru
1293
1320
 }
1294
1321
 
1295
1322
 static inline
1362
1389
        if (unlikely(err))
1363
1390
                vfsub_unignore(vargs);
1364
1391
        return err;
1365
 
@@ -819,15 +828,16 @@ static inline int vfsub_getattr(struct v
 
1392
@@ -594,15 +603,16 @@ static inline int vfsub_getattr(struct v
1366
1393
 
1367
1394
 /* ---------------------------------------------------------------------- */
1368
1395
 
1388
1415
Index: fs/aufs/wbr_policy.c
1389
1416
===================================================================
1390
1417
RCS file: /cvsroot/aufs/aufs/fs/aufs/wbr_policy.c,v
1391
 
retrieving revision 1.5
1392
 
diff -u -p -r1.5 wbr_policy.c
1393
 
--- fs/aufs/wbr_policy.c        26 Nov 2007 01:34:50 -0000      1.5
1394
 
+++ fs/aufs/wbr_policy.c        26 Nov 2007 14:15:19 -0000
 
1418
retrieving revision 1.7
 
1419
diff -u -p -r1.7 wbr_policy.c
 
1420
--- fs/aufs/wbr_policy.c        18 Feb 2008 04:41:06 -0000      1.7
 
1421
+++ fs/aufs/wbr_policy.c        28 Feb 2008 13:46:00 -0000
1395
1422
@@ -21,7 +21,8 @@
1396
1423
 #include <linux/statfs.h>
1397
1424
 #include "aufs.h"
1427
1454
 
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))
1433
1460
                goto out;
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,
 
1465
-                             dlgt);
 
1466
+       err = vfsub_sio_mkdir(h_dir, h_dentry, h_mnt,
 
1467
+                             S_IRWXU | S_IRUGO | S_IXUGO, dlgt);
1439
1468
        if (unlikely(err))
1440
1469
                goto out_put;
1441
1470
 
1442
 
@@ -112,7 +115,7 @@ static int au_cpdown_dir(struct dentry *
 
1471
@@ -113,7 +116,7 @@ static int au_cpdown_dir(struct dentry *
1443
1472
                diropq = 1;
1444
1473
        }
1445
1474
 
1448
1477
        vfsub_i_unlock(h_inode);
1449
1478
        if (unlikely(err))
1450
1479
                goto out_opq;
1451
 
@@ -125,8 +128,8 @@ static int au_cpdown_dir(struct dentry *
 
1480
@@ -126,8 +129,8 @@ static int au_cpdown_dir(struct dentry *
1452
1481
                        goto out_opq;
1453
1482
                err = 0;
1454
1483
                if (wh_dentry->d_inode)
1459
1488
                dput(wh_dentry);
1460
1489
                if (unlikely(err))
1461
1490
                        goto out_opq;
1462
 
@@ -153,7 +156,7 @@ static int au_cpdown_dir(struct dentry *
 
1491
@@ -154,7 +157,7 @@ static int au_cpdown_dir(struct dentry *
1463
1492
        }
1464
1493
  out_dir:
1465
1494
        if (made_dir) {
1471
1500
Index: fs/aufs/whout.c
1472
1501
===================================================================
1473
1502
RCS file: /cvsroot/aufs/aufs/fs/aufs/whout.c,v
1474
 
retrieving revision 1.29
1475
 
diff -u -p -r1.29 whout.c
1476
 
--- fs/aufs/whout.c     12 Nov 2007 01:43:10 -0000      1.29
1477
 
+++ fs/aufs/whout.c     26 Nov 2007 14:15:19 -0000
 
1503
retrieving revision 1.32
 
1504
diff -u -p -r1.32 whout.c
 
1505
--- fs/aufs/whout.c     18 Feb 2008 04:41:17 -0000      1.32
 
1506
+++ fs/aufs/whout.c     28 Feb 2008 13:46:00 -0000
1478
1507
@@ -219,6 +219,7 @@ int rename_whtmp(struct inode *dir, stru
1479
1508
        struct dentry *h_dentry, *h_parent, *tmp_dentry;
1480
1509
        struct super_block *sb;
1482
1511
+       struct vfsmount *h_mnt;
1483
1512
        struct vfsub_args vargs;
1484
1513
        struct aufs_ndx ndx = {
1485
 
                .nd     = NULL,
1486
 
@@ -240,13 +241,15 @@ int rename_whtmp(struct inode *dir, stru
 
1514
                .flags  = 0,
 
1515
@@ -243,13 +244,15 @@ int rename_whtmp(struct inode *dir, stru
1487
1516
        err = PTR_ERR(tmp_dentry);
1488
1517
        if (!IS_ERR(tmp_dentry)) {
1489
1518
                /* under the same dir, no need to lock_rename() */
1490
1519
+               h_mnt = sbr_mnt(sb, bindex);
1491
 
                vfsub_args_init(&vargs, &ign, ndx.dlgt, 0);
 
1520
                vfsub_args_init(&vargs, &ign, dlgt, 0);
1492
1521
                AuDebugOn(!S_ISDIR(dentry->d_inode->i_mode));
1493
1522
                if (unlikely(au_flag_test_udba_inotify(sb)
1494
1523
                             && !noself))
1500
1529
                //if (LktrCond) err = -1; //unavailable
1501
1530
                AuTraceErr(err);
1502
1531
                dput(tmp_dentry);
1503
 
@@ -259,7 +262,7 @@ int rename_whtmp(struct inode *dir, stru
 
1532
@@ -262,7 +265,7 @@ int rename_whtmp(struct inode *dir, stru
1504
1533
 /* ---------------------------------------------------------------------- */
1505
1534
 
1506
1535
 static int do_unlink_wh(struct inode *h_dir, struct dentry *wh_dentry,
1509
1538
 {
1510
1539
        struct vfsub_args vargs;
1511
1540
 
1512
 
@@ -274,11 +277,12 @@ static int do_unlink_wh(struct inode *h_
 
1541
@@ -277,11 +280,12 @@ static int do_unlink_wh(struct inode *h_
1513
1542
        vfsub_args_init(&vargs, NULL, dlgt,
1514
1543
                        (h_dir->i_mode & S_ISVTX)
1515
1544
                        && wh_dentry->d_inode->i_uid != current->fsuid);
1524
1553
 {
1525
1554
        int err;
1526
1555
 
1527
 
@@ -288,7 +292,7 @@ int au_unlink_wh_dentry(struct inode *h_
 
1556
@@ -291,7 +295,7 @@ int au_unlink_wh_dentry(struct inode *h_
1528
1557
                  || !wh_dentry->d_inode
1529
1558
                  || !S_ISREG(wh_dentry->d_inode->i_mode));
1530
1559
 
1533
1562
        //if (LktrCond) err = -1; // unavailable
1534
1563
        if (!err && dentry)
1535
1564
                set_dbwh(dentry, -1);
1536
 
@@ -298,7 +302,8 @@ int au_unlink_wh_dentry(struct inode *h_
 
1565
@@ -301,7 +305,8 @@ int au_unlink_wh_dentry(struct inode *h_
1537
1566
 }
1538
1567
 
1539
1568
 static int unlink_wh_name(struct dentry *h_parent, struct qstr *wh,
1543
1572
 {
1544
1573
        int err;
1545
1574
        struct inode *h_dir;
1546
 
@@ -314,7 +319,8 @@ static int unlink_wh_name(struct dentry 
 
1575
@@ -317,7 +322,7 @@ static int unlink_wh_name(struct dentry 
1547
1576
                err = 0;
1548
1577
                if (h_dentry->d_inode
1549
1578
                    && S_ISREG(h_dentry->d_inode->i_mode))
1550
 
-                       err = do_unlink_wh(h_dir, h_dentry, dir, ndx->dlgt);
 
1579
-                       err = do_unlink_wh(h_dir, h_dentry, dir,
1551
1580
+                       err = do_unlink_wh(h_dir, h_dentry, h_mnt, dir,
1552
 
+                                          ndx->dlgt);
 
1581
                                           au_ftest_ndx(ndx->flags, DLGT));
1553
1582
                dput(h_dentry);
1554
1583
        } else
1555
 
                err = PTR_ERR(h_dentry);
1556
 
@@ -325,7 +331,8 @@ static int unlink_wh_name(struct dentry 
 
1584
@@ -329,7 +334,8 @@ static int unlink_wh_name(struct dentry 
1557
1585
 
1558
1586
 /* ---------------------------------------------------------------------- */
1559
1587
 
1563
1591
 {
1564
1592
        int err;
1565
1593
        struct vfsub_args vargs;
1566
 
@@ -334,14 +341,15 @@ static void clean_wh(struct inode *h_dir
 
1594
@@ -338,14 +344,15 @@ static void clean_wh(struct inode *h_dir
1567
1595
 
1568
1596
        if (wh->d_inode) {
1569
1597
                vfsub_args_init(&vargs, NULL, 0, 0);
1581
1609
 {
1582
1610
        int err;
1583
1611
        struct vfsub_args vargs;
1584
 
@@ -350,7 +358,7 @@ static void clean_plink(struct inode *h_
 
1612
@@ -354,7 +361,7 @@ static void clean_plink(struct inode *h_
1585
1613
 
1586
1614
        if (plink->d_inode) {
1587
1615
                vfsub_args_init(&vargs, NULL, 0, 0);
1590
1618
                if (unlikely(err))
1591
1619
                        AuWarn("failed rmdir %.*s (%d), ignored.\n",
1592
1620
                               AuDLNPair(plink), err);
1593
 
@@ -364,7 +372,8 @@ static int test_linkable(struct inode *h
 
1621
@@ -368,7 +375,8 @@ static int test_linkable(struct inode *h
1594
1622
        return -ENOSYS;
1595
1623
 }
1596
1624
 
1600
1628
 {
1601
1629
        int err;
1602
1630
 
1603
 
@@ -373,7 +382,7 @@ static int plink_dir(struct inode *h_dir
 
1631
@@ -377,7 +385,7 @@ static int plink_dir(struct inode *h_dir
1604
1632
                int mode = S_IRWXU;
1605
1633
                if (unlikely(au_test_nfs(plink->d_sb)))
1606
1634
                        mode |= S_IXUGO;
1609
1637
        } else if (S_ISDIR(plink->d_inode->i_mode))
1610
1638
                err = 0;
1611
1639
        else
1612
 
@@ -439,23 +448,23 @@ int init_wh(struct dentry *h_root, struc
 
1640
@@ -443,23 +451,23 @@ int init_wh(struct dentry *h_root, struc
1613
1641
        case AuBr_RO:
1614
1642
        case AuBr_RRWH:
1615
1643
        case AuBr_ROWH:
1638
1666
                break;
1639
1667
 
1640
1668
        case AuBr_RW:
1641
 
@@ -484,12 +493,12 @@ int init_wh(struct dentry *h_root, struc
 
1669
@@ -488,12 +496,12 @@ int init_wh(struct dentry *h_root, struc
1642
1670
                        goto out_err;
1643
1671
 
1644
1672
                if (do_plink) {
1653
1681
                br->br_wh = dget(wh);
1654
1682
                break;
1655
1683
 
1656
 
@@ -547,7 +556,7 @@ static void reinit_br_wh(void *arg)
1657
 
        vfsub_args_init(&vargs, NULL, /*dlgt*/0, 0);
1658
 
        hdir_lock(h_dir, dir, bindex);
 
1684
@@ -554,7 +562,7 @@ static void reinit_br_wh(void *arg)
 
1685
        revalidate h_wh
 
1686
 #endif
1659
1687
        br_wh_write_lock(a->br);
1660
1688
-       err = vfsub_unlink(h_dir, a->br->br_wh, &vargs);
1661
1689
+       err = vfsub_unlink(h_dir, a->br->br_wh, a->br->br_mnt, &vargs);
1662
1690
        //if (LktrCond) err = -1;
1663
1691
        dput(a->br->br_wh);
1664
1692
        a->br->br_wh = NULL;
1665
 
@@ -621,7 +630,8 @@ static int link_or_create_wh(struct dent
 
1693
@@ -628,7 +636,8 @@ static int link_or_create_wh(struct dent
1666
1694
        br = stobr(sb, bindex);
1667
1695
        br_wh_read_lock(br);
1668
1696
        if (br->br_wh) {
1672
1700
                if (!err || err != -EMLINK)
1673
1701
                        goto out;
1674
1702
 
1675
 
@@ -685,8 +695,8 @@ static struct dentry *do_diropq(struct d
 
1703
@@ -697,7 +706,8 @@ static struct dentry *do_diropq(struct d
1676
1704
        } else {
1677
1705
                AuDebugOn(/* !S_ISDIR(dentry->d_inode->i_mode)
1678
1706
                           * ||  */!opq_dentry->d_inode);
1679
 
-               err = do_unlink_wh(h_dir, opq_dentry, dentry->d_inode,
1680
 
-                                  ndx.dlgt);
 
1707
-               err = do_unlink_wh(h_dir, opq_dentry, dentry->d_inode, dlgt);
1681
1708
+               err = do_unlink_wh(h_dir, opq_dentry, sbr_mnt(sb, bindex),
1682
 
+                                  dentry->d_inode, ndx.dlgt);
 
1709
+                                  dentry->d_inode, dlgt);
1683
1710
                //if (LktrCond) err = -1;
1684
1711
                if (!err)
1685
1712
                        set_dbdiropq(dentry, -1);
1686
 
@@ -817,6 +827,7 @@ static int del_wh_children(struct aufs_n
 
1713
@@ -829,6 +839,7 @@ static int del_wh_children(struct aufs_n
1687
1714
        struct aufs_wh *tpos;
1688
1715
        struct hlist_node *pos;
1689
1716
        struct aufs_destr *str;
1691
1718
 
1692
1719
        LKTRTrace("%.*s\n", AuDLNPair(h_parent));
1693
1720
        h_dir = h_parent->d_inode;
1694
 
@@ -834,6 +845,7 @@ static int del_wh_children(struct aufs_n
 
1721
@@ -846,6 +857,7 @@ static int del_wh_children(struct aufs_n
1695
1722
 
1696
1723
        /* already checked by au_test_perm(). */
1697
1724
        err = 0;
1699
1726
        for (i = 0; !err && i < AuSize_NHASH; i++) {
1700
1727
                head = whlist->heads + i;
1701
1728
                hlist_for_each_entry(tpos, pos, head, wh_hash) {
1702
 
@@ -843,8 +855,8 @@ static int del_wh_children(struct aufs_n
 
1729
@@ -855,8 +867,8 @@ static int del_wh_children(struct aufs_n
1703
1730
                        if (str->len + AUFS_WH_PFX_LEN <= PATH_MAX) {
1704
1731
                                memcpy(p, str->name, str->len);
1705
1732
                                wh_name.len = AUFS_WH_PFX_LEN + str->len;
1710
1737
                                //if (LktrCond) err = -1;
1711
1738
                                if (!err)
1712
1739
                                        continue;
1713
 
@@ -946,7 +958,7 @@ int rmdir_whtmp(struct dentry *h_dentry,
 
1740
@@ -961,7 +973,7 @@ int rmdir_whtmp(struct dentry *h_dentry,
1714
1741
                             && !noself))
1715
1742
                        vfsub_ign_hinode(&vargs, IN_DELETE_SELF,
1716
1743
                                         itohi(inode, bindex));
1722
1749
Index: fs/aufs/whout.h
1723
1750
===================================================================
1724
1751
RCS file: /cvsroot/aufs/aufs/fs/aufs/whout.h,v
1725
 
retrieving revision 1.13
1726
 
diff -u -p -r1.13 whout.h
1727
 
--- fs/aufs/whout.h     1 Oct 2007 04:48:51 -0000       1.13
1728
 
+++ fs/aufs/whout.h     26 Nov 2007 14:15:19 -0000
 
1752
retrieving revision 1.15
 
1753
diff -u -p -r1.15 whout.h
 
1754
--- fs/aufs/whout.h     24 Feb 2008 23:47:47 -0000      1.15
 
1755
+++ fs/aufs/whout.h     28 Feb 2008 13:46:00 -0000
1729
1756
@@ -39,7 +39,8 @@ struct dentry *lkup_whtmp(struct dentry 
1730
1757
 int rename_whtmp(struct inode *dir, struct dentry *dentry, aufs_bindex_t bindex,
1731
1758
                 int noself);
1739
1766
Index: fs/aufs/xino.c
1740
1767
===================================================================
1741
1768
RCS file: /cvsroot/aufs/aufs/fs/aufs/xino.c,v
1742
 
retrieving revision 1.45
1743
 
diff -u -p -r1.45 xino.c
1744
 
--- fs/aufs/xino.c      29 Oct 2007 04:44:59 -0000      1.45
1745
 
+++ fs/aufs/xino.c      26 Nov 2007 14:15:19 -0000
1746
 
@@ -430,7 +430,7 @@ struct file *xino_create(struct super_bl
 
1769
retrieving revision 1.50
 
1770
diff -u -p -r1.50 xino.c
 
1771
--- fs/aufs/xino.c      24 Feb 2008 23:47:47 -0000      1.50
 
1772
+++ fs/aufs/xino.c      28 Feb 2008 13:46:00 -0000
 
1773
@@ -512,7 +512,7 @@ struct file *xino_create(struct super_bl
1747
1774
        h_dir = h_parent->d_inode;
1748
1775
        vfsub_args_init(&vargs, NULL, 0, 0);
1749
1776
        vfsub_i_lock_nested(h_dir, AuLsc_I_PARENT);
1752
1779
        vfsub_i_unlock(h_dir);
1753
1780
        dput(h_parent);
1754
1781
        if (unlikely(err)) {
1755
 
@@ -521,7 +521,7 @@ static struct file *xino_create2(struct 
 
1782
@@ -603,7 +603,7 @@ static struct file *xino_create2(struct 
1756
1783
                goto out_dput;
1757
1784
        }
1758
1785
        vfsub_args_init(&vargs, NULL, 0, 0);
1761
1788
        //if (LktrCond) err = -1;
1762
1789
        if (unlikely(err)) {
1763
1790
                AuErr("%.*s unlink err %d\n", AuLNPair(name), err);
1764
 
@@ -530,7 +530,8 @@ static struct file *xino_create2(struct 
 
1791
@@ -612,7 +612,8 @@ static struct file *xino_create2(struct 
1765
1792
 
1766
 
        if (unlikely(copy_src)) {
 
1793
        if (copy_src) {
1767
1794
                inode = copy_src->f_dentry->d_inode;
1768
1795
-               err = au_copy_file(file, copy_src, i_size_read(inode), sb);
1769
1796
+               err = au_copy_file(file, copy_src, i_size_read(inode), sb,
1771
1798
                if (unlikely(err)) {
1772
1799
                        AuErr("%.*s copy err %d\n", AuLNPair(name), err);
1773
1800
                        goto out_fput;
 
1801
 
 
1802