📄 vfs_intent-2.6-suse.patch
字号:
- error = open_namei(filename, namei_flags, mode, &nd);- if (!error)- return dentry_open(nd.dentry, nd.mnt, flags);-- return ERR_PTR(error);-}--EXPORT_SYMBOL(filp_open);--struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)+struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt, int flags,+ struct lookup_intent *it) { struct file * f; struct inode *inode;@@ -836,6 +822,7 @@ goto cleanup_dentry; f->f_flags = flags; f->f_mode = (flags+1) & O_ACCMODE;+ f->f_it = it; inode = dentry->d_inode; if (f->f_mode & FMODE_WRITE) { error = get_write_access(inode);@@ -855,6 +842,7 @@ error = f->f_op->open(inode,f); if (error) goto cleanup_all;+ intent_release(it); } f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC); @@ -879,6 +867,7 @@ cleanup_file: put_filp(f); cleanup_dentry:+ intent_release(it); dput(dentry); mntput(mnt); return ERR_PTR(error);@@ -886,6 +875,36 @@ EXPORT_SYMBOL(dentry_open); +struct file *filp_open(const char * filename, int flags, int mode)+{+ int namei_flags, error;+ struct file * temp_filp;+ struct nameidata nd;+ intent_init(&nd.intent, IT_OPEN);++ namei_flags = flags;+ if ((namei_flags+1) & O_ACCMODE)+ namei_flags++;+ if (namei_flags & O_TRUNC)+ namei_flags |= 2;++ error = open_namei(filename, namei_flags, mode, &nd);+ if (!error) {+ temp_filp = dentry_open_it(nd.dentry, nd.mnt, flags, &nd.intent);+ return temp_filp;+ } + return ERR_PTR(error);+}+++struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags)+{+ struct lookup_intent it;+ intent_init(&it, IT_LOOKUP);++ return dentry_open_it(dentry, mnt, flags, &it);+}+ /* * Find an empty file descriptor entry, and mark it busy. */Index: linux-2.6.5-12.1/fs/stat.c===================================================================--- linux-2.6.5-12.1.orig/fs/stat.c 2004-05-10 12:21:56.000000000 -0400+++ linux-2.6.5-12.1/fs/stat.c 2004-06-03 18:31:28.000000000 -0400@@ -37,7 +37,7 @@ EXPORT_SYMBOL(generic_fillattr); -int vfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)+int vfs_getattr_it(struct vfsmount *mnt, struct dentry *dentry, struct lookup_intent *it, struct kstat *stat) { struct inode *inode = dentry->d_inode; int retval;@@ -46,6 +46,8 @@ if (retval) return retval; + if (inode->i_op->getattr_it)+ return inode->i_op->getattr_it(mnt, dentry, it, stat); if (inode->i_op->getattr) return inode->i_op->getattr(mnt, dentry, stat); @@ -62,14 +64,20 @@ EXPORT_SYMBOL(vfs_getattr); +int vfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)+{+ return vfs_getattr_it(mnt, dentry, NULL, stat);+}+ int vfs_stat(char __user *name, struct kstat *stat) { struct nameidata nd; int error;+ intent_init(&nd.intent, IT_GETATTR); - FSHOOK_BEGIN_USER_PATH_WALK(stat, error, name, nd, path, .link = false)+ FSHOOK_BEGIN_USER_PATH_WALK_IT(stat, error, name, nd, path, .link = false) - error = vfs_getattr(nd.mnt, nd.dentry, stat);+ error = vfs_getattr_it(nd.mnt, nd.dentry, &nd.intent, stat); path_release(&nd); FSHOOK_END_USER_WALK(stat, error, path)@@ -83,10 +91,11 @@ { struct nameidata nd; int error;+ intent_init(&nd.intent, IT_GETATTR); - FSHOOK_BEGIN_USER_PATH_WALK_LINK(stat, error, name, nd, path, .link = true)+ FSHOOK_BEGIN_USER_PATH_WALK_LINK_IT(stat, error, name, nd, path, .link = true) - error = vfs_getattr(nd.mnt, nd.dentry, stat);+ error = vfs_getattr_it(nd.mnt, nd.dentry, &nd.intent, stat); path_release(&nd); FSHOOK_END_USER_WALK(stat, error, path)@@ -99,6 +108,8 @@ int vfs_fstat(unsigned int fd, struct kstat *stat) { int error;+ struct nameidata nd;+ intent_init(&nd.intent, IT_GETATTR); FSHOOK_BEGIN(fstat, error, .fd = fd) @@ -106,7 +117,8 @@ error = -EBADF; if (f) {- error = vfs_getattr(f->f_vfsmnt, f->f_dentry, stat);+ error = vfs_getattr_it(f->f_vfsmnt, f->f_dentry, &nd.intent, stat);+ intent_release(&nd.intent); fput(f); } Index: linux-2.6.5-12.1/fs/inode.c===================================================================--- linux-2.6.5-12.1.orig/fs/inode.c 2004-05-10 12:21:56.000000000 -0400+++ linux-2.6.5-12.1/fs/inode.c 2004-06-03 18:31:28.000000000 -0400@@ -221,6 +221,7 @@ inodes_stat.nr_unused--; } +EXPORT_SYMBOL(__iget); /** * clear_inode - clear an inode * @inode: inode to clearIndex: linux-2.6.5-12.1/fs/super.c===================================================================--- linux-2.6.5-12.1.orig/fs/super.c 2004-05-10 12:21:56.000000000 -0400+++ linux-2.6.5-12.1/fs/super.c 2004-06-03 18:31:28.000000000 -0400@@ -789,6 +789,8 @@ return (struct vfsmount *)sb; } +EXPORT_SYMBOL(do_kern_mount);+ struct vfsmount *kern_mount(struct file_system_type *type) { return do_kern_mount(type->name, 0, type->name, NULL);Index: linux-2.6.5-12.1/fs/block_dev.c===================================================================--- linux-2.6.5-12.1.orig/fs/block_dev.c 2004-05-10 12:21:55.000000000 -0400+++ linux-2.6.5-12.1/fs/block_dev.c 2004-06-03 18:31:28.000000000 -0400@@ -834,6 +834,7 @@ if (!path || !*path) return ERR_PTR(-EINVAL); + intent_init(&nd.intent, IT_LOOKUP); error = path_lookup(path, LOOKUP_FOLLOW, &nd); if (error) return ERR_PTR(error);Index: linux-2.6.5-12.1/include/linux/dcache.h===================================================================--- linux-2.6.5-12.1.orig/include/linux/dcache.h 2004-04-03 22:38:24.000000000 -0500+++ linux-2.6.5-12.1/include/linux/dcache.h 2004-06-03 18:31:28.000000000 -0400@@ -4,6 +4,7 @@ #ifdef __KERNEL__ #include <asm/atomic.h>+#include <linux/string.h> #include <linux/list.h> #include <linux/spinlock.h> #include <linux/cache.h>@@ -35,6 +36,8 @@ char name_str[0]; }; +#include <linux/namei.h>+ struct dentry_stat_t { int nr_dentry; int nr_unused;Index: linux-2.6.5-12.1/include/linux/fs.h===================================================================--- linux-2.6.5-12.1.orig/include/linux/fs.h 2004-05-10 12:21:56.000000000 -0400+++ linux-2.6.5-12.1/include/linux/fs.h 2004-06-03 18:31:28.000000000 -0400@@ -76,6 +76,7 @@ #define FMODE_READ 1 #define FMODE_WRITE 2+#define FMODE_EXEC 4 #define RW_MASK 1 #define RWA_MASK 2@@ -250,6 +250,8 @@ #define ATTR_ATTR_FLAG 1024 #define ATTR_KILL_SUID 2048 #define ATTR_KILL_SGID 4096+#define ATTR_RAW 8192 /* file system, not vfs will massage attrs */+#define ATTR_FROM_OPEN 16384 /* called from open path, ie O_TRUNC */ /* * This is the Inode Attributes structure, used for notify_change(). It@@ -423,6 +425,7 @@ struct block_device *i_bdev; struct cdev *i_cdev; int i_cindex;+ void *i_filterdata; unsigned long i_dnotify_mask; /* Directory notify events */ struct dnotify_struct *i_dnotify; /* for directory notifications */@@ -556,6 +559,7 @@ spinlock_t f_ep_lock; #endif /* #ifdef CONFIG_EPOLL */ struct address_space *f_mapping;+ struct lookup_intent *f_it; }; extern spinlock_t files_lock; #define file_list_lock() spin_lock(&files_lock);@@ -886,7 +890,9 @@ void (*truncate) (struct inode *); int (*permission) (struct inode *, int, struct nameidata *); int (*setattr) (struct dentry *, struct iattr *);+ int (*setattr_raw) (struct inode *, struct iattr *); int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *);+ int (*getattr_it) (struct vfsmount *, struct dentry *, struct lookup_intent *, struct kstat *); int (*setxattr) (struct dentry *, const char *,const void *,size_t,int); ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); ssize_t (*listxattr) (struct dentry *, char *, size_t);@@ -1114,6 +1120,7 @@ extern int unregister_filesystem(struct file_system_type *); extern struct vfsmount *kern_mount(struct file_system_type *); extern int may_umount(struct vfsmount *);+struct vfsmount *do_kern_mount(const char *type, int flags, const char *name, void *data); extern long do_mount(char *, char *, char *, unsigned long, void *); extern int vfs_statfs(struct super_block *, struct kstatfs *);@@ -1178,6 +1185,7 @@ extern int do_truncate(struct dentry *, loff_t start); 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 *); extern int filp_close(struct file *, fl_owner_t id); extern char * getname(const char __user *); Index: linux-2.6.5-12.1/include/linux/namei.h===================================================================--- linux-2.6.5-12.1.orig/include/linux/namei.h 2004-05-10 12:21:56.000000000 -0400+++ linux-2.6.5-12.1/include/linux/namei.h 2004-06-03 18:31:28.000000000 -0400@@ -2,25 +2,55 @@ #define _LINUX_NAMEI_H #include <linux/linkage.h>+#include <linux/string.h> struct vfsmount;+struct nameidata; -struct open_intent {- int flags;- int create_mode;+/* intent opcodes */+#define IT_OPEN (1)+#define IT_CREAT (1<<1)+#define IT_READDIR (1<<2)+#define IT_GETATTR (1<<3)+#define IT_LOOKUP (1<<4)+#define IT_UNLINK (1<<5)+#define IT_TRUNC (1<<6)+#define IT_GETXATTR (1<<7)++struct lustre_intent_data {+ int it_disposition;+ int it_status;+ __u64 it_lock_handle;+ void *it_data;+ int it_lock_mode; }; +#define INTENT_MAGIC 0x19620323+struct lookup_intent {+ int it_magic;+ void (*it_op_release)(struct lookup_intent *);+ int it_op;+ int it_flags;+ int it_create_mode;+ union {+ struct lustre_intent_data lustre;+ } d;+};++static inline void intent_init(struct lookup_intent *it, int op)+{+ memset(it, 0, sizeof(*it));+ it->it_magic = INTENT_MAGIC;+ it->it_op = op;+}+ struct nameidata { struct dentry *dentry; struct vfsmount *mnt; struct qstr last; unsigned int flags; int last_type;-- /* Intent data */- union {- struct open_intent open;- } intent;+ struct lookup_intent intent; }; /*@@ -41,6 +71,9 @@ #define LOOKUP_CONTINUE 4 #define LOOKUP_PARENT 16 #define LOOKUP_NOALT 32+#define LOOKUP_LAST (1<<6)+#define LOOKUP_LINK_NOTLAST (1<<7)+ /* * Intent data */@@ -49,6 +82,12 @@ #define LOOKUP_ACCESS (0x0400) extern int FASTCALL(__user_walk(const char __user *, unsigned, struct nameidata *, const char **));+extern int FASTCALL(__user_walk_it(const char __user *, unsigned, struct nameidata *, const char **));+#define user_path_walk_it(name,nd) \+ __user_walk_it(name, LOOKUP_FOLLOW, nd, 0)+#define user_path_walk_link_it(name,nd) \+ __user_walk_it(name, 0, nd, 0)+extern void intent_release(struct lookup_intent *); #define user_path_walk(name,nd) \ __user_walk(name, LOOKUP_FOLLOW, nd, 0) #define user_path_walk_link(name,nd) \@@ -60,7 +99,6 @@ extern struct dentry * lookup_one_len(const char *, struct dentry *, int); extern struct dentry * lookup_hash(struct qstr *, struct dentry *);- extern int follow_down(struct vfsmount **, struct dentry **); extern int follow_up(struct vfsmount **, struct dentry **); Index: linux-2.6.5-12.1/include/linux/fshooks.h===================================================================--- linux-2.6.5-12.1.orig/include/linux/fshooks.h 2004-05-10 12:21:56.000000000 -0400+++ linux-2.6.5-12.1/include/linux/fshooks.h 2004-06-03 18:31:28.000000000 -0400@@ -90,12 +90,18 @@ #define FSHOOK_BEGIN_USER_WALK(type, err, path, flags, nd, field, args...) \ FSHOOK_BEGIN_USER_WALK_COMMON(type, err, __user_walk(path, flags, &nd, &info.field), nd, args)+#define FSHOOK_BEGIN_USER_WALK_IT(type, err, path, flags, nd, field, args...) \+ FSHOOK_BEGIN_USER_WALK_COMMON(type, err, __user_walk_it(path, flags, &nd, &info.field), nd, args) #define FSHOOK_BEGIN_USER_PATH_WALK(type, err, path, nd, field, args...) \ FSHOOK_BEGIN_USER_WALK_COMMON(type, err, __user_walk(path, LOOKUP_FOLLOW, &nd, &info.field), nd, args)+#define FSHOOK_BEGIN_USER_PATH_WALK_IT(type, err, path, nd, field, args...) \+ FSHOOK_BEGIN_USER_WALK_COMMON(type, err, __user_walk_it(path, LOOKUP_FOLLOW, &nd, &info.field), nd, args) #define FSHOOK_BEGIN_USER_PATH_WALK_LINK(type, err, path, nd, field, args...) \ FSHOOK_BEGIN_USER_WALK_COMMON(type, err, __user_walk(path, 0, &nd, &info.field), nd, args)+#define FSHOOK_BEGIN_USER_PATH_WALK_LINK_IT(type, err, path, nd, field, args...) \+ FSHOOK_BEGIN_USER_WALK_COMMON(type, err, __user_walk_it(path, 0, &nd, &info.field), nd, args) #define FSHOOK_END_USER_WALK(type, err, field) \ (void)(&info != (struct fshook_##type##_info *)-1L); \@@ -126,12 +132,18 @@ #define FSHOOK_BEGIN_USER_WALK(type, err, path, flags, nd, field, args...) \ if (!(err = __user_walk(path, flags, &nd, 0))) {+#define FSHOOK_BEGIN_USER_WALK_IT(type, err, path, flags, nd, field, args...) \+ if (!(err = __user_walk_it(path, flags, &nd, 0))) { #define FSHOOK_BEGIN_USER_PATH_WALK(type, err, path, nd, field, args...) \ if (!(err = user_path_walk(path, &nd))) {+#define FSHOOK_BEGIN_USER_PATH_WALK_IT(type, err, path, nd, field, args...) \+ if (!(err = user_path_walk_it(path, &nd))) { #define FSHOOK_BEGIN_USER_PATH_WALK_LINK(type, err, path, nd, field, args...) \ if (!(err = user_path_walk_link(path, &nd))) {+#define FSHOOK_BEGIN_USER_PATH_WALK_LINK_IT(type, err, path, nd, field, args...) \+ if (!(err = user_path_walk_link_it(path, &nd))) { #define FSHOOK_END_USER_WALK(type, err, field) ((void)0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -