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
13 - error = do_truncate(dentry, 0);
14 + error = do_truncate(dentry, 0, 1);
16 put_write_access(inode);
20 struct dentry * dentry;
22 + intent_init(&nd.intent, IT_LOOKUP);
26 @@ -1536,6 +1537,15 @@
27 error = path_lookup(tmp, LOOKUP_PARENT, &nd);
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)
39 dentry = lookup_create(&nd, 0);
40 error = PTR_ERR(dentry);
45 up(&nd.dentry->d_inode->i_sem);
50 @@ -1603,10 +1614,18 @@
52 struct dentry *dentry;
54 + intent_init(&nd.intent, IT_LOOKUP);
56 error = path_lookup(tmp, LOOKUP_PARENT, &nd);
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)
66 dentry = lookup_create(&nd, 1);
67 error = PTR_ERR(dentry);
68 if (!IS_ERR(dentry)) {
72 up(&nd.dentry->d_inode->i_sem);
79 struct dentry *dentry;
81 + intent_init(&nd.intent, IT_LOOKUP);
83 name = getname(pathname);
85 @@ -1716,6 +1737,14 @@
89 + if (nd.dentry->d_inode->i_op->rmdir_raw) {
90 + struct inode_operations *op = nd.dentry->d_inode->i_op;
92 + error = op->rmdir_raw(&nd);
93 + /* the file system wants to use normal vfs path now */
94 + if (error != -EOPNOTSUPP)
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;
103 struct inode *inode = NULL;
104 + intent_init(&nd.intent, IT_LOOKUP);
106 name = getname(pathname);
108 @@ -1785,6 +1817,13 @@
110 if (nd.last_type != LAST_NORM)
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)
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 @@
124 struct dentry *dentry;
126 + intent_init(&nd.intent, IT_LOOKUP);
128 error = path_lookup(to, LOOKUP_PARENT, &nd);
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)
138 dentry = lookup_create(&nd, 0);
139 error = PTR_ERR(dentry);
140 if (!IS_ERR(dentry)) {
141 @@ -1863,6 +1910,7 @@
144 up(&nd.dentry->d_inode->i_sem);
149 @@ -1926,6 +1974,8 @@
150 struct nameidata nd, old_nd;
153 + intent_init(&nd.intent, IT_LOOKUP);
154 + intent_init(&old_nd.intent, IT_LOOKUP);
156 to = getname(newname);
158 @@ -1940,6 +1990,13 @@
160 if (old_nd.mnt != nd.mnt)
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)
169 new_dentry = lookup_create(&nd, 0);
170 error = PTR_ERR(new_dentry);
171 if (!IS_ERR(new_dentry)) {
172 @@ -1990,7 +2047,7 @@
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)
180 struct inode *target;
181 @@ -2035,7 +2092,7 @@
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)
188 struct inode *target;
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);
197 error = path_lookup(oldname, LOOKUP_PARENT, &oldnd);
199 @@ -2134,6 +2193,13 @@
200 if (newnd.last_type != LAST_NORM)
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)
210 trap = lock_rename(new_dir, old_dir);
212 old_dentry = lookup_hash(&oldnd.last, old_dir);
213 @@ -2165,8 +2231,7 @@
214 if (new_dentry == trap)
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);
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
231 -int do_truncate(struct dentry *dentry, loff_t length)
232 +int do_truncate(struct dentry *dentry, loff_t length, int called_from_open)
235 + struct inode_operations *op = dentry->d_inode->i_op;
236 struct iattr newattrs;
238 /* Not pretty: "inode->i_size" shouldn't really be signed. But it is. */
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);
251 + err = notify_change(dentry, &newattrs);
252 up_write(&dentry->d_inode->i_alloc_sem);
253 up(&dentry->d_inode->i_sem);
256 error = locks_verify_truncate(inode, NULL, length);
259 - error = do_truncate(nd.dentry, length);
260 + error = do_truncate(nd.dentry, length, 0);
262 put_write_access(inode);
266 error = locks_verify_truncate(inode, file, length);
268 - error = do_truncate(dentry, length);
269 + error = do_truncate(dentry, length, 0);
274 (error = permission(inode,MAY_WRITE,&nd)) != 0)
277 - down(&inode->i_sem);
278 - error = notify_change(nd.dentry, &newattrs);
280 + if (inode->i_op->setattr_raw) {
281 + struct inode_operations *op = nd.dentry->d_inode->i_op;
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)
289 + down(&inode->i_sem);
290 + error = notify_change(nd.dentry, &newattrs);
297 (error = permission(inode,MAY_WRITE,&nd)) != 0)
300 - down(&inode->i_sem);
301 - error = notify_change(nd.dentry, &newattrs);
303 + if (inode->i_op->setattr_raw) {
304 + struct inode_operations *op = nd.dentry->d_inode->i_op;
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)
312 + down(&inode->i_sem);
313 + error = notify_change(nd.dentry, &newattrs);
319 @@ -592,36 +620,52 @@
323 -asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
324 +int chmod_common(struct dentry *dentry, mode_t mode)
326 - struct inode * inode;
327 - struct dentry * dentry;
328 - struct file * file;
330 + struct inode * inode = dentry->d_inode;
331 struct iattr newattrs;
332 + int error = -EROFS;
336 + if (IS_RDONLY(inode))
339 + if (inode->i_op->setattr_raw) {
340 + struct inode_operations *op = dentry->d_inode->i_op;
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)
354 - if (IS_RDONLY(inode))
358 if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
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);
375 +asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
377 + struct file * file;
384 + err = chmod_common(file->f_dentry, mode);
388 @@ -630,32 +674,13 @@
389 asmlinkage long sys_chmod(const char __user * filename, mode_t mode)
392 - struct inode * inode;
394 - struct iattr newattrs;
396 error = user_path_walk(filename, &nd);
399 - inode = nd.dentry->d_inode;
402 - if (IS_RDONLY(inode))
406 - if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
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);
418 + error = chmod_common(nd.dentry, mode);
423 if (IS_RDONLY(inode))
426 + if (inode->i_op->setattr_raw) {
427 + struct inode_operations *op = dentry->d_inode->i_op;
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)
438 if (IS_IMMUTABLE(inode) || IS_APPEND(inode))
440 newattrs.ia_valid = ATTR_CTIME;
443 if (!S_ISDIR(inode->i_mode))
444 newattrs.ia_valid |= ATTR_KILL_SUID|ATTR_KILL_SGID;
447 error = notify_change(dentry, &newattrs);
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 @@
455 if (!file->f_op->write)
457 - if (do_truncate(file->f_dentry, 0) != 0)
458 + if (do_truncate(file->f_dentry, 0, 0) != 0)
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 @@
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
503 if (sunname->sun_path[0]) {
504 + intent_init(&nd.intent, IT_LOOKUP);
505 err = path_lookup(sunname->sun_path, LOOKUP_FOLLOW, &nd);