0 files changed .old..........pc/vfs_nointent_2.6.0-suse/fs/namei.c .new.........fs/namei.c Index: linux-2.6.3-20/fs/namei.c =================================================================== --- linux-2.6.3-20.orig/fs/namei.c 2004-03-08 14:32:24.000000000 -0800 +++ linux-2.6.3-20/fs/namei.c 2004-03-08 14:40:01.000000000 -0800 @@ -1276,7 +1276,7 @@ if (!error) { DQUOT_INIT(inode); - error = do_truncate(dentry, 0); + error = do_truncate(dentry, 0, 1); } put_write_access(inode); if (error) @@ -1526,6 +1526,7 @@ char * tmp; struct dentry * dentry; struct nameidata nd; + intent_init(&nd.intent, IT_LOOKUP); if (S_ISDIR(mode)) return -EPERM; @@ -1536,6 +1537,15 @@ error = path_lookup(tmp, LOOKUP_PARENT, &nd); if (error) goto out; + + if (nd.dentry->d_inode->i_op->mknod_raw) { + struct inode_operations *op = nd.dentry->d_inode->i_op; + error = op->mknod_raw(&nd, mode, dev); + /* the file system wants to use normal vfs path now */ + if (error != -EOPNOTSUPP) + goto out2; + } + dentry = lookup_create(&nd, 0); error = PTR_ERR(dentry); @@ -1562,6 +1572,7 @@ dput(dentry); } up(&nd.dentry->d_inode->i_sem); +out2: path_release(&nd); out: putname(tmp); @@ -1603,10 +1614,18 @@ if (!IS_ERR(tmp)) { struct dentry *dentry; struct nameidata nd; + intent_init(&nd.intent, IT_LOOKUP); error = path_lookup(tmp, LOOKUP_PARENT, &nd); if (error) goto out; + if (nd.dentry->d_inode->i_op->mkdir_raw) { + struct inode_operations *op = nd.dentry->d_inode->i_op; + error = op->mkdir_raw(&nd, mode); + /* the file system wants to use normal vfs path now */ + if (error != -EOPNOTSUPP) + goto out2; + } dentry = lookup_create(&nd, 1); error = PTR_ERR(dentry); if (!IS_ERR(dentry)) { @@ -1616,6 +1635,7 @@ dput(dentry); } up(&nd.dentry->d_inode->i_sem); +out2: path_release(&nd); out: putname(tmp); @@ -1696,6 +1716,7 @@ char * name; struct dentry *dentry; struct nameidata nd; + intent_init(&nd.intent, IT_LOOKUP); name = getname(pathname); if(IS_ERR(name)) @@ -1716,6 +1737,16 @@ error = -EBUSY; goto exit1; } + + if (nd.dentry->d_inode->i_op->rmdir_raw) { + struct inode_operations *op = nd.dentry->d_inode->i_op; + + error = op->rmdir_raw(&nd); + /* the file system wants to use normal vfs path now */ + if (error != -EOPNOTSUPP) + goto exit1; + } + down(&nd.dentry->d_inode->i_sem); dentry = lookup_hash(&nd.last, nd.dentry); error = PTR_ERR(dentry); @@ -1774,6 +1805,7 @@ struct dentry *dentry; struct nameidata nd; struct inode *inode = NULL; + intent_init(&nd.intent, IT_LOOKUP); name = getname(pathname); if(IS_ERR(name)) @@ -1785,6 +1817,13 @@ error = -EISDIR; if (nd.last_type != LAST_NORM) goto exit1; + if (nd.dentry->d_inode->i_op->unlink_raw) { + struct inode_operations *op = nd.dentry->d_inode->i_op; + error = op->unlink_raw(&nd); + /* the file system wants to use normal vfs path now */ + if (error != -EOPNOTSUPP) + goto exit1; + } down(&nd.dentry->d_inode->i_sem); dentry = lookup_hash(&nd.last, nd.dentry); error = PTR_ERR(dentry); @@ -1852,10 +1891,18 @@ if (!IS_ERR(to)) { struct dentry *dentry; struct nameidata nd; + intent_init(&nd.intent, IT_LOOKUP); error = path_lookup(to, LOOKUP_PARENT, &nd); if (error) goto out; + if (nd.dentry->d_inode->i_op->symlink_raw) { + struct inode_operations *op = nd.dentry->d_inode->i_op; + error = op->symlink_raw(&nd, from); + /* the file system wants to use normal vfs path now */ + if (error != -EOPNOTSUPP) + goto out2; + } dentry = lookup_create(&nd, 0); error = PTR_ERR(dentry); if (!IS_ERR(dentry)) { @@ -1863,6 +1910,7 @@ dput(dentry); } up(&nd.dentry->d_inode->i_sem); +out2: path_release(&nd); out: putname(to); @@ -1926,6 +1974,8 @@ struct nameidata nd, old_nd; int error; char * to; + intent_init(&nd.intent, IT_LOOKUP); + intent_init(&old_nd.intent, IT_LOOKUP); to = getname(newname); if (IS_ERR(to)) @@ -1940,6 +1990,13 @@ error = -EXDEV; if (old_nd.mnt != nd.mnt) goto out_release; + if (nd.dentry->d_inode->i_op->link_raw) { + struct inode_operations *op = nd.dentry->d_inode->i_op; + error = op->link_raw(&old_nd, &nd); + /* the file system wants to use normal vfs path now */ + if (error != -EOPNOTSUPP) + goto out_release; + } new_dentry = lookup_create(&nd, 0); error = PTR_ERR(new_dentry); if (!IS_ERR(new_dentry)) { @@ -1990,7 +2047,7 @@ * locking]. */ int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry, - struct inode *new_dir, struct dentry *new_dentry) + struct inode *new_dir, struct dentry *new_dentry) { int error = 0; struct inode *target; @@ -2035,7 +2092,7 @@ } int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry, - struct inode *new_dir, struct dentry *new_dentry) + struct inode *new_dir, struct dentry *new_dentry) { struct inode *target; int error; @@ -2112,6 +2169,8 @@ struct dentry * old_dentry, *new_dentry; struct dentry * trap; struct nameidata oldnd, newnd; + intent_init(&oldnd.intent, IT_LOOKUP); + intent_init(&newnd.intent, IT_LOOKUP); error = path_lookup(oldname, LOOKUP_PARENT, &oldnd); if (error) @@ -2134,6 +2193,13 @@ if (newnd.last_type != LAST_NORM) goto exit2; + if (old_dir->d_inode->i_op->rename_raw) { + error = old_dir->d_inode->i_op->rename_raw(&oldnd, &newnd); + /* the file system wants to use normal vfs path now */ + if (error != -EOPNOTSUPP) + goto exit2; + } + trap = lock_rename(new_dir, old_dir); old_dentry = lookup_hash(&oldnd.last, old_dir); @@ -2165,8 +2231,7 @@ if (new_dentry == trap) goto exit5; - error = vfs_rename(old_dir->d_inode, old_dentry, - new_dir->d_inode, new_dentry); + error = vfs_rename(old_dir->d_inode, old_dentry, new_dir->d_inode, new_dentry); exit5: dput(new_dentry); exit4: .old..........pc/vfs_nointent_2.6.0-suse/fs/open.c .new.........fs/open.c Index: linux-2.6.3-20/fs/open.c =================================================================== --- linux-2.6.3-20.orig/fs/open.c 2004-03-08 14:23:40.000000000 -0800 +++ linux-2.6.3-20/fs/open.c 2004-03-08 14:40:01.000000000 -0800 @@ -180,9 +180,10 @@ return error; } -int do_truncate(struct dentry *dentry, loff_t length) +int do_truncate(struct dentry *dentry, loff_t length, int called_from_open) { int err; + struct inode_operations *op = dentry->d_inode->i_op; struct iattr newattrs; /* Not pretty: "inode->i_size" shouldn't really be signed. But it is. */ @@ -192,7 +193,14 @@ newattrs.ia_size = length; newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME; down(&dentry->d_inode->i_sem); - err = notify_change(dentry, &newattrs); + if (called_from_open) + newattrs.ia_valid |= ATTR_FROM_OPEN; + if (op->setattr_raw) { + newattrs.ia_valid |= ATTR_RAW; + newattrs.ia_ctime = CURRENT_TIME; + err = op->setattr_raw(dentry->d_inode, &newattrs); + } else + err = notify_change(dentry, &newattrs); up(&dentry->d_inode->i_sem); return err; } @@ -247,7 +255,7 @@ error = locks_verify_truncate(inode, NULL, length); if (!error) { DQUOT_INIT(inode); - error = do_truncate(nd.dentry, length); + error = do_truncate(nd.dentry, length, 0); } put_write_access(inode); @@ -299,7 +307,7 @@ error = locks_verify_truncate(inode, file, length); if (!error) - error = do_truncate(dentry, length); + error = do_truncate(dentry, length, 0); out_putf: fput(file); out: @@ -378,9 +386,19 @@ (error = permission(inode,MAY_WRITE,&nd)) != 0) goto dput_and_out; } - down(&inode->i_sem); - error = notify_change(nd.dentry, &newattrs); - up(&inode->i_sem); + if (inode->i_op->setattr_raw) { + struct inode_operations *op = nd.dentry->d_inode->i_op; + + newattrs.ia_valid |= ATTR_RAW; + error = op->setattr_raw(inode, &newattrs); + /* the file system wants to use normal vfs path now */ + if (error != -EOPNOTSUPP) + goto dput_and_out; + } else { + down(&inode->i_sem); + error = notify_change(nd.dentry, &newattrs); + up(&inode->i_sem); + } dput_and_out: path_release(&nd); out: @@ -431,9 +449,19 @@ (error = permission(inode,MAY_WRITE,&nd)) != 0) goto dput_and_out; } - down(&inode->i_sem); - error = notify_change(nd.dentry, &newattrs); - up(&inode->i_sem); + if (inode->i_op->setattr_raw) { + struct inode_operations *op = nd.dentry->d_inode->i_op; + + newattrs.ia_valid |= ATTR_RAW; + error = op->setattr_raw(inode, &newattrs); + /* the file system wants to use normal vfs path now */ + if (error != -EOPNOTSUPP) + goto dput_and_out; + } else { + down(&inode->i_sem); + error = notify_change(nd.dentry, &newattrs); + up(&inode->i_sem); + } dput_and_out: path_release(&nd); out: @@ -634,6 +662,18 @@ if (IS_RDONLY(inode)) goto dput_and_out; + if (inode->i_op->setattr_raw) { + struct inode_operations *op = nd.dentry->d_inode->i_op; + + newattrs.ia_mode = mode; + newattrs.ia_valid = ATTR_MODE | ATTR_CTIME; + newattrs.ia_valid |= ATTR_RAW; + error = op->setattr_raw(inode, &newattrs); + /* the file system wants to use normal vfs path now */ + if (error != -EOPNOTSUPP) + goto dput_and_out; + } + error = -EPERM; if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) goto dput_and_out; @@ -667,6 +707,18 @@ if (IS_RDONLY(inode)) goto out; error = -EPERM; + if (inode->i_op->setattr_raw) { + struct inode_operations *op = dentry->d_inode->i_op; + + newattrs.ia_uid = user; + newattrs.ia_gid = group; + newattrs.ia_valid = ATTR_UID | ATTR_GID; + newattrs.ia_valid |= ATTR_RAW; + error = op->setattr_raw(inode, &newattrs); + /* the file system wants to use normal vfs path now */ + if (error != -EOPNOTSUPP) + return error; + } if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) goto out; newattrs.ia_valid = ATTR_CTIME; @@ -680,6 +732,7 @@ } if (!S_ISDIR(inode->i_mode)) newattrs.ia_valid |= ATTR_KILL_SUID|ATTR_KILL_SGID; + down(&inode->i_sem); error = notify_change(dentry, &newattrs); up(&inode->i_sem); .old..........pc/vfs_nointent_2.6.0-suse/fs/exec.c .new.........fs/exec.c Index: linux-2.6.3-20/fs/exec.c =================================================================== --- linux-2.6.3-20.orig/fs/exec.c 2004-03-08 14:23:40.000000000 -0800 +++ linux-2.6.3-20/fs/exec.c 2004-03-08 14:40:01.000000000 -0800 @@ -1406,7 +1406,7 @@ goto close_fail; if (!file->f_op->write) goto close_fail; - if (do_truncate(file->f_dentry, 0) != 0) + if (do_truncate(file->f_dentry, 0, 0) != 0) goto close_fail; retval = binfmt->core_dump(signr, regs, file); .old..........pc/vfs_nointent_2.6.0-suse/include/linux/fs.h .new.........include/linux/fs.h Index: linux-2.6.3-20/include/linux/fs.h =================================================================== --- linux-2.6.3-20.orig/include/linux/fs.h 2004-03-08 14:23:41.000000000 -0800 +++ linux-2.6.3-20/include/linux/fs.h 2004-03-08 14:42:10.000000000 -0800 @@ -838,13 +838,20 @@ int (*create) (struct inode *,struct dentry *,int, struct nameidata *); struct dentry * (*lookup) (struct inode *,struct dentry *, struct nameidata *); int (*link) (struct dentry *,struct inode *,struct dentry *); + int (*link_raw) (struct nameidata *,struct nameidata *); int (*unlink) (struct inode *,struct dentry *); + int (*unlink_raw) (struct nameidata *); int (*symlink) (struct inode *,struct dentry *,const char *); + int (*symlink_raw) (struct nameidata *,const char *); int (*mkdir) (struct inode *,struct dentry *,int); + int (*mkdir_raw) (struct nameidata *,int); int (*rmdir) (struct inode *,struct dentry *); + int (*rmdir_raw) (struct nameidata *); int (*mknod) (struct inode *,struct dentry *,int,dev_t); + int (*mknod_raw) (struct nameidata *,int,dev_t); int (*rename) (struct inode *, struct dentry *, struct inode *, struct dentry *); + int (*rename_raw) (struct nameidata *, struct nameidata *); int (*readlink) (struct dentry *, char __user *,int); int (*follow_link) (struct dentry *, struct nameidata *); void (*truncate) (struct inode *); @@ -1130,7 +1137,7 @@ /* fs/open.c */ -extern int do_truncate(struct dentry *, loff_t start); +extern int do_truncate(struct dentry *, loff_t start, int called_from_open); extern struct file *filp_open(const char *, int, int); extern struct file * dentry_open(struct dentry *, struct vfsmount *, int); extern struct file * dentry_open_it(struct dentry *, struct vfsmount *, int, struct lookup_intent *); .old..........pc/vfs_nointent_2.6.0-suse/net/unix/af_unix.c .new.........net/unix/af_unix.c Index: linux-2.6.3-20/net/unix/af_unix.c =================================================================== --- linux-2.6.3-20.orig/net/unix/af_unix.c 2004-03-05 02:07:04.000000000 -0800 +++ linux-2.6.3-20/net/unix/af_unix.c 2004-03-08 14:40:01.000000000 -0800 @@ -592,6 +592,7 @@ int err = 0; if (sunname->sun_path[0]) { + intent_init(&nd.intent, IT_LOOKUP); err = path_lookup(sunname->sun_path, LOOKUP_FOLLOW, &nd); if (err) goto fail;