Whamcloud - gitweb
file loop-sync-2.4.21-suse.patch was initially added on branch b1_2_smallfix.
[fs/lustre-release.git] / lustre / kernel_patches / patches / vfs_nointent-2.6-suse.patch
1  0 files changed
2
3 .old..........pc/vfs_nointent_2.6.0-suse/fs/namei.c
4 .new.........fs/namei.c
5 Index: linux-2.6.4-51.0/fs/namei.c
6 ===================================================================
7 --- linux-2.6.4-51.0.orig/fs/namei.c    2004-04-05 17:36:42.000000000 -0400
8 +++ linux-2.6.4-51.0/fs/namei.c 2004-04-05 17:36:43.000000000 -0400
9 @@ -1276,7 +1276,7 @@
10                 if (!error) {
11                         DQUOT_INIT(inode);
12                         
13 -                       error = do_truncate(dentry, 0);
14 +                       error = do_truncate(dentry, 0, 1);
15                 }
16                 put_write_access(inode);
17                 if (error)
18 @@ -1526,6 +1526,7 @@
19         char * tmp;
20         struct dentry * dentry;
21         struct nameidata nd;
22 +       intent_init(&nd.intent, IT_LOOKUP);
23  
24         if (S_ISDIR(mode))
25                 return -EPERM;
26 @@ -1536,6 +1537,15 @@
27         error = path_lookup(tmp, LOOKUP_PARENT, &nd);
28         if (error)
29                 goto out;
30 +
31 +       if (nd.dentry->d_inode->i_op->mknod_raw) {
32 +               struct inode_operations *op = nd.dentry->d_inode->i_op;
33 +               error = op->mknod_raw(&nd, mode, dev);
34 +               /* the file system wants to use normal vfs path now */
35 +               if (error != -EOPNOTSUPP)
36 +                       goto out2;
37 +       }
38 +
39         dentry = lookup_create(&nd, 0);
40         error = PTR_ERR(dentry);
41  
42 @@ -1562,6 +1572,7 @@
43                 dput(dentry);
44         }
45         up(&nd.dentry->d_inode->i_sem);
46 +out2:
47         path_release(&nd);
48  out:
49         putname(tmp);
50 @@ -1603,10 +1614,18 @@
51         if (!IS_ERR(tmp)) {
52                 struct dentry *dentry;
53                 struct nameidata nd;
54 +                intent_init(&nd.intent, IT_LOOKUP);
55  
56                 error = path_lookup(tmp, LOOKUP_PARENT, &nd);
57                 if (error)
58                         goto out;
59 +               if (nd.dentry->d_inode->i_op->mkdir_raw) {
60 +                       struct inode_operations *op = nd.dentry->d_inode->i_op;
61 +                       error = op->mkdir_raw(&nd, mode);
62 +                       /* the file system wants to use normal vfs path now */
63 +                       if (error != -EOPNOTSUPP)
64 +                               goto out2;
65 +               }
66                 dentry = lookup_create(&nd, 1);
67                 error = PTR_ERR(dentry);
68                 if (!IS_ERR(dentry)) {
69 @@ -1616,6 +1635,7 @@
70                         dput(dentry);
71                 }
72                 up(&nd.dentry->d_inode->i_sem);
73 +out2:
74                 path_release(&nd);
75  out:
76                 putname(tmp);
77 @@ -1696,6 +1716,7 @@
78         char * name;
79         struct dentry *dentry;
80         struct nameidata nd;
81 +        intent_init(&nd.intent, IT_LOOKUP);
82  
83         name = getname(pathname);
84         if(IS_ERR(name))
85 @@ -1716,6 +1737,14 @@
86                         error = -EBUSY;
87                         goto exit1;
88         }
89 +       if (nd.dentry->d_inode->i_op->rmdir_raw) {
90 +               struct inode_operations *op = nd.dentry->d_inode->i_op;
91 +
92 +               error = op->rmdir_raw(&nd);
93 +               /* the file system wants to use normal vfs path now */
94 +               if (error != -EOPNOTSUPP)
95 +                       goto exit1;
96 +       }
97         down(&nd.dentry->d_inode->i_sem);
98         dentry = lookup_hash(&nd.last, nd.dentry);
99         error = PTR_ERR(dentry);
100 @@ -1774,6 +1805,7 @@
101         struct dentry *dentry;
102         struct nameidata nd;
103         struct inode *inode = NULL;
104 +        intent_init(&nd.intent, IT_LOOKUP);
105  
106         name = getname(pathname);
107         if(IS_ERR(name))
108 @@ -1785,6 +1817,13 @@
109         error = -EISDIR;
110         if (nd.last_type != LAST_NORM)
111                 goto exit1;
112 +       if (nd.dentry->d_inode->i_op->unlink_raw) {
113 +               struct inode_operations *op = nd.dentry->d_inode->i_op;
114 +               error = op->unlink_raw(&nd);
115 +               /* the file system wants to use normal vfs path now */
116 +               if (error != -EOPNOTSUPP)
117 +                       goto exit1;
118 +       }
119         down(&nd.dentry->d_inode->i_sem);
120         dentry = lookup_hash(&nd.last, nd.dentry);
121         error = PTR_ERR(dentry);
122 @@ -1852,10 +1891,18 @@
123         if (!IS_ERR(to)) {
124                 struct dentry *dentry;
125                 struct nameidata nd;
126 +                intent_init(&nd.intent, IT_LOOKUP);
127  
128                 error = path_lookup(to, LOOKUP_PARENT, &nd);
129                 if (error)
130                         goto out;
131 +               if (nd.dentry->d_inode->i_op->symlink_raw) {
132 +                       struct inode_operations *op = nd.dentry->d_inode->i_op;
133 +                       error = op->symlink_raw(&nd, from);
134 +                       /* the file system wants to use normal vfs path now */
135 +                       if (error != -EOPNOTSUPP)
136 +                               goto out2;
137 +               }
138                 dentry = lookup_create(&nd, 0);
139                 error = PTR_ERR(dentry);
140                 if (!IS_ERR(dentry)) {
141 @@ -1863,6 +1910,7 @@
142                         dput(dentry);
143                 }
144                 up(&nd.dentry->d_inode->i_sem);
145 +out2:
146                 path_release(&nd);
147  out:
148                 putname(to);
149 @@ -1926,6 +1974,8 @@
150         struct nameidata nd, old_nd;
151         int error;
152         char * to;
153 +        intent_init(&nd.intent, IT_LOOKUP);
154 +        intent_init(&old_nd.intent, IT_LOOKUP);
155  
156         to = getname(newname);
157         if (IS_ERR(to))
158 @@ -1940,6 +1990,13 @@
159         error = -EXDEV;
160         if (old_nd.mnt != nd.mnt)
161                 goto out_release;
162 +        if (nd.dentry->d_inode->i_op->link_raw) {
163 +                struct inode_operations *op = nd.dentry->d_inode->i_op;
164 +                error = op->link_raw(&old_nd, &nd);
165 +                /* the file system wants to use normal vfs path now */
166 +                if (error != -EOPNOTSUPP)
167 +                        goto out_release;
168 +        }
169         new_dentry = lookup_create(&nd, 0);
170         error = PTR_ERR(new_dentry);
171         if (!IS_ERR(new_dentry)) {
172 @@ -1990,7 +2047,7 @@
173   *        locking].
174   */
175  int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
176 -              struct inode *new_dir, struct dentry *new_dentry)
177 +                   struct inode *new_dir, struct dentry *new_dentry)
178  {
179         int error = 0;
180         struct inode *target;
181 @@ -2035,7 +2092,7 @@
182  }
183  
184  int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,
185 -              struct inode *new_dir, struct dentry *new_dentry)
186 +                     struct inode *new_dir, struct dentry *new_dentry)
187  {
188         struct inode *target;
189         int error;
190 @@ -2112,6 +2169,8 @@
191         struct dentry * old_dentry, *new_dentry;
192         struct dentry * trap;
193         struct nameidata oldnd, newnd;
194 +        intent_init(&oldnd.intent, IT_LOOKUP);
195 +        intent_init(&newnd.intent, IT_LOOKUP);
196  
197         error = path_lookup(oldname, LOOKUP_PARENT, &oldnd);
198         if (error)
199 @@ -2134,6 +2193,13 @@
200         if (newnd.last_type != LAST_NORM)
201                 goto exit2;
202  
203 +       if (old_dir->d_inode->i_op->rename_raw) {
204 +               error = old_dir->d_inode->i_op->rename_raw(&oldnd, &newnd);
205 +               /* the file system wants to use normal vfs path now */
206 +               if (error != -EOPNOTSUPP)
207 +                       goto exit2;
208 +       }
209 +
210         trap = lock_rename(new_dir, old_dir);
211  
212         old_dentry = lookup_hash(&oldnd.last, old_dir);
213 @@ -2165,8 +2231,7 @@
214         if (new_dentry == trap)
215                 goto exit5;
216  
217 -       error = vfs_rename(old_dir->d_inode, old_dentry,
218 -                                  new_dir->d_inode, new_dentry);
219 +       error = vfs_rename(old_dir->d_inode, old_dentry, new_dir->d_inode, new_dentry);
220  exit5:
221         dput(new_dentry);
222  exit4:
223 Index: linux-2.6.4-51.0/fs/open.c
224 ===================================================================
225 --- linux-2.6.4-51.0.orig/fs/open.c     2004-04-05 17:36:42.000000000 -0400
226 +++ linux-2.6.4-51.0/fs/open.c  2004-04-06 01:37:39.000000000 -0400
227 @@ -187,9 +187,10 @@
228         return error;
229  }
230  
231 -int do_truncate(struct dentry *dentry, loff_t length)
232 +int do_truncate(struct dentry *dentry, loff_t length, int called_from_open)
233  {
234         int err;
235 +       struct inode_operations *op = dentry->d_inode->i_op;
236         struct iattr newattrs;
237  
238         /* Not pretty: "inode->i_size" shouldn't really be signed. But it is. */
239 @@ -200,7 +201,14 @@
240         newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
241         down(&dentry->d_inode->i_sem);
242         down_write(&dentry->d_inode->i_alloc_sem);
243 -       err = notify_change(dentry, &newattrs);
244 +       if (called_from_open)
245 +               newattrs.ia_valid |= ATTR_FROM_OPEN;
246 +       if (op->setattr_raw) {
247 +               newattrs.ia_valid |= ATTR_RAW;
248 +               newattrs.ia_ctime = CURRENT_TIME;
249 +               err = op->setattr_raw(dentry->d_inode, &newattrs);
250 +       } else
251 +               err = notify_change(dentry, &newattrs);
252         up_write(&dentry->d_inode->i_alloc_sem);
253         up(&dentry->d_inode->i_sem);
254         return err;
255 @@ -256,7 +264,7 @@
256         error = locks_verify_truncate(inode, NULL, length);
257         if (!error) {
258                 DQUOT_INIT(inode);
259 -               error = do_truncate(nd.dentry, length);
260 +               error = do_truncate(nd.dentry, length, 0);
261         }
262         put_write_access(inode);
263  
264 @@ -308,7 +316,7 @@
265  
266         error = locks_verify_truncate(inode, file, length);
267         if (!error)
268 -               error = do_truncate(dentry, length);
269 +               error = do_truncate(dentry, length, 0);
270  out_putf:
271         fput(file);
272  out:
273 @@ -387,9 +395,19 @@
274                     (error = permission(inode,MAY_WRITE,&nd)) != 0)
275                         goto dput_and_out;
276         }
277 -       down(&inode->i_sem);
278 -       error = notify_change(nd.dentry, &newattrs);
279 -       up(&inode->i_sem);
280 +       if (inode->i_op->setattr_raw) {
281 +               struct inode_operations *op = nd.dentry->d_inode->i_op;
282 +
283 +               newattrs.ia_valid |= ATTR_RAW;
284 +               error = op->setattr_raw(inode, &newattrs);
285 +               /* the file system wants to use normal vfs path now */
286 +               if (error != -EOPNOTSUPP)
287 +                       goto dput_and_out;
288 +       } else {
289 +                down(&inode->i_sem);
290 +                error = notify_change(nd.dentry, &newattrs);
291 +                up(&inode->i_sem);
292 +        }
293  dput_and_out:
294         path_release(&nd);
295  out:
296 @@ -440,9 +458,19 @@
297                     (error = permission(inode,MAY_WRITE,&nd)) != 0)
298                         goto dput_and_out;
299         }
300 -       down(&inode->i_sem);
301 -       error = notify_change(nd.dentry, &newattrs);
302 -       up(&inode->i_sem);
303 +       if (inode->i_op->setattr_raw) {
304 +               struct inode_operations *op = nd.dentry->d_inode->i_op;
305 +
306 +               newattrs.ia_valid |= ATTR_RAW;
307 +               error = op->setattr_raw(inode, &newattrs);
308 +               /* the file system wants to use normal vfs path now */
309 +               if (error != -EOPNOTSUPP)
310 +                       goto dput_and_out;
311 +       } else {
312 +                down(&inode->i_sem);
313 +                error = notify_change(nd.dentry, &newattrs);
314 +                up(&inode->i_sem);
315 +        }
316  dput_and_out:
317         path_release(&nd);
318  out:
319 @@ -592,36 +620,52 @@
320         return error;
321  }
322  
323 -asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
324 +int chmod_common(struct dentry *dentry, mode_t mode)
325  {
326 -       struct inode * inode;
327 -       struct dentry * dentry;
328 -       struct file * file;
329 -       int err = -EBADF;
330 +       struct inode * inode = dentry->d_inode;
331         struct iattr newattrs;
332 +       int error = -EROFS;
333  
334 -       file = fget(fd);
335 -       if (!file)
336 +       if (IS_RDONLY(inode))
337                 goto out;
338 +       
339 +       if (inode->i_op->setattr_raw) {
340 +               struct inode_operations *op = dentry->d_inode->i_op;
341  
342 -       dentry = file->f_dentry;
343 -       inode = dentry->d_inode;
344 +               newattrs.ia_mode = mode;
345 +               newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
346 +               newattrs.ia_valid |= ATTR_RAW;
347 +               error = op->setattr_raw(inode, &newattrs);
348 +               /* the file system wants to use normal vfs path now */
349 +               if (error != -EOPNOTSUPP)
350 +                       goto out;
351 +       }
352  
353 -       err = -EROFS;
354 -       if (IS_RDONLY(inode))
355 -               goto out_putf;
356 -       err = -EPERM;
357 +       error = -EPERM;
358         if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
359 -               goto out_putf;
360 +               goto out;
361 +
362         down(&inode->i_sem);
363         if (mode == (mode_t) -1)
364                 mode = inode->i_mode;
365         newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
366         newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
367 -       err = notify_change(dentry, &newattrs);
368 +       error = notify_change(dentry, &newattrs);
369         up(&inode->i_sem);
370 +out:
371 +       return error;
372 +}
373  
374 -out_putf:
375 +asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
376 +{
377 +       struct file * file;
378 +       int err = -EBADF;
379 +
380 +       file = fget(fd);
381 +       if (!file)
382 +               goto out;
383 +
384 +       err = chmod_common(file->f_dentry, mode);
385         fput(file);
386  out:
387         return err;
388 @@ -630,32 +674,13 @@
389  asmlinkage long sys_chmod(const char __user * filename, mode_t mode)
390  {
391         struct nameidata nd;
392 -       struct inode * inode;
393         int error;
394 -       struct iattr newattrs;
395  
396         error = user_path_walk(filename, &nd);
397         if (error)
398                 goto out;
399 -       inode = nd.dentry->d_inode;
400 -
401 -       error = -EROFS;
402 -       if (IS_RDONLY(inode))
403 -               goto dput_and_out;
404 -       
405 -       error = -EPERM;
406 -       if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
407 -               goto dput_and_out;
408 -
409 -       down(&inode->i_sem);
410 -       if (mode == (mode_t) -1)
411 -               mode = inode->i_mode;
412 -       newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
413 -       newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
414 -       error = notify_change(nd.dentry, &newattrs);
415 -       up(&inode->i_sem);
416  
417 -dput_and_out:
418 +       error = chmod_common(nd.dentry, mode);
419         path_release(&nd);
420  out:
421         return error;
422 @@ -676,6 +701,18 @@
423         if (IS_RDONLY(inode))
424                 goto out;
425         error = -EPERM;
426 +       if (inode->i_op->setattr_raw) {
427 +               struct inode_operations *op = dentry->d_inode->i_op;
428 +
429 +               newattrs.ia_uid = user;
430 +               newattrs.ia_gid = group;
431 +               newattrs.ia_valid = ATTR_UID | ATTR_GID;
432 +               newattrs.ia_valid |= ATTR_RAW;
433 +               error = op->setattr_raw(inode, &newattrs);
434 +               /* the file system wants to use normal vfs path now */
435 +               if (error != -EOPNOTSUPP)
436 +                       return error;
437 +       }
438         if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
439                 goto out;
440         newattrs.ia_valid =  ATTR_CTIME;
441 @@ -689,6 +726,7 @@
442         }
443         if (!S_ISDIR(inode->i_mode))
444                 newattrs.ia_valid |= ATTR_KILL_SUID|ATTR_KILL_SGID;
445 +
446         down(&inode->i_sem);
447         error = notify_change(dentry, &newattrs);
448         up(&inode->i_sem);
449 Index: linux-2.6.4-51.0/fs/exec.c
450 ===================================================================
451 --- linux-2.6.4-51.0.orig/fs/exec.c     2004-04-05 17:36:42.000000000 -0400
452 +++ linux-2.6.4-51.0/fs/exec.c  2004-04-05 17:36:43.000000000 -0400
453 @@ -1418,7 +1418,7 @@
454                 goto close_fail;
455         if (!file->f_op->write)
456                 goto close_fail;
457 -       if (do_truncate(file->f_dentry, 0) != 0)
458 +       if (do_truncate(file->f_dentry, 0, 0) != 0)
459                 goto close_fail;
460  
461         retval = binfmt->core_dump(signr, regs, file);
462 Index: linux-2.6.4-51.0/include/linux/fs.h
463 ===================================================================
464 --- linux-2.6.4-51.0.orig/include/linux/fs.h    2004-04-05 17:36:43.000000000 -0400
465 +++ linux-2.6.4-51.0/include/linux/fs.h 2004-04-05 17:36:43.000000000 -0400
466 @@ -866,13 +866,20 @@
467         int (*create) (struct inode *,struct dentry *,int, struct nameidata *);
468         struct dentry * (*lookup) (struct inode *,struct dentry *, struct nameidata *);
469         int (*link) (struct dentry *,struct inode *,struct dentry *);
470 +       int (*link_raw) (struct nameidata *,struct nameidata *);
471         int (*unlink) (struct inode *,struct dentry *);
472 +       int (*unlink_raw) (struct nameidata *);
473         int (*symlink) (struct inode *,struct dentry *,const char *);
474 +       int (*symlink_raw) (struct nameidata *,const char *);
475         int (*mkdir) (struct inode *,struct dentry *,int);
476 +       int (*mkdir_raw) (struct nameidata *,int);
477         int (*rmdir) (struct inode *,struct dentry *);
478 +       int (*rmdir_raw) (struct nameidata *);
479         int (*mknod) (struct inode *,struct dentry *,int,dev_t);
480 +       int (*mknod_raw) (struct nameidata *,int,dev_t);
481         int (*rename) (struct inode *, struct dentry *,
482                         struct inode *, struct dentry *);
483 +       int (*rename_raw) (struct nameidata *, struct nameidata *);
484         int (*readlink) (struct dentry *, char __user *,int);
485         int (*follow_link) (struct dentry *, struct nameidata *);
486         void (*truncate) (struct inode *);
487 @@ -1169,7 +1176,7 @@
488  
489  /* fs/open.c */
490  
491 -extern int do_truncate(struct dentry *, loff_t start);
492 +extern int do_truncate(struct dentry *, loff_t start, int called_from_open);
493  extern struct file *filp_open(const char *, int, int);
494  extern struct file * dentry_open(struct dentry *, struct vfsmount *, int);
495  extern struct file * dentry_open_it(struct dentry *, struct vfsmount *, int, struct lookup_intent *);
496 Index: linux-2.6.4-51.0/net/unix/af_unix.c
497 ===================================================================
498 --- linux-2.6.4-51.0.orig/net/unix/af_unix.c    2004-04-05 12:42:07.000000000 -0400
499 +++ linux-2.6.4-51.0/net/unix/af_unix.c 2004-04-05 17:36:43.000000000 -0400
500 @@ -676,6 +676,7 @@
501         int err = 0;
502         
503         if (sunname->sun_path[0]) {
504 +               intent_init(&nd.intent, IT_LOOKUP);
505                 err = path_lookup(sunname->sun_path, LOOKUP_FOLLOW, &nd);
506                 if (err)
507                         goto fail;