diff --git a/lustre/kernel_patches/patches/link_notlast-susefix.patch b/lustre/kernel_patches/patches/link_notlast-susefix.patch new file mode 100644 index 0000000000000000000000000000000000000000..e3efbb465bc7b3ec59b57b633409401acf0ed2a0 --- /dev/null +++ b/lustre/kernel_patches/patches/link_notlast-susefix.patch @@ -0,0 +1,16 @@ +--- linux-2.6.5-7.141/fs/namei.c.orig 2005-04-01 18:03:37.788262784 +0300 ++++ linux-2.6.5-7.141/fs/namei.c 2005-04-01 18:05:43.058218856 +0300 +@@ -719,10 +719,12 @@ + goto out_dput; + + if (inode->i_op->follow_link) { ++ int save_flags = nd->flags; + mntget(next.mnt); + nd->flags |= LOOKUP_LINK_NOTLAST; + err = do_follow_link(next.dentry, nd); +- nd->flags &= ~LOOKUP_LINK_NOTLAST; ++ if (!(save_flags & LOOKUP_LINK_NOTLAST)) ++ nd->flags &= ~LOOKUP_LINK_NOTLAST; + dput(next.dentry); + mntput(next.mnt); + if (err) diff --git a/lustre/kernel_patches/patches/vfs_nointent-2.6-sles10.patch b/lustre/kernel_patches/patches/vfs_nointent-2.6-sles10.patch new file mode 100644 index 0000000000000000000000000000000000000000..aba3c8b3da80465920f1c8eff0e02d4028c63624 --- /dev/null +++ b/lustre/kernel_patches/patches/vfs_nointent-2.6-sles10.patch @@ -0,0 +1,453 @@ +Index: linux-2.6.16.21-0.8/net/unix/af_unix.c +=================================================================== +--- linux-2.6.16.21-0.8.orig/net/unix/af_unix.c 2006-08-03 01:34:33.000000000 -0600 ++++ linux-2.6.16.21-0.8/net/unix/af_unix.c 2006-08-03 01:35:38.000000000 -0600 +@@ -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.21-0.8/fs/open.c +=================================================================== +--- linux-2.6.16.21-0.8.orig/fs/open.c 2006-08-03 01:34:33.000000000 -0600 ++++ linux-2.6.16.21-0.8/fs/open.c 2006-08-03 02:54:31.000000000 -0600 +@@ -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: +@@ -620,36 +642,52 @@ + return error; + } + ++int chmod_common(struct dentry *dentry, mode_t mode) ++{ ++ 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; ++ error = notify_change(dentry, &newattrs); ++ mutex_unlock(&inode->i_mutex); ++out: ++ return error; ++} ++ + asmlinkage long sys_fchmod(unsigned int fd, 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; +- 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); +- mutex_unlock(&inode->i_mutex); +- +-out_putf: ++ err = chmod_common(file->f_dentry, mode); + fput(file); + out: + return err; +@@ -659,32 +697,12 @@ + 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: ++ error = chmod_common(nd.dentry, mode); + path_release(&nd); + out: + return error; +@@ -710,6 +728,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.21-0.8/fs/namei.c +=================================================================== +--- linux-2.6.16.21-0.8.orig/fs/namei.c 2006-08-03 01:34:33.000000000 -0600 ++++ linux-2.6.16.21-0.8/fs/namei.c 2006-08-03 02:54:31.000000000 -0600 +@@ -1637,7 +1637,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) +@@ -1911,6 +1911,7 @@ + char * tmp; + struct dentry * dentry; + struct nameidata nd; ++ intent_init(&nd.intent, IT_LOOKUP); + + if (S_ISDIR(mode)) + return -EPERM; +@@ -1921,6 +1922,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); + +@@ -1947,6 +1957,7 @@ + dput(dentry); + } + mutex_unlock(&nd.dentry->d_inode->i_mutex); ++out2: + path_release(&nd); + out: + putname(tmp); +@@ -1992,9 +2003,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)) { +@@ -2004,6 +2024,7 @@ + dput(dentry); + } + mutex_unlock(&nd.dentry->d_inode->i_mutex); ++out2: + path_release(&nd); + out: + putname(tmp); +@@ -2084,6 +2105,7 @@ + char * name; + struct dentry *dentry; + struct nameidata nd; ++ intent_init(&nd.intent, IT_LOOKUP); + + name = getname(pathname); + if(IS_ERR(name)) +@@ -2104,6 +2126,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); +@@ -2167,6 +2197,7 @@ + struct dentry *dentry; + struct nameidata nd; + struct inode *inode = NULL; ++ intent_init(&nd.intent, IT_LOOKUP); + + name = getname(pathname); + if(IS_ERR(name)) +@@ -2178,6 +2209,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); +@@ -2260,9 +2298,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)) { +@@ -2270,6 +2316,7 @@ + dput(dentry); + } + mutex_unlock(&nd.dentry->d_inode->i_mutex); ++out2: + path_release(&nd); + out: + putname(to); +@@ -2357,6 +2404,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)) { +@@ -2533,6 +2587,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) +@@ -2555,6 +2611,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); +@@ -2586,8 +2649,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.21-0.8/fs/exec.c +=================================================================== +--- linux-2.6.16.21-0.8.orig/fs/exec.c 2006-08-03 01:34:33.000000000 -0600 ++++ linux-2.6.16.21-0.8/fs/exec.c 2006-08-03 01:35:38.000000000 -0600 +@@ -1524,7 +1524,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.21-0.8/include/linux/fs.h +=================================================================== +--- linux-2.6.16.21-0.8.orig/include/linux/fs.h 2006-08-03 01:34:33.000000000 -0600 ++++ linux-2.6.16.21-0.8/include/linux/fs.h 2006-08-03 01:35:38.000000000 -0600 +@@ -1041,13 +1041,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 *); +@@ -1357,7 +1364,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);