📄 vfs_nointent-2.6-fc5.patch
字号:
Index: linux-2.6.16.i686/net/unix/af_unix.c===================================================================--- linux-2.6.16.i686.orig/net/unix/af_unix.c 2006-03-20 13:53:29.000000000 +0800+++ linux-2.6.16.i686/net/unix/af_unix.c 2006-05-30 22:27:40.000000000 +0800@@ -673,6 +673,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;Index: linux-2.6.16.i686/fs/open.c===================================================================--- linux-2.6.16.i686.orig/fs/open.c 2006-05-30 22:10:06.000000000 +0800+++ linux-2.6.16.i686/fs/open.c 2006-05-30 22:27:40.000000000 +0800@@ -197,9 +197,10 @@ } int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,- struct file *filp)+ struct file *filp, 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. */@@ -214,7 +215,17 @@ } mutex_lock(&dentry->d_inode->i_mutex);- 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;+ down_write(&dentry->d_inode->i_alloc_sem);+ err = op->setattr_raw(dentry->d_inode, &newattrs);+ up_write(&dentry->d_inode->i_alloc_sem);+ } else+ err = notify_change(dentry, &newattrs);+ mutex_unlock(&dentry->d_inode->i_mutex); return err; }@@ -269,7 +280,7 @@ error = locks_verify_truncate(inode, NULL, length); if (!error) { DQUOT_INIT(inode);- error = do_truncate(nd.dentry, length, 0, NULL);+ error = do_truncate(nd.dentry, length, 0, NULL, 0); } put_write_access(inode); @@ -321,7 +332,7 @@ error = locks_verify_truncate(inode, file, length); if (!error)- error = do_truncate(dentry, length, 0, file);+ error = do_truncate(dentry, length, 0, file, 0); out_putf: fput(file); out:@@ -406,9 +417,20 @@ (error = vfs_permission(&nd, MAY_WRITE)) != 0) goto dput_and_out; }- mutex_lock(&inode->i_mutex);- error = notify_change(nd.dentry, &newattrs);- mutex_unlock(&inode->i_mutex);+ 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 {+ mutex_lock(&inode->i_mutex);+ error = notify_change(nd.dentry, &newattrs);+ mutex_unlock(&inode->i_mutex);+ }+ dput_and_out: path_release(&nd); out:@@ -623,77 +645,74 @@ } EXPORT_SYMBOL_GPL(sys_chroot);--asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)+ +int chmod_common(struct dentry *dentry, mode_t mode) {- struct inode * inode;- struct dentry * dentry;- struct file * file;- int err = -EBADF;- struct iattr newattrs;-- file = fget(fd);- if (!file)- goto out;-- dentry = file->f_dentry;- inode = dentry->d_inode;-- err = -EROFS;- if (IS_RDONLY(inode))- goto out_putf;- err = -EPERM;- if (IS_IMMUTABLE(inode) || IS_APPEND(inode))- goto out_putf;+ struct inode * inode = dentry->d_inode;+ struct iattr newattrs;+ int error = -EROFS;+ + if (IS_RDONLY(inode))+ goto out;+ + if (inode->i_op->setattr_raw) {+ struct inode_operations *op = 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 out;+ }+ + error = -EPERM;+ if (IS_IMMUTABLE(inode) || IS_APPEND(inode))+ goto out;+ mutex_lock(&inode->i_mutex);- if (mode == (mode_t) -1)- mode = inode->i_mode;- newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);- newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;- err = notify_change(dentry, &newattrs);+ if (mode == (mode_t) -1)+ mode = inode->i_mode;+ newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);+ newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;+ error = notify_change(dentry, &newattrs); mutex_unlock(&inode->i_mutex);+out:+ return error;+} -out_putf:- fput(file);+asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)+{+ struct file * file;+ int err = -EBADF;+ + file = fget(fd);+ if (!file)+ goto out;+ + err = chmod_common(file->f_dentry, mode);+ fput(file); out:- return err;+ return err; } asmlinkage long sys_fchmodat(int dfd, const char __user *filename, mode_t mode) { struct nameidata nd;- struct inode * inode; int error;- struct iattr newattrs; error = __user_walk_fd(dfd, filename, LOOKUP_FOLLOW, &nd); if (error) goto out;- inode = nd.dentry->d_inode;-- error = -EROFS;- if (IS_RDONLY(inode))- goto dput_and_out;-- error = -EPERM;- if (IS_IMMUTABLE(inode) || IS_APPEND(inode))- goto dput_and_out;-- mutex_lock(&inode->i_mutex);- if (mode == (mode_t) -1)- mode = inode->i_mode;- newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);- newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;- error = notify_change(nd.dentry, &newattrs);- mutex_unlock(&inode->i_mutex);--dput_and_out:- path_release(&nd);+ error = chmod_common(nd.dentry, mode);+ path_release(&nd); out:- return error;+ return error; } + asmlinkage long sys_chmod(const char __user *filename, mode_t mode) { return sys_fchmodat(AT_FDCWD, filename, mode);@@ -714,6 +733,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 | 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)+ return error;+ } if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) goto out; newattrs.ia_valid = ATTR_CTIME;Index: linux-2.6.16.i686/fs/namei.c===================================================================--- linux-2.6.16.i686.orig/fs/namei.c 2006-05-30 22:24:53.000000000 +0800+++ linux-2.6.16.i686/fs/namei.c 2006-05-30 22:27:51.000000000 +0800@@ -1644,7 +1644,7 @@ if (!error) { DQUOT_INIT(inode); - error = do_truncate(dentry, 0, ATTR_MTIME|ATTR_CTIME, NULL);+ error = do_truncate(dentry, 0, ATTR_MTIME|ATTR_CTIME, NULL, 1); } put_write_access(inode); if (error)@@ -1912,6 +1912,7 @@ char * tmp; struct dentry * dentry; struct nameidata nd;+ intent_init(&nd.intent, IT_LOOKUP); if (S_ISDIR(mode)) return -EPERM;@@ -1922,6 +1923,15 @@ error = do_path_lookup(dfd, 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); @@ -1948,6 +1958,7 @@ dput(dentry); } mutex_unlock(&nd.dentry->d_inode->i_mutex);+out2: path_release(&nd); out: putname(tmp);@@ -1993,9 +2004,18 @@ struct dentry *dentry; struct nameidata nd; + intent_init(&nd.intent, IT_LOOKUP); error = do_path_lookup(dfd, 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)) {@@ -2005,6 +2025,7 @@ dput(dentry); } mutex_unlock(&nd.dentry->d_inode->i_mutex);+out2: path_release(&nd); out: putname(tmp);@@ -2085,6 +2106,7 @@ char * name; struct dentry *dentry; struct nameidata nd;+ intent_init(&nd.intent, IT_LOOKUP); name = getname(pathname); if(IS_ERR(name))@@ -2105,6 +2127,14 @@ 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;+ } mutex_lock(&nd.dentry->d_inode->i_mutex); dentry = lookup_hash(&nd); error = PTR_ERR(dentry);@@ -2168,6 +2198,7 @@ struct dentry *dentry; struct nameidata nd; struct inode *inode = NULL;+ intent_init(&nd.intent, IT_LOOKUP); name = getname(pathname); if(IS_ERR(name))@@ -2179,6 +2210,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;+ } mutex_lock(&nd.dentry->d_inode->i_mutex); dentry = lookup_hash(&nd); error = PTR_ERR(dentry);@@ -2261,9 +2299,17 @@ struct dentry *dentry; struct nameidata nd; + intent_init(&nd.intent, IT_LOOKUP); error = do_path_lookup(newdfd, 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)) {@@ -2271,6 +2317,7 @@ dput(dentry); } mutex_unlock(&nd.dentry->d_inode->i_mutex);+out2: path_release(&nd); out: putname(to);@@ -2358,6 +2405,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)) {@@ -2534,6 +2588,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 = do_path_lookup(olddfd, oldname, LOOKUP_PARENT, &oldnd); if (error)@@ -2556,6 +2612,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);@@ -2587,8 +2650,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:Index: linux-2.6.16.i686/fs/exec.c===================================================================--- linux-2.6.16.i686.orig/fs/exec.c 2006-05-30 21:33:00.000000000 +0800+++ linux-2.6.16.i686/fs/exec.c 2006-05-30 22:27:40.000000000 +0800@@ -1517,7 +1517,7 @@ goto close_fail; if (!file->f_op->write) goto close_fail;- if (do_truncate(file->f_dentry, 0, 0, file) != 0)+ if (do_truncate(file->f_dentry, 0, 0, file, 0) != 0) goto close_fail; retval = binfmt->core_dump(signr, regs, file);Index: linux-2.6.16.i686/include/linux/fs.h===================================================================--- linux-2.6.16.i686.orig/include/linux/fs.h 2006-05-30 21:33:00.000000000 +0800+++ linux-2.6.16.i686/include/linux/fs.h 2006-05-30 22:27:40.000000000 +0800@@ -1035,13 +1035,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); void * (*follow_link) (struct dentry *, struct nameidata *); void (*put_link) (struct dentry *, struct nameidata *, void *);@@ -1351,7 +1358,7 @@ /* fs/open.c */ extern int do_truncate(struct dentry *, loff_t start, unsigned int time_attrs,- struct file *filp);+ struct file *filp, int called_from_open); extern long do_sys_open(int fdf, const char __user *filename, int flags, int mode); extern struct file *filp_open(const char *, int, int);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -