From c85a039f9ddee1bf024b76d0a6c3d0885a19009b Mon Sep 17 00:00:00 2001 From: phil Date: Mon, 7 Jun 2004 22:41:07 +0000 Subject: [PATCH] land b_gns onto HEAD. If you are working on CMD, you MUST UPDATE YOUR KERNEL, or LUSTRE WILL NOT BUILD. - full GNS kernel updates added to vanilla-2.4.24 series - Oleg patched the API updates into the other kernel series, but none of the GNS functionality is present. I don't know how well those other series have been tested. - I tested normal functionality, but have not tested GNS yet. --- lustre/include/liblustre.h | 1 + lustre/include/linux/obd.h | 3 + .../patches/ext3-raw-lookup-pdirops.patch | 24 +- .../kernel_patches/patches/ext3-raw-lookup.patch | 24 +- lustre/kernel_patches/patches/lustre_version.patch | 10 +- .../patches/nfs_export_kernel-2.4.18.patch | 4 +- .../patches/nfs_export_kernel-2.4.19-pre1.patch | 4 +- .../patches/nfs_export_kernel-2.4.20-hp.patch | 4 +- .../patches/nfs_export_kernel-2.4.20-rh.patch | 4 +- .../patches/nfs_export_kernel-2.4.20.patch | 10 +- .../patches/nfs_export_kernel-2.4.21-chaos.patch | 4 +- .../patches/nfs_export_kernel-2.4.21-suse2.patch | 4 +- .../patches/nfs_export_kernel-2.4.22-rh.patch | 4 +- .../patches/nfs_export_kernel-2.4.22.patch | 96 ++--- .../patches/vfs-pdirops-2.4.20-rh.patch | 88 ++-- .../patches/vfs_intent-2.4.19-pre1.patch | 73 +++- .../patches/vfs_intent-2.4.19-suse.patch | 73 +++- .../patches/vfs_intent-2.4.20-hp.patch | 73 +++- .../patches/vfs_intent-2.4.20-rh.patch | 73 +++- .../patches/vfs_intent-2.4.20-vanilla.patch | 468 +++++++++++++-------- .../patches/vfs_intent-2.4.21-chaos.patch | 73 +++- .../patches/vfs_intent-2.4.21-sles8sp3.patch | 53 ++- .../patches/vfs_intent-2.4.21-suse2.patch | 162 ++++--- .../patches/vfs_intent-2.4.22-rh.patch | 75 +++- lustre/kernel_patches/series/vanilla-2.4.24 | 5 +- lustre/ldlm/ldlm_lock.c | 2 + lustre/ldlm/ldlm_lockd.c | 4 +- lustre/llite/Makefile.in | 2 +- lustre/llite/Makefile.mk | 2 +- lustre/llite/dcache.c | 36 +- lustre/llite/dir.c | 4 + lustre/llite/llite_gns.c | 413 ++++++++++++++++++ lustre/llite/llite_internal.h | 25 +- lustre/llite/llite_lib.c | 18 +- lustre/llite/namei.c | 13 +- lustre/llite/super.c | 35 +- lustre/mdc/mdc_locks.c | 10 +- lustre/mds/handler.c | 1 + lustre/mds/mds_open.c | 23 +- lustre/obdclass/class_obd.c | 4 +- lustre/utils/lctl.c | 1 + lustre/utils/obd.c | 29 ++ lustre/utils/obdctl.h | 1 + 43 files changed, 1553 insertions(+), 482 deletions(-) create mode 100644 lustre/llite/llite_gns.c diff --git a/lustre/include/liblustre.h b/lustre/include/liblustre.h index da6cc8a..9f290a8 100644 --- a/lustre/include/liblustre.h +++ b/lustre/include/liblustre.h @@ -466,6 +466,7 @@ struct iattr { #define IT_GETXATTR 0x0040 #define IT_EXEC 0x0080 #define IT_PIN 0x0100 +#define IT_CHDIR 0x0200 #define IT_FL_LOCKED 0x0001 #define IT_FL_FOLLOWED 0x0002 /* set by vfs_follow_link */ diff --git a/lustre/include/linux/obd.h b/lustre/include/linux/obd.h index b9b1d2e..1b74b89 100644 --- a/lustre/include/linux/obd.h +++ b/lustre/include/linux/obd.h @@ -18,6 +18,9 @@ #define IOC_MDC_TYPE 'i' #define IOC_MDC_MIN_NR 20 #define IOC_MDC_LOOKUP _IOWR(IOC_MDC_TYPE, 20, struct obd_device *) +/* Moved to lustre_user.h +#define IOC_MDC_GETSTRIPE _IOWR(IOC_MDC_TYPE, 21, struct lov_mds_md *) */ +#define IOC_MDC_FINISH_GNS _IOWR(IOC_MDC_TYPE, 22, struct obd_device *) #define IOC_MDC_MAX_NR 50 #ifdef __KERNEL__ diff --git a/lustre/kernel_patches/patches/ext3-raw-lookup-pdirops.patch b/lustre/kernel_patches/patches/ext3-raw-lookup-pdirops.patch index 72a5156..3d4235b 100644 --- a/lustre/kernel_patches/patches/ext3-raw-lookup-pdirops.patch +++ b/lustre/kernel_patches/patches/ext3-raw-lookup-pdirops.patch @@ -2,20 +2,24 @@ include/linux/fs.h | 1 + 2 files changed, 32 insertions(+) ---- linux-2.4.18-p4smp1Guser/include/linux/fs.h~ext3-raw-lookup Thu Sep 25 15:59:59 2003 -+++ linux-2.4.18-p4smp1Guser-pschwan/include/linux/fs.h Thu Sep 25 15:59:59 2003 -@@ -911,6 +911,7 @@ struct inode_operations { +Index: lum/include/linux/fs.h +=================================================================== +--- lum.orig/include/linux/fs.h 2004-06-07 17:52:41.000000000 -0400 ++++ lum/include/linux/fs.h 2004-06-07 17:56:55.000000000 -0400 +@@ -904,6 +904,7 @@ int (*create) (struct inode *,struct dentry *,int); int (*create_it) (struct inode *,struct dentry *,int, struct lookup_intent *); struct dentry * (*lookup) (struct inode *,struct dentry *); + int (*lookup_raw) (struct inode *, const char *, int, ino_t *); - struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct lookup_intent *, int flags); + struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct nameidata *, struct lookup_intent *, int flags); int (*link) (struct dentry *,struct inode *,struct dentry *); int (*link_raw) (struct nameidata *,struct nameidata *); ---- linux-2.4.18-p4smp1Guser/fs/ext3/namei.c~ext3-raw-lookup Thu Sep 25 15:59:59 2003 -+++ linux-2.4.18-p4smp1Guser-pschwan/fs/ext3/namei.c Thu Sep 25 16:16:48 2003 -@@ -1121,6 +1121,36 @@ static struct dentry *ext3_lookup(struct - return NULL; +Index: lum/fs/ext3/namei.c +=================================================================== +--- lum.orig/fs/ext3/namei.c 2004-06-07 17:52:41.000000000 -0400 ++++ lum/fs/ext3/namei.c 2004-06-07 17:56:31.000000000 -0400 +@@ -1128,6 +1128,36 @@ + return iopen_connect_dentry(dentry, inode, 1); } +static int ext3_lookup_raw(struct inode *dir, const char *name, @@ -51,7 +55,7 @@ #define S_SHIFT 12 static unsigned char ext3_type_by_mode[S_IFMT >> S_SHIFT] = { [S_IFREG >> S_SHIFT] EXT3_FT_REG_FILE, -@@ -2623,6 +2653,7 @@ static inline void ext3_unlock_htree(str +@@ -2772,6 +2802,7 @@ struct inode_operations ext3_dir_inode_operations = { create: ext3_create, /* BKL held */ lookup: ext3_lookup, /* BKL held */ @@ -59,5 +63,3 @@ link: ext3_link, /* BKL held */ unlink: ext3_unlink, /* BKL held */ symlink: ext3_symlink, /* BKL held */ - -_ diff --git a/lustre/kernel_patches/patches/ext3-raw-lookup.patch b/lustre/kernel_patches/patches/ext3-raw-lookup.patch index 216accc..8bd09b6 100644 --- a/lustre/kernel_patches/patches/ext3-raw-lookup.patch +++ b/lustre/kernel_patches/patches/ext3-raw-lookup.patch @@ -2,20 +2,24 @@ include/linux/fs.h | 1 + 2 files changed, 30 insertions(+) ---- linux-2.4.20-vanilla/include/linux/fs.h~ext3-raw-lookup 2003-09-13 17:03:05.000000000 +0400 -+++ linux-2.4.20-vanilla-alexey/include/linux/fs.h 2003-09-15 10:16:38.000000000 +0400 -@@ -865,6 +865,7 @@ struct inode_operations { +Index: lum/include/linux/fs.h +=================================================================== +--- lum.orig/include/linux/fs.h 2004-06-07 17:25:40.000000000 -0400 ++++ lum/include/linux/fs.h 2004-06-07 17:26:11.000000000 -0400 +@@ -904,6 +904,7 @@ int (*create) (struct inode *,struct dentry *,int); int (*create_it) (struct inode *,struct dentry *,int, struct lookup_intent *); struct dentry * (*lookup) (struct inode *,struct dentry *); + int (*lookup_raw) (struct inode *, const char *, int, ino_t *); - struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct lookup_intent *, int flags); + struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct nameidata *, struct lookup_intent *, int flags); int (*link) (struct dentry *,struct inode *,struct dentry *); int (*link_raw) (struct nameidata *,struct nameidata *); ---- linux-2.4.20-vanilla/fs/ext3/namei.c~ext3-raw-lookup 2003-09-13 17:03:05.000000000 +0400 -+++ linux-2.4.20-vanilla-alexey/fs/ext3/namei.c 2003-09-15 10:18:52.000000000 +0400 -@@ -957,6 +957,34 @@ static struct dentry *ext3_lookup(struct - return NULL; +Index: lum/fs/ext3/namei.c +=================================================================== +--- lum.orig/fs/ext3/namei.c 2004-06-07 17:25:39.000000000 -0400 ++++ lum/fs/ext3/namei.c 2004-06-07 17:25:47.000000000 -0400 +@@ -1128,6 +1128,34 @@ + return iopen_connect_dentry(dentry, inode, 1); } +static int ext3_lookup_raw(struct inode *dir, const char *name, @@ -49,7 +53,7 @@ #define S_SHIFT 12 static unsigned char ext3_type_by_mode[S_IFMT >> S_SHIFT] = { [S_IFREG >> S_SHIFT] EXT3_FT_REG_FILE, -@@ -2247,6 +2275,7 @@ end_rename: +@@ -2772,6 +2800,7 @@ struct inode_operations ext3_dir_inode_operations = { create: ext3_create, /* BKL held */ lookup: ext3_lookup, /* BKL held */ @@ -57,5 +61,3 @@ link: ext3_link, /* BKL held */ unlink: ext3_unlink, /* BKL held */ symlink: ext3_symlink, /* BKL held */ - -_ diff --git a/lustre/kernel_patches/patches/lustre_version.patch b/lustre/kernel_patches/patches/lustre_version.patch index 1c5f97e..db9784b 100644 --- a/lustre/kernel_patches/patches/lustre_version.patch +++ b/lustre/kernel_patches/patches/lustre_version.patch @@ -6,9 +6,9 @@ Version 34: fix ext3 iopen assertion failure (b=2517, b=2399) include/linux/lustre_version.h | 1 + 1 files changed, 1 insertion(+) ---- /dev/null Fri Aug 30 17:31:37 2002 -+++ linux-2.4.18-18.8.0-l12-braam/include/linux/lustre_version.h Thu Feb 13 07:58:33 2003 +Index: lum/include/linux/lustre_version.h +=================================================================== +--- lum.orig/include/linux/lustre_version.h 2003-01-30 05:24:37.000000000 -0500 ++++ lum/include/linux/lustre_version.h 2004-06-07 17:19:23.000000000 -0400 @@ -0,0 +1 @@ -+#define LUSTRE_KERNEL_VERSION 37 - -_ ++#define LUSTRE_KERNEL_VERSION 500 diff --git a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.18.patch b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.18.patch index 51f581e..eae4623 100644 --- a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.18.patch +++ b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.18.patch @@ -163,7 +163,7 @@ +static struct dentry *lookup_it(struct inode *inode, struct dentry * dentry) +{ + if (inode->i_op->lookup_it) -+ return inode->i_op->lookup_it(inode, dentry, NULL, 0); ++ return inode->i_op->lookup_it(inode, dentry, NULL, NULL, 0); + else + return inode->i_op->lookup(inode, dentry); + @@ -403,7 +403,7 @@ + int err = 0; + + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, it) && ++ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it) && + !d_invalidate(dentry)) { + dput(dentry); + err = -EINVAL; diff --git a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.19-pre1.patch b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.19-pre1.patch index 7278b23..0e4acd0 100644 --- a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.19-pre1.patch +++ b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.19-pre1.patch @@ -175,7 +175,7 @@ Index: linux-2.4.19-pre1/fs/nfsd/nfsfh.c +static struct dentry *lookup_it(struct inode *inode, struct dentry * dentry) +{ + if (inode->i_op->lookup_it) -+ return inode->i_op->lookup_it(inode, dentry, NULL, 0); ++ return inode->i_op->lookup_it(inode, dentry, NULL, NULL, 0); + else + return inode->i_op->lookup(inode, dentry); + @@ -417,7 +417,7 @@ Index: linux-2.4.19-pre1/fs/nfsd/vfs.c + int err = 0; + + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, it) && ++ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it) && + !d_invalidate(dentry)) { + dput(dentry); + err = -EINVAL; diff --git a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.20-hp.patch b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.20-hp.patch index ea4734e..347b401 100644 --- a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.20-hp.patch +++ b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.20-hp.patch @@ -163,7 +163,7 @@ +static struct dentry *lookup_it(struct inode *inode, struct dentry * dentry) +{ + if (inode->i_op->lookup_it) -+ return inode->i_op->lookup_it(inode, dentry, NULL, 0); ++ return inode->i_op->lookup_it(inode, dentry, NULL, NULL, 0); + else + return inode->i_op->lookup(inode, dentry); + @@ -403,7 +403,7 @@ + int err = 0; + + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, it) && ++ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it) && + !d_invalidate(dentry)) { + dput(dentry); + err = -EINVAL; diff --git a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.20-rh.patch b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.20-rh.patch index 8ae5b78..99a5fb6 100644 --- a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.20-rh.patch +++ b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.20-rh.patch @@ -163,7 +163,7 @@ +static struct dentry *lookup_it(struct inode *inode, struct dentry * dentry) +{ + if (inode->i_op->lookup_it) -+ return inode->i_op->lookup_it(inode, dentry, NULL, 0); ++ return inode->i_op->lookup_it(inode, dentry, NULL, NULL, 0); + else + return inode->i_op->lookup(inode, dentry); + @@ -403,7 +403,7 @@ + int err = 0; + + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, it) && ++ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it) && + !d_invalidate(dentry)) { + dput(dentry); + err = -EINVAL; diff --git a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.20.patch b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.20.patch index bb7e378..4c67428 100644 --- a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.20.patch +++ b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.20.patch @@ -119,8 +119,8 @@ diff -uprN linux/fs/namei.c linux-2.4.20/fs/namei.c } this.hash = end_name_hash(hash); -- return lookup_hash_it(&this, base, NULL); -+ return lookup_hash_it(&this, base, it); +- return lookup_hash_it(&this, base, NULL, NULL); ++ return lookup_hash_it(&this, base, NULL, it); access: return ERR_PTR(-EACCES); } @@ -158,7 +158,7 @@ diff -uprN linux/fs/nfsd/nfsfh.c linux-2.4.20/fs/nfsd/nfsfh.c +static struct dentry *lookup_it(struct inode *inode, struct dentry * dentry) +{ + if (inode->i_op->lookup_it) -+ return inode->i_op->lookup_it(inode, dentry, NULL, 0); ++ return inode->i_op->lookup_it(inode, dentry, NULL, NULL, 0); + else + return inode->i_op->lookup(inode, dentry); + @@ -399,7 +399,7 @@ diff -uprN linux/fs/nfsd/vfs.c linux-2.4.20/fs/nfsd/vfs.c + int err = 0; + + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, it) && ++ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it) && + !d_invalidate(dentry)) { + dput(dentry); + err = -EINVAL; @@ -704,7 +704,7 @@ diff -uprN linux/include/linux/fs.h linux-2.4.20/include/linux/fs.h extern struct dentry * lookup_one_len(const char *, struct dentry *, int); +extern struct dentry * lookup_one_len_it(const char *, struct dentry *, int, + struct lookup_intent *); - extern struct dentry * lookup_hash(struct qstr *, struct dentry *); + extern struct dentry * lookup_hash(struct qstr *, struct dentry *, struct nameidata *); #define user_path_walk(name,nd) __user_walk(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd) #define user_path_walk_link(name,nd) __user_walk(name, LOOKUP_POSITIVE, nd) @@ -1382,6 +1390,8 @@ extern ino_t iunique(struct super_block diff --git a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.21-chaos.patch b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.21-chaos.patch index c2f0e2b..5d3064c 100644 --- a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.21-chaos.patch +++ b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.21-chaos.patch @@ -175,7 +175,7 @@ Index: linux-2.4.21-chaos/fs/nfsd/nfsfh.c +static struct dentry *lookup_it(struct inode *inode, struct dentry * dentry) +{ + if (inode->i_op->lookup_it) -+ return inode->i_op->lookup_it(inode, dentry, NULL, 0); ++ return inode->i_op->lookup_it(inode, dentry, NULL, NULL, 0); + else + return inode->i_op->lookup(inode, dentry); + @@ -417,7 +417,7 @@ Index: linux-2.4.21-chaos/fs/nfsd/vfs.c + int err = 0; + + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, it) && ++ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it) && + !d_invalidate(dentry)) { + dput(dentry); + err = -EINVAL; diff --git a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.21-suse2.patch b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.21-suse2.patch index c1ed0f3..f8fd564 100644 --- a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.21-suse2.patch +++ b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.21-suse2.patch @@ -175,7 +175,7 @@ Index: linux-2.4.21-chaos/fs/nfsd/nfsfh.c +static struct dentry *lookup_it(struct inode *inode, struct dentry * dentry) +{ + if (inode->i_op->lookup_it) -+ return inode->i_op->lookup_it(inode, dentry, NULL, 0); ++ return inode->i_op->lookup_it(inode, dentry, NULL, NULL, 0); + else + return inode->i_op->lookup(inode, dentry); + @@ -417,7 +417,7 @@ Index: linux-2.4.21-chaos/fs/nfsd/vfs.c + int err = 0; + + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, it) && ++ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it) && + !d_invalidate(dentry)) { + dput(dentry); + err = -EINVAL; diff --git a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.22-rh.patch b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.22-rh.patch index 40285b8..6e71334 100644 --- a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.22-rh.patch +++ b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.22-rh.patch @@ -163,7 +163,7 @@ +static struct dentry *lookup_it(struct inode *inode, struct dentry * dentry) +{ + if (inode->i_op->lookup_it) -+ return inode->i_op->lookup_it(inode, dentry, NULL, 0); ++ return inode->i_op->lookup_it(inode, dentry, NULL, NULL, 0); + else + return inode->i_op->lookup(inode, dentry); + @@ -403,7 +403,7 @@ + int err = 0; + + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, it) && ++ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it) && + !d_invalidate(dentry)) { + dput(dentry); + err = -EINVAL; diff --git a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.22.patch b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.22.patch index 3ca1abc..0aaea3c 100644 --- a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.22.patch +++ b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.22.patch @@ -1,7 +1,7 @@ -Index: linux-2.4.22-vanilla/fs/Makefile +Index: lum/fs/Makefile =================================================================== ---- linux-2.4.22-vanilla.orig/fs/Makefile 2003-11-03 23:41:40.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/Makefile 2003-11-03 23:45:07.000000000 +0300 +--- lum.orig/fs/Makefile 2004-06-07 17:25:22.000000000 -0400 ++++ lum/fs/Makefile 2004-06-07 17:25:22.000000000 -0400 @@ -7,7 +7,8 @@ O_TARGET := fs.o @@ -12,10 +12,10 @@ Index: linux-2.4.22-vanilla/fs/Makefile mod-subdirs := nls obj-y := open.o read_write.o devices.o file_table.o buffer.o \ -Index: linux-2.4.22-vanilla/fs/file_table.c +Index: lum/fs/file_table.c =================================================================== ---- linux-2.4.22-vanilla.orig/fs/file_table.c 2003-05-16 05:29:12.000000000 +0400 -+++ linux-2.4.22-vanilla/fs/file_table.c 2003-11-03 23:44:38.000000000 +0300 +--- lum.orig/fs/file_table.c 2002-11-28 18:53:15.000000000 -0500 ++++ lum/fs/file_table.c 2004-06-07 17:25:22.000000000 -0400 @@ -82,7 +82,8 @@ * and call the open function (if any). The caller must verify that * inode->i_fop is not NULL. @@ -47,11 +47,11 @@ Index: linux-2.4.22-vanilla/fs/file_table.c void fput(struct file * file) { -Index: linux-2.4.22-vanilla/fs/inode.c +Index: lum/fs/inode.c =================================================================== ---- linux-2.4.22-vanilla.orig/fs/inode.c 2003-11-03 23:25:33.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/inode.c 2003-11-03 23:44:38.000000000 +0300 -@@ -970,9 +970,10 @@ +--- lum.orig/fs/inode.c 2004-06-07 17:25:22.000000000 -0400 ++++ lum/fs/inode.c 2004-06-07 17:25:22.000000000 -0400 +@@ -1045,9 +1045,10 @@ } @@ -64,7 +64,7 @@ Index: linux-2.4.22-vanilla/fs/inode.c struct inode * inode; spin_lock(&inode_lock); -@@ -985,6 +986,24 @@ +@@ -1060,6 +1061,24 @@ } spin_unlock(&inode_lock); @@ -89,10 +89,10 @@ Index: linux-2.4.22-vanilla/fs/inode.c /* * get_new_inode() will do the right thing, re-trying the search * in case it had to block at any point. -Index: linux-2.4.22-vanilla/fs/namei.c +Index: lum/fs/namei.c =================================================================== ---- linux-2.4.22-vanilla.orig/fs/namei.c 2003-11-03 23:22:22.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/namei.c 2003-11-03 23:44:38.000000000 +0300 +--- lum.orig/fs/namei.c 2004-06-07 17:24:47.000000000 -0400 ++++ lum/fs/namei.c 2004-06-07 18:08:28.000000000 -0400 @@ -22,6 +22,7 @@ #include #include @@ -109,7 +109,7 @@ Index: linux-2.4.22-vanilla/fs/namei.c /* In order to reduce some races, while at the same time doing additional * checking and hopefully speeding things up, we copy filenames to the -@@ -902,7 +904,8 @@ +@@ -907,7 +909,8 @@ /* SMP-safe */ @@ -119,28 +119,28 @@ Index: linux-2.4.22-vanilla/fs/namei.c { unsigned long hash; struct qstr this; -@@ -922,11 +925,16 @@ +@@ -927,11 +930,16 @@ } this.hash = end_name_hash(hash); -- return lookup_hash_it(&this, base, NULL); -+ return lookup_hash_it(&this, base, it); +- return lookup_hash_it(&this, base, NULL, NULL); ++ return lookup_hash_it(&this, base, NULL, it); access: return ERR_PTR(-EACCES); } +struct dentry * lookup_one_len(const char * name, struct dentry * base, int len) +{ -+ return lookup_one_len_it(name, base, len, NULL); ++ return lookup_one_len_it(name, base, len, NULL); +} + /* * namei() * -Index: linux-2.4.22-vanilla/fs/nfsd/export.c +Index: lum/fs/nfsd/export.c =================================================================== ---- linux-2.4.22-vanilla.orig/fs/nfsd/export.c 2003-11-03 23:22:11.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/nfsd/export.c 2003-11-03 23:44:38.000000000 +0300 +--- lum.orig/fs/nfsd/export.c 2003-11-28 13:26:21.000000000 -0500 ++++ lum/fs/nfsd/export.c 2004-06-07 17:25:22.000000000 -0400 @@ -223,6 +223,11 @@ inode = nd.dentry->d_inode; dev = inode->i_dev; @@ -153,10 +153,10 @@ Index: linux-2.4.22-vanilla/fs/nfsd/export.c err = -EINVAL; exp = exp_get(clp, dev, ino); -Index: linux-2.4.22-vanilla/fs/nfsd/nfsfh.c +Index: lum/fs/nfsd/nfsfh.c =================================================================== ---- linux-2.4.22-vanilla.orig/fs/nfsd/nfsfh.c 2003-11-03 23:22:11.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/nfsd/nfsfh.c 2003-11-03 23:44:38.000000000 +0300 +--- lum.orig/fs/nfsd/nfsfh.c 2003-11-28 13:26:21.000000000 -0500 ++++ lum/fs/nfsd/nfsfh.c 2004-06-07 17:51:58.000000000 -0400 @@ -36,6 +36,15 @@ int sequence; /* sequence counter */ }; @@ -164,7 +164,7 @@ Index: linux-2.4.22-vanilla/fs/nfsd/nfsfh.c +static struct dentry *lookup_it(struct inode *inode, struct dentry * dentry) +{ + if (inode->i_op->lookup_it) -+ return inode->i_op->lookup_it(inode, dentry, NULL, 0); ++ return inode->i_op->lookup_it(inode, dentry, NULL, NULL, 0); + else + return inode->i_op->lookup(inode, dentry); + @@ -246,16 +246,16 @@ Index: linux-2.4.22-vanilla/fs/nfsd/nfsfh.c up(&child->d_inode->i_sem); d_drop(tdentry); /* we never want ".." hashed */ if (!pdentry && tdentry->d_inode == NULL) { -@@ -306,6 +349,8 @@ - igrab(tdentry->d_inode); +@@ -307,6 +350,8 @@ pdentry->d_flags |= DCACHE_NFSD_DISCONNECTED; + pdentry->d_op = child->d_op; } + if (child->d_op && child->d_op->d_revalidate_it) + pdentry->d_op = child->d_op; } if (pdentry == NULL) pdentry = ERR_PTR(-ENOMEM); -@@ -463,6 +508,8 @@ +@@ -464,6 +509,8 @@ struct dentry *pdentry; struct inode *parent; @@ -264,7 +264,7 @@ Index: linux-2.4.22-vanilla/fs/nfsd/nfsfh.c pdentry = nfsd_findparent(dentry); err = PTR_ERR(pdentry); if (IS_ERR(pdentry)) -@@ -669,6 +716,11 @@ +@@ -670,6 +717,11 @@ inode = dentry->d_inode; @@ -276,7 +276,7 @@ Index: linux-2.4.22-vanilla/fs/nfsd/nfsfh.c /* Type check. The correct error return for type mismatches * does not seem to be generally agreed upon. SunOS seems to * use EISDIR if file isn't S_IFREG; a comment in the NFSv3 -@@ -902,8 +954,9 @@ +@@ -903,8 +955,9 @@ dentry->d_parent->d_name.name, dentry->d_name.name); goto out; out_uptodate: @@ -288,10 +288,10 @@ Index: linux-2.4.22-vanilla/fs/nfsd/nfsfh.c goto out; } -Index: linux-2.4.22-vanilla/fs/nfsd/vfs.c +Index: lum/fs/nfsd/vfs.c =================================================================== ---- linux-2.4.22-vanilla.orig/fs/nfsd/vfs.c 2003-11-03 23:22:11.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/nfsd/vfs.c 2003-11-03 23:47:41.000000000 +0300 +--- lum.orig/fs/nfsd/vfs.c 2003-11-28 13:26:21.000000000 -0500 ++++ lum/fs/nfsd/vfs.c 2004-06-07 17:25:22.000000000 -0400 @@ -77,6 +77,128 @@ static struct raparms * raparml; static struct raparms * raparm_cache; @@ -406,7 +406,7 @@ Index: linux-2.4.22-vanilla/fs/nfsd/vfs.c + int err = 0; + + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, it) && ++ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it) && + !d_invalidate(dentry)) { + dput(dentry); + err = -EINVAL; @@ -682,10 +682,10 @@ Index: linux-2.4.22-vanilla/fs/nfsd/vfs.c } dput(rdentry); -Index: linux-2.4.22-vanilla/include/linux/fs.h +Index: lum/include/linux/fs.h =================================================================== ---- linux-2.4.22-vanilla.orig/include/linux/fs.h 2003-11-03 23:41:40.000000000 +0300 -+++ linux-2.4.22-vanilla/include/linux/fs.h 2003-11-03 23:44:38.000000000 +0300 +--- lum.orig/include/linux/fs.h 2004-06-07 17:25:22.000000000 -0400 ++++ lum/include/linux/fs.h 2004-06-07 17:25:22.000000000 -0400 @@ -93,6 +93,9 @@ #define FS_SINGLE 8 /* Filesystem that can have only one superblock */ #define FS_NOMOUNT 16 /* Never mount from userland */ @@ -696,7 +696,7 @@ Index: linux-2.4.22-vanilla/include/linux/fs.h #define FS_ODD_RENAME 32768 /* Temporary stuff; will go away as soon * as nfs_rename() will be cleaned up */ -@@ -1115,6 +1118,9 @@ +@@ -1122,6 +1125,9 @@ struct nameidata *nd, struct lookup_intent *it); extern struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt, int flags, struct lookup_intent *it); @@ -706,16 +706,16 @@ Index: linux-2.4.22-vanilla/include/linux/fs.h extern int filp_close(struct file *, fl_owner_t id); extern char * getname(const char *); -@@ -1411,6 +1417,8 @@ +@@ -1419,6 +1425,8 @@ extern int follow_down(struct vfsmount **, struct dentry **); extern int follow_up(struct vfsmount **, struct dentry **); extern struct dentry * lookup_one_len(const char *, struct dentry *, int); +extern struct dentry * lookup_one_len_it(const char *, struct dentry *, int, + struct lookup_intent *); - extern struct dentry * lookup_hash(struct qstr *, struct dentry *); + extern struct dentry * lookup_hash(struct qstr *, struct dentry *, struct nameidata *); #define user_path_walk(name,nd) __user_walk(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd) #define user_path_walk_link(name,nd) __user_walk(name, LOOKUP_POSITIVE, nd) -@@ -1425,6 +1433,8 @@ +@@ -1434,6 +1442,8 @@ typedef int (*find_inode_t)(struct inode *, unsigned long, void *); extern struct inode * iget4(struct super_block *, unsigned long, find_inode_t, void *); @@ -724,19 +724,19 @@ Index: linux-2.4.22-vanilla/include/linux/fs.h static inline struct inode *iget(struct super_block *sb, unsigned long ino) { return iget4(sb, ino, NULL, NULL); -Index: linux-2.4.22-vanilla/kernel/ksyms.c +Index: lum/kernel/ksyms.c =================================================================== ---- linux-2.4.22-vanilla.orig/kernel/ksyms.c 2003-11-03 23:41:40.000000000 +0300 -+++ linux-2.4.22-vanilla/kernel/ksyms.c 2003-11-03 23:44:38.000000000 +0300 -@@ -149,6 +149,7 @@ - EXPORT_SYMBOL(igrab); +--- lum.orig/kernel/ksyms.c 2004-06-07 17:25:22.000000000 -0400 ++++ lum/kernel/ksyms.c 2004-06-07 17:25:22.000000000 -0400 +@@ -150,6 +150,7 @@ EXPORT_SYMBOL(iunique); + EXPORT_SYMBOL(ilookup); EXPORT_SYMBOL(iget4); +EXPORT_SYMBOL(ilookup4); EXPORT_SYMBOL(iput); EXPORT_SYMBOL(inode_init_once); EXPORT_SYMBOL(force_delete); -@@ -160,6 +161,7 @@ +@@ -161,6 +162,7 @@ EXPORT_SYMBOL(path_release); EXPORT_SYMBOL(__user_walk); EXPORT_SYMBOL(lookup_one_len); diff --git a/lustre/kernel_patches/patches/vfs-pdirops-2.4.20-rh.patch b/lustre/kernel_patches/patches/vfs-pdirops-2.4.20-rh.patch index 6ab7a21..1d0f3b7 100644 --- a/lustre/kernel_patches/patches/vfs-pdirops-2.4.20-rh.patch +++ b/lustre/kernel_patches/patches/vfs-pdirops-2.4.20-rh.patch @@ -3,13 +3,13 @@ include/linux/fs.h | 11 ++++---- 3 files changed, 54 insertions(+), 24 deletions(-) -Index: linux-2.4.20-rh/fs/namei.c +Index: lum/fs/namei.c =================================================================== ---- linux-2.4.20-rh.orig/fs/namei.c 2003-09-04 20:58:33.000000000 +0800 -+++ linux-2.4.20-rh/fs/namei.c 2003-09-04 21:21:20.000000000 +0800 -@@ -101,6 +101,36 @@ - +--- lum.orig/fs/namei.c 2004-06-07 17:19:45.000000000 -0400 ++++ lum/fs/namei.c 2004-06-07 17:22:39.000000000 -0400 +@@ -103,6 +103,36 @@ } + EXPORT_SYMBOL(intent_release); +static void *lock_dir(struct inode *dir, struct qstr *name) +{ @@ -44,7 +44,7 @@ Index: linux-2.4.20-rh/fs/namei.c /* In order to reduce some races, while at the same time doing additional * checking and hopefully speeding things up, we copy filenames to the * kernel data space before using them.. -@@ -303,10 +333,11 @@ +@@ -307,10 +337,11 @@ struct dentry * result; struct inode *dir = parent->d_inode; int counter = 0; @@ -57,7 +57,7 @@ Index: linux-2.4.20-rh/fs/namei.c /* * First re-do the cached lookup just in case it was created * while we waited for the directory semaphore.. -@@ -329,7 +359,7 @@ +@@ -334,7 +365,7 @@ else result = dentry; } @@ -66,7 +66,7 @@ Index: linux-2.4.20-rh/fs/namei.c return result; } -@@ -337,7 +367,7 @@ +@@ -342,7 +373,7 @@ * Uhhuh! Nasty case: the cache was re-populated while * we waited on the semaphore. Need to revalidate. */ @@ -75,13 +75,13 @@ Index: linux-2.4.20-rh/fs/namei.c if (result->d_op && result->d_op->d_revalidate) { if (!result->d_op->d_revalidate(result, flags) && !d_invalidate(result)) { dput(result); -@@ -1180,13 +1210,13 @@ +@@ -1169,13 +1200,13 @@ goto exit; dir = nd->dentry; - down(&dir->d_inode->i_sem); + nd->lock = lock_dir(dir->d_inode, &nd->last); - dentry = lookup_hash_it(&nd->last, nd->dentry, it); + dentry = lookup_hash_it(&nd->last, nd->dentry, nd, it); do_last: error = PTR_ERR(dentry); @@ -91,7 +91,7 @@ Index: linux-2.4.20-rh/fs/namei.c goto exit; } -@@ -1195,7 +1225,7 @@ +@@ -1184,7 +1215,7 @@ if (!dentry->d_inode) { error = vfs_create_it(dir->d_inode, dentry, mode & ~current->fs->umask, it); @@ -100,7 +100,7 @@ Index: linux-2.4.20-rh/fs/namei.c dput(nd->dentry); nd->dentry = dentry; if (error) -@@ -1209,7 +1239,7 @@ +@@ -1198,7 +1229,7 @@ /* * It already exists. */ @@ -109,16 +109,16 @@ Index: linux-2.4.20-rh/fs/namei.c error = -EEXIST; if (flag & O_EXCL) -@@ -1362,7 +1392,7 @@ +@@ -1345,7 +1376,7 @@ goto exit; } dir = nd->dentry; - down(&dir->d_inode->i_sem); + nd->lock = lock_dir(dir->d_inode, &nd->last); - dentry = lookup_hash_it(&nd->last, nd->dentry, it); + dentry = lookup_hash_it(&nd->last, nd->dentry, nd, it); putname(nd->last.name); goto do_last; -@@ -1380,7 +1410,7 @@ +@@ -1363,7 +1394,7 @@ { struct dentry *dentry; @@ -127,7 +127,7 @@ Index: linux-2.4.20-rh/fs/namei.c dentry = ERR_PTR(-EEXIST); if (nd->last_type != LAST_NORM) goto fail; -@@ -1469,7 +1499,7 @@ +@@ -1456,7 +1487,7 @@ } dput(dentry); } @@ -136,7 +136,7 @@ Index: linux-2.4.20-rh/fs/namei.c out2: path_release(&nd); out: -@@ -1532,7 +1562,7 @@ +@@ -1523,7 +1554,7 @@ mode & ~current->fs->umask); dput(dentry); } @@ -145,13 +145,13 @@ Index: linux-2.4.20-rh/fs/namei.c out2: path_release(&nd); out: -@@ -1642,14 +1672,14 @@ +@@ -1633,14 +1664,14 @@ if (error != -EOPNOTSUPP) goto exit1; } - down(&nd.dentry->d_inode->i_sem); + nd.lock = lock_dir(nd.dentry->d_inode, &nd.last); - dentry = lookup_hash_it(&nd.last, nd.dentry, NULL); + dentry = lookup_hash_it(&nd.last, nd.dentry, &nd, NULL); error = PTR_ERR(dentry); if (!IS_ERR(dentry)) { error = vfs_rmdir(nd.dentry->d_inode, dentry); @@ -162,16 +162,16 @@ Index: linux-2.4.20-rh/fs/namei.c exit1: path_release(&nd); exit: -@@ -1708,7 +1738,7 @@ +@@ -1699,7 +1730,7 @@ if (error != -EOPNOTSUPP) goto exit1; } - down(&nd.dentry->d_inode->i_sem); + nd.lock = lock_dir(nd.dentry->d_inode, &nd.last); - dentry = lookup_hash_it(&nd.last, nd.dentry, NULL); + dentry = lookup_hash_it(&nd.last, nd.dentry, &nd, NULL); error = PTR_ERR(dentry); if (!IS_ERR(dentry)) { -@@ -1719,7 +1749,7 @@ +@@ -1710,7 +1741,7 @@ exit2: dput(dentry); } @@ -180,7 +180,7 @@ Index: linux-2.4.20-rh/fs/namei.c exit1: path_release(&nd); exit: -@@ -1789,7 +1819,7 @@ +@@ -1784,7 +1815,7 @@ error = vfs_symlink(nd.dentry->d_inode, dentry, from); dput(dentry); } @@ -189,7 +189,7 @@ Index: linux-2.4.20-rh/fs/namei.c out2: path_release(&nd); out: -@@ -1881,7 +1911,7 @@ +@@ -1880,7 +1911,7 @@ error = vfs_link(old_nd.dentry, nd.dentry->d_inode, new_dentry); dput(new_dentry); } @@ -198,10 +198,22 @@ Index: linux-2.4.20-rh/fs/namei.c out_release: path_release(&nd); out: -Index: linux-2.4.20-rh/include/linux/fs.h +Index: lum/fs/inode.c +=================================================================== +--- lum.orig/fs/inode.c 2004-06-07 17:19:45.000000000 -0400 ++++ lum/fs/inode.c 2004-06-07 17:21:10.000000000 -0400 +@@ -119,6 +119,7 @@ + mapping->host = inode; + mapping->gfp_mask = GFP_HIGHUSER; + inode->i_mapping = mapping; ++ dynlock_init(&inode->i_dcache_lock); + } + return inode; + } +Index: lum/include/linux/fs.h =================================================================== ---- linux-2.4.20-rh.orig/include/linux/fs.h 2003-09-04 20:59:14.000000000 +0800 -+++ linux-2.4.20-rh/include/linux/fs.h 2003-09-04 21:03:46.000000000 +0800 +--- lum.orig/include/linux/fs.h 2004-06-07 17:19:45.000000000 -0400 ++++ lum/include/linux/fs.h 2004-06-07 17:21:10.000000000 -0400 @@ -21,6 +21,7 @@ #include #include @@ -210,7 +222,7 @@ Index: linux-2.4.20-rh/include/linux/fs.h #include #include -@@ -136,6 +137,7 @@ +@@ -139,6 +140,7 @@ #define S_IMMUTABLE 16 /* Immutable file */ #define S_DEAD 32 /* removed, but still open directory */ #define S_NOQUOTA 64 /* Inode is not counted to quota */ @@ -218,7 +230,7 @@ Index: linux-2.4.20-rh/include/linux/fs.h /* * Note that nosuid etc flags are inode-specific: setting some file-system -@@ -162,6 +164,7 @@ +@@ -165,6 +167,7 @@ #define IS_IMMUTABLE(inode) ((inode)->i_flags & S_IMMUTABLE) #define IS_NOATIME(inode) (__IS_FLG(inode, MS_NOATIME) || ((inode)->i_flags & S_NOATIME)) #define IS_NODIRATIME(inode) __IS_FLG(inode, MS_NODIRATIME) @@ -226,7 +238,7 @@ Index: linux-2.4.20-rh/include/linux/fs.h #define IS_DEADDIR(inode) ((inode)->i_flags & S_DEAD) -@@ -489,6 +492,7 @@ +@@ -500,6 +503,7 @@ atomic_t i_writecount; unsigned int i_attr_flags; __u32 i_generation; @@ -234,7 +246,7 @@ Index: linux-2.4.20-rh/include/linux/fs.h union { struct minix_inode_info minix_i; struct ext2_inode_info ext2_i; -@@ -708,6 +712,7 @@ +@@ -714,6 +718,7 @@ unsigned int flags; int last_type; struct lookup_intent *intent; @@ -242,7 +254,7 @@ Index: linux-2.4.20-rh/include/linux/fs.h }; /* -@@ -1621,12 +1626,6 @@ +@@ -1631,12 +1636,6 @@ return dget(dentry->d_parent); } @@ -255,15 +267,3 @@ Index: linux-2.4.20-rh/include/linux/fs.h /* * Whee.. Deadlock country. Happily there are only two VFS * operations that does this.. -Index: linux-2.4.20-rh/fs/inode.c -=================================================================== ---- linux-2.4.20-rh.orig/fs/inode.c 2003-09-04 20:58:35.000000000 +0800 -+++ linux-2.4.20-rh/fs/inode.c 2003-09-04 21:03:46.000000000 +0800 -@@ -121,6 +121,7 @@ - mapping->host = inode; - mapping->gfp_mask = GFP_HIGHUSER; - inode->i_mapping = mapping; -+ dynlock_init(&inode->i_dcache_lock); - } - return inode; - } diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.19-pre1.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.19-pre1.patch index 4dd96bc..d6861d8 100644 --- a/lustre/kernel_patches/patches/vfs_intent-2.4.19-pre1.patch +++ b/lustre/kernel_patches/patches/vfs_intent-2.4.19-pre1.patch @@ -148,7 +148,7 @@ Index: linux-2.4.19-pre1/fs/namei.c struct dentry * dentry = d_lookup(parent, name); + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, flags, it) && ++ if (!dentry->d_op->d_revalidate_it(dentry, flags, NULL, it) && + !d_invalidate(dentry)) { + dput(dentry); + dentry = NULL; @@ -180,7 +180,7 @@ Index: linux-2.4.19-pre1/fs/namei.c if (dentry) { lock_kernel(); + if (dir->i_op->lookup_it) -+ result = dir->i_op->lookup_it(dir, dentry, it, flags); ++ result = dir->i_op->lookup_it(dir, dentry, NULL, it, flags); + else result = dir->i_op->lookup(dir, dentry); unlock_kernel(); @@ -190,7 +190,7 @@ Index: linux-2.4.19-pre1/fs/namei.c result = ERR_PTR(-ENOENT); } + } else if (result->d_op && result->d_op->d_revalidate_it) { -+ if (!result->d_op->d_revalidate_it(result, flags, it) && ++ if (!result->d_op->d_revalidate_it(result, flags, NULL, it) && + !d_invalidate(result)) { + dput(result); + if (counter > 10) @@ -325,7 +325,7 @@ Index: linux-2.4.19-pre1/fs/namei.c + dentry = nd->dentry; + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { + err = -ESTALE; -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, it)) { ++ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it)) { + struct dentry *new; + err = permission(dentry->d_parent->d_inode, + MAY_EXEC); @@ -414,7 +414,7 @@ Index: linux-2.4.19-pre1/fs/namei.c goto out; lock_kernel(); + if (inode->i_op->lookup_it) -+ dentry = inode->i_op->lookup_it(inode, new, it, 0); ++ dentry = inode->i_op->lookup_it(inode, new, NULL, it, 0); + else dentry = inode->i_op->lookup(inode, new); unlock_kernel(); @@ -614,7 +614,7 @@ Index: linux-2.4.19-pre1/fs/namei.c + /* SMP-safe */ -static struct dentry *lookup_create(struct nameidata *nd, int is_dir) -+static struct dentry *lookup_create(struct nameidata *nd, int is_dir, ++struct dentry *lookup_create(struct nameidata *nd, int is_dir, + struct lookup_intent *it) { struct dentry *dentry; @@ -901,6 +901,15 @@ Index: linux-2.4.19-pre1/fs/namespace.c list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry)); list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts); nd->dentry->d_mounted++; +@@ -286,7 +293,7 @@ + } + } + +-static int do_umount(struct vfsmount *mnt, int flags) ++int do_umount(struct vfsmount *mnt, int flags) + { + struct super_block * sb = mnt->mnt_sb; + int retval = 0; @@ -500,15 +502,18 @@ { struct nameidata old_nd; @@ -1576,7 +1585,7 @@ Index: linux-2.4.19-pre1/include/linux/dcache.h =================================================================== --- linux-2.4.19-pre1.orig/include/linux/dcache.h 2003-11-21 02:41:00.000000000 +0300 +++ linux-2.4.19-pre1/include/linux/dcache.h 2003-11-21 02:51:38.000000000 +0300 -@@ -5,6 +5,51 @@ +@@ -5,6 +5,52 @@ #include #include @@ -1591,6 +1600,7 @@ Index: linux-2.4.19-pre1/include/linux/dcache.h +#define IT_GETXATTR 0x0040 +#define IT_EXEC 0x0080 +#define IT_PIN 0x0100 ++#define IT_CHDIR 0x0200 + +#define IT_FL_LOCKED 0x0001 +#define IT_FL_FOLLOWED 0x0002 /* set by vfs_follow_link */ @@ -1628,11 +1638,20 @@ Index: linux-2.4.19-pre1/include/linux/dcache.h /* * linux/include/linux/dcache.h +@@ -84,6 +130,8 @@ + unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */ + }; + ++struct nameidata; ++ + struct dentry_operations { + int (*d_revalidate)(struct dentry *, int); + int (*d_hash) (struct dentry *, struct qstr *); @@ -90,8 +135,22 @@ int (*d_delete)(struct dentry *); void (*d_release)(struct dentry *); void (*d_iput)(struct dentry *, struct inode *); -+ int (*d_revalidate_it)(struct dentry *, int, struct lookup_intent *); ++ int (*d_revalidate_it)(struct dentry *, int, struct nameidata *, struct lookup_intent *); + void (*d_pin)(struct dentry *, struct vfsmount * , int); + void (*d_unpin)(struct dentry *, struct vfsmount *, int); }; @@ -1721,7 +1740,7 @@ Index: linux-2.4.19-pre1/include/linux/fs.h int (*create) (struct inode *,struct dentry *,int); + int (*create_it) (struct inode *,struct dentry *,int, struct lookup_intent *); struct dentry * (*lookup) (struct inode *,struct dentry *); -+ struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct lookup_intent *, int flags); ++ struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct nameidata *, struct lookup_intent *, int flags); int (*link) (struct dentry *,struct inode *,struct dentry *); + int (*link_raw) (struct nameidata *,struct nameidata *); int (*unlink) (struct inode *,struct dentry *); @@ -1748,12 +1767,22 @@ Index: linux-2.4.19-pre1/include/linux/fs.h int (*getattr) (struct dentry *, struct iattr *); }; -@@ -1049,10 +1068,14 @@ +@@ -938,6 +957,7 @@ + int (*remount_fs) (struct super_block *, int *, char *); + void (*clear_inode) (struct inode *); + void (*umount_begin) (struct super_block *); ++ void (*umount_lustre) (struct super_block *); + + /* Following are for knfsd to interact with "interesting" filesystems + * Currently just reiserfs, but possibly FAT and others later +@@ -1049,10 +1068,16 @@ asmlinkage long sys_open(const char *, int, int); asmlinkage long sys_close(unsigned int); /* yes, it's really unsigned */ -extern int do_truncate(struct dentry *, loff_t start); +extern int do_truncate(struct dentry *, loff_t start, int called_from_open); ++struct dentry *lookup_create(struct nameidata *nd, int is_dir, ++ struct lookup_intent *it); extern struct file *filp_open(const char *, int, int); extern struct file * dentry_open(struct dentry *, struct vfsmount *, int); @@ -1861,11 +1890,33 @@ Index: linux-2.4.19-pre1/kernel/ksyms.c =================================================================== --- linux-2.4.19-pre1.orig/kernel/ksyms.c 2003-11-21 02:51:37.000000000 +0300 +++ linux-2.4.19-pre1/kernel/ksyms.c 2003-11-21 02:51:38.000000000 +0300 -@@ -260,6 +260,7 @@ +@@ -260,6 +260,9 @@ EXPORT_SYMBOL(set_page_dirty); EXPORT_SYMBOL(vfs_readlink); EXPORT_SYMBOL(vfs_follow_link); +EXPORT_SYMBOL(vfs_follow_link_it); ++EXPORT_SYMBOL(do_umount); ++EXPORT_SYMBOL(lookup_create); EXPORT_SYMBOL(page_readlink); EXPORT_SYMBOL(page_follow_link); EXPORT_SYMBOL(page_symlink_inode_operations); +===== include/linux/mount.h 1.7 vs edited ===== +--- linux-2.4.19-pre1.orig/include/linux/mount.h Tue Feb 5 09:49:35 2002 ++++ linux-2.4.19-pre1/include/linux/mount.h Tue May 4 19:23:48 2004 +@@ -29,6 +29,8 @@ + int mnt_flags; + char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */ + struct list_head mnt_list; ++ struct list_head mnt_lustre_list; /* GNS mount list */ ++ unsigned long mnt_last_used; /* for GNS auto-umount (jiffies) */ + }; + + static inline struct vfsmount *mntget(struct vfsmount *mnt) +@@ -39,6 +39,7 @@ + } + + extern void __mntput(struct vfsmount *mnt); ++extern int do_umount(struct vfsmount *mnt, int flags); + + static inline void mntput(struct vfsmount *mnt) + { diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.19-suse.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.19-suse.patch index d8e28ca..54b239e 100644 --- a/lustre/kernel_patches/patches/vfs_intent-2.4.19-suse.patch +++ b/lustre/kernel_patches/patches/vfs_intent-2.4.19-suse.patch @@ -148,7 +148,7 @@ Index: linux-2.4.19.SuSE/fs/namei.c struct dentry * dentry = d_lookup(parent, name); + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, flags, it) && ++ if (!dentry->d_op->d_revalidate_it(dentry, flags, NULL, it) && + !d_invalidate(dentry)) { + dput(dentry); + dentry = NULL; @@ -180,7 +180,7 @@ Index: linux-2.4.19.SuSE/fs/namei.c if (dentry) { lock_kernel(); + if (dir->i_op->lookup_it) -+ result = dir->i_op->lookup_it(dir, dentry, it, flags); ++ result = dir->i_op->lookup_it(dir, dentry, NULL, it, flags); + else result = dir->i_op->lookup(dir, dentry); unlock_kernel(); @@ -190,7 +190,7 @@ Index: linux-2.4.19.SuSE/fs/namei.c result = ERR_PTR(-ENOENT); } + } else if (result->d_op && result->d_op->d_revalidate_it) { -+ if (!result->d_op->d_revalidate_it(result, flags, it) && ++ if (!result->d_op->d_revalidate_it(result, flags, NULL, it) && + !d_invalidate(result)) { + dput(result); + if (counter > 10) @@ -308,7 +308,7 @@ Index: linux-2.4.19.SuSE/fs/namei.c dentry = nd->dentry; + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { + err = -ESTALE; -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, it)) { ++ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it)) { + struct dentry *new; + err = permission(dentry->d_parent->d_inode, + MAY_EXEC); @@ -391,7 +391,7 @@ Index: linux-2.4.19.SuSE/fs/namei.c goto out; lock_kernel(); + if (inode->i_op->lookup_it) -+ dentry = inode->i_op->lookup_it(inode, new, it, 0); ++ dentry = inode->i_op->lookup_it(inode, new, NULL, it, 0); + else dentry = inode->i_op->lookup(inode, new); unlock_kernel(); @@ -592,7 +592,7 @@ Index: linux-2.4.19.SuSE/fs/namei.c + /* SMP-safe */ -static struct dentry *lookup_create(struct nameidata *nd, int is_dir) -+static struct dentry *lookup_create(struct nameidata *nd, int is_dir, ++struct dentry *lookup_create(struct nameidata *nd, int is_dir, + struct lookup_intent *it) { struct dentry *dentry; @@ -879,6 +879,15 @@ Index: linux-2.4.19.SuSE/fs/namespace.c list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry)); list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts); nd->dentry->d_mounted++; +@@ -286,7 +293,7 @@ + } + } + +-static int do_umount(struct vfsmount *mnt, int flags) ++int do_umount(struct vfsmount *mnt, int flags) + { + struct super_block * sb = mnt->mnt_sb; + int retval = 0; @@ -491,15 +493,18 @@ { struct nameidata old_nd; @@ -1556,7 +1565,7 @@ Index: linux-2.4.19.SuSE/include/linux/dcache.h =================================================================== --- linux-2.4.19.SuSE.orig/include/linux/dcache.h Mon Jan 27 05:13:15 2003 +++ linux-2.4.19.SuSE/include/linux/dcache.h Sat Nov 15 17:35:46 2003 -@@ -5,6 +5,51 @@ +@@ -5,6 +5,52 @@ #include #include @@ -1571,6 +1580,7 @@ Index: linux-2.4.19.SuSE/include/linux/dcache.h +#define IT_GETXATTR 0x0040 +#define IT_EXEC 0x0080 +#define IT_PIN 0x0100 ++#define IT_CHDIR 0x0200 + +#define IT_FL_LOCKED 0x0001 +#define IT_FL_FOLLOWED 0x0002 /* set by vfs_follow_link */ @@ -1608,11 +1618,20 @@ Index: linux-2.4.19.SuSE/include/linux/dcache.h /* * linux/include/linux/dcache.h +@@ -84,6 +130,8 @@ + unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */ + }; + ++struct nameidata; ++ + struct dentry_operations { + int (*d_revalidate)(struct dentry *, int); + int (*d_hash) (struct dentry *, struct qstr *); @@ -92,8 +137,22 @@ int (*d_delete)(struct dentry *); void (*d_release)(struct dentry *); void (*d_iput)(struct dentry *, struct inode *); -+ int (*d_revalidate_it)(struct dentry *, int, struct lookup_intent *); ++ int (*d_revalidate_it)(struct dentry *, int, struct nameidata *, struct lookup_intent *); + void (*d_pin)(struct dentry *, struct vfsmount * , int); + void (*d_unpin)(struct dentry *, struct vfsmount *, int); }; @@ -1701,7 +1720,7 @@ Index: linux-2.4.19.SuSE/include/linux/fs.h int (*create) (struct inode *,struct dentry *,int); + int (*create_it) (struct inode *,struct dentry *,int, struct lookup_intent *); struct dentry * (*lookup) (struct inode *,struct dentry *); -+ struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct lookup_intent *, int flags); ++ struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct nameidata *, struct lookup_intent *, int flags); int (*link) (struct dentry *,struct inode *,struct dentry *); + int (*link_raw) (struct nameidata *,struct nameidata *); int (*unlink) (struct inode *,struct dentry *); @@ -1728,12 +1747,22 @@ Index: linux-2.4.19.SuSE/include/linux/fs.h int (*getattr) (struct dentry *, struct iattr *); int (*setxattr) (struct dentry *, const char *, const void *, size_t, int); ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); -@@ -1244,10 +1263,14 @@ +@@ -938,6 +957,7 @@ + int (*remount_fs) (struct super_block *, int *, char *); + void (*clear_inode) (struct inode *); + void (*umount_begin) (struct super_block *); ++ void (*umount_lustre) (struct super_block *); + + /* Following are for knfsd to interact with "interesting" filesystems + * Currently just reiserfs, but possibly FAT and others later +@@ -1244,10 +1263,16 @@ asmlinkage long sys_open(const char *, int, int); asmlinkage long sys_close(unsigned int); /* yes, it's really unsigned */ -extern int do_truncate(struct dentry *, loff_t start); +extern int do_truncate(struct dentry *, loff_t start, int called_from_open); ++struct dentry *lookup_create(struct nameidata *nd, int is_dir, ++ struct lookup_intent *it); extern struct file *filp_open(const char *, int, int); extern struct file * dentry_open(struct dentry *, struct vfsmount *, int); @@ -1841,11 +1870,33 @@ Index: linux-2.4.19.SuSE/kernel/ksyms.c =================================================================== --- linux-2.4.19.SuSE.orig/kernel/ksyms.c Sat Nov 15 17:24:46 2003 +++ linux-2.4.19.SuSE/kernel/ksyms.c Sat Nov 15 17:29:03 2003 -@@ -315,6 +315,7 @@ +@@ -315,6 +315,9 @@ EXPORT_SYMBOL(set_page_dirty); EXPORT_SYMBOL(vfs_readlink); EXPORT_SYMBOL(vfs_follow_link); +EXPORT_SYMBOL(vfs_follow_link_it); ++EXPORT_SYMBOL(do_umount); ++EXPORT_SYMBOL(lookup_create); EXPORT_SYMBOL(page_readlink); EXPORT_SYMBOL(page_follow_link); EXPORT_SYMBOL(page_symlink_inode_operations); +===== include/linux/mount.h 1.7 vs edited ===== +--- linux-2.4.19.SuSE.orig/include/linux/mount.h Tue Feb 5 09:49:35 2002 ++++ linux-2.4.19.SuSE/include/linux/mount.h Tue May 4 19:23:48 2004 +@@ -29,6 +29,8 @@ + int mnt_flags; + char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */ + struct list_head mnt_list; ++ struct list_head mnt_lustre_list; /* GNS mount list */ ++ unsigned long mnt_last_used; /* for GNS auto-umount (jiffies) */ + }; + + static inline struct vfsmount *mntget(struct vfsmount *mnt) +@@ -39,6 +39,7 @@ + } + + extern void __mntput(struct vfsmount *mnt); ++extern int do_umount(struct vfsmount *mnt, int flags); + + static inline void mntput(struct vfsmount *mnt) + { diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.20-hp.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.20-hp.patch index 2af2a04..cf07450 100644 --- a/lustre/kernel_patches/patches/vfs_intent-2.4.20-hp.patch +++ b/lustre/kernel_patches/patches/vfs_intent-2.4.20-hp.patch @@ -148,7 +148,7 @@ Index: linux/fs/namei.c struct dentry * dentry = d_lookup(parent, name); + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, flags, it) && ++ if (!dentry->d_op->d_revalidate_it(dentry, flags, NULL, it) && + !d_invalidate(dentry)) { + dput(dentry); + dentry = NULL; @@ -180,7 +180,7 @@ Index: linux/fs/namei.c if (dentry) { lock_kernel(); + if (dir->i_op->lookup_it) -+ result = dir->i_op->lookup_it(dir, dentry, it, flags); ++ result = dir->i_op->lookup_it(dir, dentry, NULL, it, flags); + else result = dir->i_op->lookup(dir, dentry); unlock_kernel(); @@ -190,7 +190,7 @@ Index: linux/fs/namei.c result = ERR_PTR(-ENOENT); } + } else if (result->d_op && result->d_op->d_revalidate_it) { -+ if (!result->d_op->d_revalidate_it(result, flags, it) && ++ if (!result->d_op->d_revalidate_it(result, flags, NULL, it) && + !d_invalidate(result)) { + dput(result); + if (counter > 10) @@ -363,7 +363,7 @@ Index: linux/fs/namei.c dentry = nd->dentry; + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { + err = -ESTALE; -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, it)) { ++ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it)) { + struct dentry *new; + err = permission(dentry->d_parent->d_inode, + MAY_EXEC); @@ -464,7 +464,7 @@ Index: linux/fs/namei.c goto out; lock_kernel(); + if (inode->i_op->lookup_it) -+ dentry = inode->i_op->lookup_it(inode, new, it, 0); ++ dentry = inode->i_op->lookup_it(inode, new, NULL, it, 0); + else dentry = inode->i_op->lookup(inode, new); unlock_kernel(); @@ -679,7 +679,7 @@ Index: linux/fs/namei.c + /* SMP-safe */ -static struct dentry *lookup_create(struct nameidata *nd, int is_dir) -+static struct dentry *lookup_create(struct nameidata *nd, int is_dir, ++struct dentry *lookup_create(struct nameidata *nd, int is_dir, + struct lookup_intent *it) { struct dentry *dentry; @@ -968,6 +968,15 @@ Index: linux/fs/namespace.c list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry)); list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts); nd->dentry->d_mounted++; +@@ -286,7 +293,7 @@ + } + } + +-static int do_umount(struct vfsmount *mnt, int flags) ++int do_umount(struct vfsmount *mnt, int flags) + { + struct super_block * sb = mnt->mnt_sb; + int retval = 0; @@ -485,14 +487,17 @@ { struct nameidata old_nd; @@ -1646,7 +1655,7 @@ Index: linux/include/linux/dcache.h =================================================================== --- linux.orig/include/linux/dcache.h Thu Nov 28 18:53:15 2002 +++ linux/include/linux/dcache.h Wed Mar 17 13:11:25 2004 -@@ -6,6 +6,51 @@ +@@ -6,6 +6,52 @@ #include #include #include @@ -1661,6 +1670,7 @@ Index: linux/include/linux/dcache.h +#define IT_GETXATTR 0x0040 +#define IT_EXEC 0x0080 +#define IT_PIN 0x0100 ++#define IT_CHDIR 0x0200 + +#define IT_FL_LOCKED 0x0001 +#define IT_FL_FOLLOWED 0x0002 /* set by vfs_follow_link */ @@ -1698,11 +1708,20 @@ Index: linux/include/linux/dcache.h /* * linux/include/linux/dcache.h +@@ -84,6 +130,8 @@ + unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */ + }; + ++struct nameidata; ++ + struct dentry_operations { + int (*d_revalidate)(struct dentry *, int); + int (*d_hash) (struct dentry *, struct qstr *); @@ -91,8 +136,22 @@ int (*d_delete)(struct dentry *); void (*d_release)(struct dentry *); void (*d_iput)(struct dentry *, struct inode *); -+ int (*d_revalidate_it)(struct dentry *, int, struct lookup_intent *); ++ int (*d_revalidate_it)(struct dentry *, int, struct nameidata *, struct lookup_intent *); + void (*d_pin)(struct dentry *, struct vfsmount * , int); + void (*d_unpin)(struct dentry *, struct vfsmount *, int); }; @@ -1791,7 +1810,7 @@ Index: linux/include/linux/fs.h int (*create) (struct inode *,struct dentry *,int); + int (*create_it) (struct inode *,struct dentry *,int, struct lookup_intent *); struct dentry * (*lookup) (struct inode *,struct dentry *); -+ struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct lookup_intent *, int flags); ++ struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct nameidata *, struct lookup_intent *, int flags); int (*link) (struct dentry *,struct inode *,struct dentry *); + int (*link_raw) (struct nameidata *,struct nameidata *); int (*unlink) (struct inode *,struct dentry *); @@ -1818,12 +1837,22 @@ Index: linux/include/linux/fs.h int (*getattr) (struct dentry *, struct iattr *); int (*setxattr) (struct dentry *, const char *, void *, size_t, int); ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); -@@ -1088,10 +1107,14 @@ +@@ -938,6 +957,7 @@ + int (*remount_fs) (struct super_block *, int *, char *); + void (*clear_inode) (struct inode *); + void (*umount_begin) (struct super_block *); ++ void (*umount_lustre) (struct super_block *); + + /* Following are for knfsd to interact with "interesting" filesystems + * Currently just reiserfs, but possibly FAT and others later +@@ -1088,10 +1107,16 @@ asmlinkage long sys_open(const char *, int, int); asmlinkage long sys_close(unsigned int); /* yes, it's really unsigned */ -extern int do_truncate(struct dentry *, loff_t start); +extern int do_truncate(struct dentry *, loff_t start, int called_from_open); ++struct dentry *lookup_create(struct nameidata *nd, int is_dir, ++ struct lookup_intent *it); extern struct file *filp_open(const char *, int, int); extern struct file * dentry_open(struct dentry *, struct vfsmount *, int); @@ -1931,11 +1960,33 @@ Index: linux/kernel/ksyms.c =================================================================== --- linux.orig/kernel/ksyms.c Wed Mar 17 13:11:23 2004 +++ linux/kernel/ksyms.c Wed Mar 17 13:11:25 2004 -@@ -315,6 +315,7 @@ +@@ -315,6 +315,9 @@ EXPORT_SYMBOL(set_page_dirty); EXPORT_SYMBOL(vfs_readlink); EXPORT_SYMBOL(vfs_follow_link); +EXPORT_SYMBOL(vfs_follow_link_it); ++EXPORT_SYMBOL(do_umount); ++EXPORT_SYMBOL(lookup_create); EXPORT_SYMBOL(page_readlink); EXPORT_SYMBOL(page_follow_link); EXPORT_SYMBOL(page_symlink_inode_operations); +===== include/linux/mount.h 1.7 vs edited ===== +--- linux.orig/include/linux/mount.h Tue Feb 5 09:49:35 2002 ++++ linux/include/linux/mount.h Tue May 4 19:23:48 2004 +@@ -29,6 +29,8 @@ + int mnt_flags; + char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */ + struct list_head mnt_list; ++ struct list_head mnt_lustre_list; /* GNS mount list */ ++ unsigned long mnt_last_used; /* for GNS auto-umount (jiffies) */ + }; + + static inline struct vfsmount *mntget(struct vfsmount *mnt) +@@ -39,6 +39,7 @@ + } + + extern void __mntput(struct vfsmount *mnt); ++extern int do_umount(struct vfsmount *mnt, int flags); + + static inline void mntput(struct vfsmount *mnt) + { diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.20-rh.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.20-rh.patch index 87eedc1..05c6034 100644 --- a/lustre/kernel_patches/patches/vfs_intent-2.4.20-rh.patch +++ b/lustre/kernel_patches/patches/vfs_intent-2.4.20-rh.patch @@ -148,7 +148,7 @@ Index: linux-2.4.20/fs/namei.c struct dentry * dentry = d_lookup(parent, name); + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, flags, it) && ++ if (!dentry->d_op->d_revalidate_it(dentry, flags, NULL, it) && + !d_invalidate(dentry)) { + dput(dentry); + dentry = NULL; @@ -180,7 +180,7 @@ Index: linux-2.4.20/fs/namei.c if (dentry) { lock_kernel(); + if (dir->i_op->lookup_it) -+ result = dir->i_op->lookup_it(dir, dentry, it, flags); ++ result = dir->i_op->lookup_it(dir, dentry, NULL, it, flags); + else result = dir->i_op->lookup(dir, dentry); unlock_kernel(); @@ -190,7 +190,7 @@ Index: linux-2.4.20/fs/namei.c result = ERR_PTR(-ENOENT); } + } else if (result->d_op && result->d_op->d_revalidate_it) { -+ if (!result->d_op->d_revalidate_it(result, flags, it) && ++ if (!result->d_op->d_revalidate_it(result, flags, NULL, it) && + !d_invalidate(result)) { + dput(result); + if (counter > 10) @@ -369,7 +369,7 @@ Index: linux-2.4.20/fs/namei.c dentry = nd->dentry; + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { + err = -ESTALE; -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, it)) { ++ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it)) { + struct dentry *new; + err = permission(dentry->d_parent->d_inode, + MAY_EXEC); @@ -470,7 +470,7 @@ Index: linux-2.4.20/fs/namei.c goto out; lock_kernel(); + if (inode->i_op->lookup_it) -+ dentry = inode->i_op->lookup_it(inode, new, it, 0); ++ dentry = inode->i_op->lookup_it(inode, new, NULL, it, 0); + else dentry = inode->i_op->lookup(inode, new); unlock_kernel(); @@ -685,7 +685,7 @@ Index: linux-2.4.20/fs/namei.c + /* SMP-safe */ -static struct dentry *lookup_create(struct nameidata *nd, int is_dir) -+static struct dentry *lookup_create(struct nameidata *nd, int is_dir, ++struct dentry *lookup_create(struct nameidata *nd, int is_dir, + struct lookup_intent *it) { struct dentry *dentry; @@ -974,6 +974,15 @@ Index: linux-2.4.20/fs/namespace.c list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry)); list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts); nd->dentry->d_mounted++; +@@ -286,7 +293,7 @@ + } + } + +-static int do_umount(struct vfsmount *mnt, int flags) ++int do_umount(struct vfsmount *mnt, int flags) + { + struct super_block * sb = mnt->mnt_sb; + int retval = 0; @@ -485,14 +487,17 @@ { struct nameidata old_nd; @@ -1577,7 +1586,7 @@ Index: linux-2.4.20/include/linux/dcache.h =================================================================== --- linux-2.4.20.orig/include/linux/dcache.h Wed Mar 17 13:57:04 2004 +++ linux-2.4.20/include/linux/dcache.h Wed Mar 17 13:57:11 2004 -@@ -6,6 +6,51 @@ +@@ -6,6 +6,52 @@ #include #include #include @@ -1592,6 +1601,7 @@ Index: linux-2.4.20/include/linux/dcache.h +#define IT_GETXATTR 0x0040 +#define IT_EXEC 0x0080 +#define IT_PIN 0x0100 ++#define IT_CHDIR 0x0200 + +#define IT_FL_LOCKED 0x0001 +#define IT_FL_FOLLOWED 0x0002 /* set by vfs_follow_link */ @@ -1629,11 +1639,20 @@ Index: linux-2.4.20/include/linux/dcache.h /* * linux/include/linux/dcache.h +@@ -84,6 +130,8 @@ + unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */ + }; + ++struct nameidata; ++ + struct dentry_operations { + int (*d_revalidate)(struct dentry *, int); + int (*d_hash) (struct dentry *, struct qstr *); @@ -96,8 +141,22 @@ int (*d_delete)(struct dentry *); void (*d_release)(struct dentry *); void (*d_iput)(struct dentry *, struct inode *); -+ int (*d_revalidate_it)(struct dentry *, int, struct lookup_intent *); ++ int (*d_revalidate_it)(struct dentry *, int, struct nameidata *, struct lookup_intent *); + void (*d_pin)(struct dentry *, struct vfsmount * , int); + void (*d_unpin)(struct dentry *, struct vfsmount *, int); }; @@ -1722,7 +1741,7 @@ Index: linux-2.4.20/include/linux/fs.h int (*create) (struct inode *,struct dentry *,int); + int (*create_it) (struct inode *,struct dentry *,int, struct lookup_intent *); struct dentry * (*lookup) (struct inode *,struct dentry *); -+ struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct lookup_intent *, int flags); ++ struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct nameidata *, struct lookup_intent *, int flags); int (*link) (struct dentry *,struct inode *,struct dentry *); + int (*link_raw) (struct nameidata *,struct nameidata *); int (*unlink) (struct inode *,struct dentry *); @@ -1749,12 +1768,22 @@ Index: linux-2.4.20/include/linux/fs.h int (*getattr) (struct dentry *, struct iattr *); int (*setxattr) (struct dentry *, const char *, void *, size_t, int); ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); -@@ -1092,10 +1111,14 @@ +@@ -938,6 +957,7 @@ + int (*remount_fs) (struct super_block *, int *, char *); + void (*clear_inode) (struct inode *); + void (*umount_begin) (struct super_block *); ++ void (*umount_lustre) (struct super_block *); + + /* Following are for knfsd to interact with "interesting" filesystems + * Currently just reiserfs, but possibly FAT and others later +@@ -1092,10 +1111,16 @@ asmlinkage long sys_open(const char *, int, int); asmlinkage long sys_close(unsigned int); /* yes, it's really unsigned */ -extern int do_truncate(struct dentry *, loff_t start); +extern int do_truncate(struct dentry *, loff_t start, int called_from_open); ++struct dentry *lookup_create(struct nameidata *nd, int is_dir, ++ struct lookup_intent *it); extern struct file *filp_open(const char *, int, int); extern struct file * dentry_open(struct dentry *, struct vfsmount *, int); @@ -1862,11 +1891,33 @@ Index: linux-2.4.20/kernel/ksyms.c =================================================================== --- linux-2.4.20.orig/kernel/ksyms.c Wed Mar 17 13:57:11 2004 +++ linux-2.4.20/kernel/ksyms.c Wed Mar 17 13:57:11 2004 -@@ -297,6 +297,7 @@ +@@ -297,6 +297,9 @@ EXPORT_SYMBOL(set_page_dirty); EXPORT_SYMBOL(vfs_readlink); EXPORT_SYMBOL(vfs_follow_link); +EXPORT_SYMBOL(vfs_follow_link_it); ++EXPORT_SYMBOL(do_umount); ++EXPORT_SYMBOL(lookup_create); EXPORT_SYMBOL(page_readlink); EXPORT_SYMBOL(page_follow_link); EXPORT_SYMBOL(page_symlink_inode_operations); +===== include/linux/mount.h 1.7 vs edited ===== +--- linux-2.4.20.orig/include/linux/mount.h Tue Feb 5 09:49:35 2002 ++++ linux-2.4.20/include/linux/mount.h Tue May 4 19:23:48 2004 +@@ -29,6 +29,8 @@ + int mnt_flags; + char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */ + struct list_head mnt_list; ++ struct list_head mnt_lustre_list; /* GNS mount list */ ++ unsigned long mnt_last_used; /* for GNS auto-umount (jiffies) */ + }; + + static inline struct vfsmount *mntget(struct vfsmount *mnt) +@@ -39,6 +39,7 @@ + } + + extern void __mntput(struct vfsmount *mnt); ++extern int do_umount(struct vfsmount *mnt, int flags); + + static inline void mntput(struct vfsmount *mnt) + { diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.20-vanilla.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.20-vanilla.patch index 737f366..4dae1664 100644 --- a/lustre/kernel_patches/patches/vfs_intent-2.4.20-vanilla.patch +++ b/lustre/kernel_patches/patches/vfs_intent-2.4.20-vanilla.patch @@ -12,11 +12,11 @@ kernel/ksyms.c | 1 12 files changed, 558 insertions(+), 128 deletions(-) -Index: linux-2.4.24/fs/dcache.c +Index: lum/fs/dcache.c =================================================================== ---- linux-2.4.24.orig/fs/dcache.c Fri Jun 13 07:51:37 2003 -+++ linux-2.4.24/fs/dcache.c Wed Mar 17 17:36:14 2004 -@@ -181,6 +181,13 @@ int d_invalidate(struct dentry * dentry) +--- lum.orig/fs/dcache.c 2003-06-13 10:51:37.000000000 -0400 ++++ lum/fs/dcache.c 2004-06-07 17:19:43.000000000 -0400 +@@ -181,6 +181,13 @@ spin_unlock(&dcache_lock); return 0; } @@ -30,7 +30,7 @@ Index: linux-2.4.24/fs/dcache.c /* * Check whether to do a partial shrink_dcache * to get rid of unused child entries. -@@ -830,13 +837,19 @@ void d_delete(struct dentry * dentry) +@@ -830,13 +837,19 @@ * Adds a dentry to the hash according to its name. */ @@ -53,11 +53,11 @@ Index: linux-2.4.24/fs/dcache.c } #define do_switch(x,y) do { \ -Index: linux-2.4.24/fs/exec.c +Index: lum/fs/exec.c =================================================================== ---- linux-2.4.24.orig/fs/exec.c Fri Nov 28 10:26:21 2003 -+++ linux-2.4.24/fs/exec.c Wed Mar 17 17:36:14 2004 -@@ -112,8 +112,10 @@ asmlinkage long sys_uselib(const char * +--- lum.orig/fs/exec.c 2003-11-28 13:26:21.000000000 -0500 ++++ lum/fs/exec.c 2004-06-07 17:19:43.000000000 -0400 +@@ -112,8 +112,10 @@ struct file * file; struct nameidata nd; int error; @@ -69,7 +69,7 @@ Index: linux-2.4.24/fs/exec.c if (error) goto out; -@@ -125,7 +127,8 @@ asmlinkage long sys_uselib(const char * +@@ -125,7 +127,8 @@ if (error) goto exit; @@ -79,7 +79,7 @@ Index: linux-2.4.24/fs/exec.c error = PTR_ERR(file); if (IS_ERR(file)) goto out; -@@ -374,8 +377,10 @@ struct file *open_exec(const char *name) +@@ -374,8 +377,10 @@ struct inode *inode; struct file *file; int err = 0; @@ -91,7 +91,7 @@ Index: linux-2.4.24/fs/exec.c file = ERR_PTR(err); if (!err) { inode = nd.dentry->d_inode; -@@ -387,7 +392,8 @@ struct file *open_exec(const char *name) +@@ -387,7 +392,8 @@ err = -EACCES; file = ERR_PTR(err); if (!err) { @@ -101,7 +101,7 @@ Index: linux-2.4.24/fs/exec.c if (!IS_ERR(file)) { err = deny_write_access(file); if (err) { -@@ -399,6 +405,7 @@ out: +@@ -399,6 +405,7 @@ return file; } } @@ -109,7 +109,7 @@ Index: linux-2.4.24/fs/exec.c path_release(&nd); } goto out; -@@ -1132,7 +1139,7 @@ int do_coredump(long signr, struct pt_re +@@ -1132,7 +1139,7 @@ goto close_fail; if (!file->f_op->write) goto close_fail; @@ -118,10 +118,10 @@ Index: linux-2.4.24/fs/exec.c goto close_fail; retval = binfmt->core_dump(signr, regs, file); -Index: linux-2.4.24/fs/namei.c +Index: lum/fs/namei.c =================================================================== ---- linux-2.4.24.orig/fs/namei.c Mon Aug 25 04:44:43 2003 -+++ linux-2.4.24/fs/namei.c Wed Mar 17 17:36:52 2004 +--- lum.orig/fs/namei.c 2003-08-25 07:44:43.000000000 -0400 ++++ lum/fs/namei.c 2004-06-07 17:24:47.000000000 -0400 @@ -94,6 +94,13 @@ * XEmacs seems to be relying on it... */ @@ -136,18 +136,19 @@ Index: linux-2.4.24/fs/namei.c /* In order to reduce some races, while at the same time doing additional * checking and hopefully speeding things up, we copy filenames to the * kernel data space before using them.. -@@ -260,10 +267,19 @@ void path_release(struct nameidata *nd) +@@ -260,10 +267,20 @@ * Internal lookup() using the new generic dcache. * SMP-safe */ -static struct dentry * cached_lookup(struct dentry * parent, struct qstr * name, int flags) +static struct dentry *cached_lookup(struct dentry *parent, struct qstr *name, -+ int flags, struct lookup_intent *it) ++ int flags, struct nameidata *nd, ++ struct lookup_intent *it) { struct dentry * dentry = d_lookup(parent, name); + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, flags, it) && ++ if (!dentry->d_op->d_revalidate_it(dentry, flags, nd, it) && + !d_invalidate(dentry)) { + dput(dentry); + dentry = NULL; @@ -157,13 +158,14 @@ Index: linux-2.4.24/fs/namei.c if (dentry && dentry->d_op && dentry->d_op->d_revalidate) { if (!dentry->d_op->d_revalidate(dentry, flags) && !d_invalidate(dentry)) { dput(dentry); -@@ -281,11 +297,15 @@ static struct dentry * cached_lookup(str +@@ -281,11 +298,16 @@ * make sure that nobody added the entry to the dcache in the meantime.. * SMP-safe */ -static struct dentry * real_lookup(struct dentry * parent, struct qstr * name, int flags) +static struct dentry *real_lookup(struct dentry *parent, struct qstr *name, -+ int flags, struct lookup_intent *it) ++ int flags, struct nameidata *nd, ++ struct lookup_intent *it) { struct dentry * result; struct inode *dir = parent->d_inode; @@ -174,22 +176,22 @@ Index: linux-2.4.24/fs/namei.c down(&dir->i_sem); /* * First re-do the cached lookup just in case it was created -@@ -300,6 +320,9 @@ static struct dentry * real_lookup(struc +@@ -300,6 +322,9 @@ result = ERR_PTR(-ENOMEM); if (dentry) { lock_kernel(); + if (dir->i_op->lookup_it) -+ result = dir->i_op->lookup_it(dir, dentry, it, flags); ++ result = dir->i_op->lookup_it(dir, dentry, nd, it, flags); + else result = dir->i_op->lookup(dir, dentry); unlock_kernel(); if (result) -@@ -321,6 +344,15 @@ static struct dentry * real_lookup(struc +@@ -321,6 +346,15 @@ dput(result); result = ERR_PTR(-ENOENT); } + } else if (result->d_op && result->d_op->d_revalidate_it) { -+ if (!result->d_op->d_revalidate_it(result, flags, it) && ++ if (!result->d_op->d_revalidate_it(result, flags, nd, it) && + !d_invalidate(result)) { + dput(result); + if (counter > 10) @@ -200,7 +202,7 @@ Index: linux-2.4.24/fs/namei.c } return result; } -@@ -332,7 +364,8 @@ static struct dentry * real_lookup(struc +@@ -332,7 +366,8 @@ * Without that kind of total limit, nasty chains of consecutive * symlinks can cause almost arbitrarily long lookups. */ @@ -210,7 +212,7 @@ Index: linux-2.4.24/fs/namei.c { int err; if (current->link_count >= 5) -@@ -346,10 +379,12 @@ static inline int do_follow_link(struct +@@ -346,10 +381,12 @@ current->link_count++; current->total_link_count++; UPDATE_ATIME(dentry->d_inode); @@ -223,7 +225,7 @@ Index: linux-2.4.24/fs/namei.c path_release(nd); return -ELOOP; } -@@ -447,7 +482,8 @@ static inline void follow_dotdot(struct +@@ -447,7 +484,8 @@ * * We expect 'base' to be positive and a directory. */ @@ -233,19 +235,19 @@ Index: linux-2.4.24/fs/namei.c { struct dentry *dentry; struct inode *inode; -@@ -520,9 +556,9 @@ int link_path_walk(const char * name, st +@@ -520,9 +558,9 @@ break; } /* This does the actual lookups.. */ - dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE); -+ dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE, NULL); ++ dentry = cached_lookup(nd->dentry, &this, LOOKUP_CONTINUE, nd, NULL); if (!dentry) { - dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE); -+ dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE, NULL); ++ dentry = real_lookup(nd->dentry, &this, LOOKUP_CONTINUE, nd, NULL); err = PTR_ERR(dentry); if (IS_ERR(dentry)) break; -@@ -540,7 +576,7 @@ int link_path_walk(const char * name, st +@@ -540,7 +578,7 @@ goto out_dput; if (inode->i_op->follow_link) { @@ -254,7 +256,7 @@ Index: linux-2.4.24/fs/namei.c dput(dentry); if (err) goto return_err; -@@ -556,7 +592,7 @@ int link_path_walk(const char * name, st +@@ -556,7 +594,7 @@ nd->dentry = dentry; } err = -ENOTDIR; @@ -263,19 +265,19 @@ Index: linux-2.4.24/fs/namei.c break; continue; /* here ends the main loop */ -@@ -583,9 +619,9 @@ last_component: +@@ -583,9 +621,9 @@ if (err < 0) break; } - dentry = cached_lookup(nd->dentry, &this, 0); -+ dentry = cached_lookup(nd->dentry, &this, 0, it); ++ dentry = cached_lookup(nd->dentry, &this, 0, nd, it); if (!dentry) { - dentry = real_lookup(nd->dentry, &this, 0); -+ dentry = real_lookup(nd->dentry, &this, 0, it); ++ dentry = real_lookup(nd->dentry, &this, 0, nd, it); err = PTR_ERR(dentry); if (IS_ERR(dentry)) break; -@@ -595,7 +631,7 @@ last_component: +@@ -595,7 +633,7 @@ inode = dentry->d_inode; if ((lookup_flags & LOOKUP_FOLLOW) && inode && inode->i_op && inode->i_op->follow_link) { @@ -284,7 +286,7 @@ Index: linux-2.4.24/fs/namei.c dput(dentry); if (err) goto return_err; -@@ -609,7 +645,8 @@ last_component: +@@ -609,7 +647,8 @@ goto no_inode; if (lookup_flags & LOOKUP_DIRECTORY) { err = -ENOTDIR; @@ -294,20 +296,20 @@ Index: linux-2.4.24/fs/namei.c break; } goto return_base; -@@ -635,6 +672,27 @@ return_reval: +@@ -635,6 +674,27 @@ * Check the cached dentry for staleness. */ dentry = nd->dentry; + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { + err = -ESTALE; -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, it)) { ++ if (!dentry->d_op->d_revalidate_it(dentry, 0, nd, it)) { + struct dentry *new; + err = permission(dentry->d_parent->d_inode, + MAY_EXEC); + if (err) + break; + new = real_lookup(dentry->d_parent, -+ &dentry->d_name, 0, it); ++ &dentry->d_name, 0, nd, it); + if (IS_ERR(new)) { + err = PTR_ERR(new); + break; @@ -322,7 +324,7 @@ Index: linux-2.4.24/fs/namei.c if (dentry && dentry->d_op && dentry->d_op->d_revalidate) { err = -ESTALE; if (!dentry->d_op->d_revalidate(dentry, 0)) { -@@ -648,15 +706,28 @@ out_dput: +@@ -648,15 +708,28 @@ dput(dentry); break; } @@ -352,7 +354,7 @@ Index: linux-2.4.24/fs/namei.c } /* SMP-safe */ -@@ -741,6 +812,17 @@ walk_init_root(const char *name, struct +@@ -741,6 +814,17 @@ } /* SMP-safe */ @@ -370,7 +372,7 @@ Index: linux-2.4.24/fs/namei.c int path_lookup(const char *path, unsigned flags, struct nameidata *nd) { int error = 0; -@@ -755,6 +837,7 @@ int path_init(const char *name, unsigned +@@ -755,6 +839,7 @@ { nd->last_type = LAST_ROOT; /* if there are only slashes... */ nd->flags = flags; @@ -378,22 +380,22 @@ Index: linux-2.4.24/fs/namei.c if (*name=='/') return walk_init_root(name,nd); read_lock(¤t->fs->lock); -@@ -769,7 +852,8 @@ int path_init(const char *name, unsigned +@@ -769,7 +854,8 @@ * needs parent already locked. Doesn't follow mounts. * SMP-safe. */ -struct dentry * lookup_hash(struct qstr *name, struct dentry * base) +struct dentry * lookup_hash_it(struct qstr *name, struct dentry * base, -+ struct lookup_intent *it) ++ struct nameidata *nd, struct lookup_intent *it) { struct dentry * dentry; struct inode *inode; -@@ -792,13 +876,16 @@ struct dentry * lookup_hash(struct qstr +@@ -792,13 +878,16 @@ goto out; } - dentry = cached_lookup(base, name, 0); -+ dentry = cached_lookup(base, name, 0, it); ++ dentry = cached_lookup(base, name, 0, nd, it); if (!dentry) { struct dentry *new = d_alloc(base, name); dentry = ERR_PTR(-ENOMEM); @@ -401,34 +403,35 @@ Index: linux-2.4.24/fs/namei.c goto out; lock_kernel(); + if (inode->i_op->lookup_it) -+ dentry = inode->i_op->lookup_it(inode, new, it, 0); ++ dentry = inode->i_op->lookup_it(inode, new, nd, it, 0); + else dentry = inode->i_op->lookup(inode, new); unlock_kernel(); if (!dentry) -@@ -810,6 +897,12 @@ out: +@@ -810,6 +899,13 @@ return dentry; } -+struct dentry * lookup_hash(struct qstr *name, struct dentry * base) ++struct dentry * lookup_hash(struct qstr *name, struct dentry * base, ++ struct nameidata *nd) +{ -+ return lookup_hash_it(name, base, NULL); ++ return lookup_hash_it(name, base, nd, NULL); +} + + /* SMP-safe */ struct dentry * lookup_one_len(const char * name, struct dentry * base, int len) { -@@ -831,7 +924,7 @@ struct dentry * lookup_one_len(const cha +@@ -831,7 +927,7 @@ } this.hash = end_name_hash(hash); - return lookup_hash(&this, base); -+ return lookup_hash_it(&this, base, NULL); ++ return lookup_hash_it(&this, base, NULL, NULL); access: return ERR_PTR(-EACCES); } -@@ -862,6 +955,23 @@ int __user_walk(const char *name, unsign +@@ -862,6 +958,23 @@ return err; } @@ -452,7 +455,7 @@ Index: linux-2.4.24/fs/namei.c /* * It's inline, so penalty for filesystems that don't use sticky bit is * minimal. -@@ -957,7 +1067,8 @@ static inline int lookup_flags(unsigned +@@ -957,7 +1070,8 @@ return retval; } @@ -462,7 +465,7 @@ Index: linux-2.4.24/fs/namei.c { int error; -@@ -970,12 +1081,15 @@ int vfs_create(struct inode *dir, struct +@@ -970,12 +1084,15 @@ goto exit_lock; error = -EACCES; /* shouldn't it be ENOSYS? */ @@ -480,7 +483,7 @@ Index: linux-2.4.24/fs/namei.c unlock_kernel(); exit_lock: up(&dir->i_zombie); -@@ -984,6 +1098,11 @@ exit_lock: +@@ -984,6 +1101,11 @@ return error; } @@ -492,7 +495,7 @@ Index: linux-2.4.24/fs/namei.c /* * open_namei() * -@@ -998,7 +1117,8 @@ exit_lock: +@@ -998,7 +1120,8 @@ * for symlinks (where the permissions are checked later). * SMP-safe */ @@ -502,7 +505,7 @@ Index: linux-2.4.24/fs/namei.c { int acc_mode, error = 0; struct inode *inode; -@@ -1008,11 +1128,14 @@ int open_namei(const char * pathname, in +@@ -1008,11 +1131,14 @@ acc_mode = ACC_MODE(flag); @@ -518,7 +521,7 @@ Index: linux-2.4.24/fs/namei.c if (error) return error; dentry = nd->dentry; -@@ -1022,6 +1145,10 @@ int open_namei(const char * pathname, in +@@ -1022,6 +1148,10 @@ /* * Create - we need to know the parent. */ @@ -529,16 +532,16 @@ Index: linux-2.4.24/fs/namei.c error = path_lookup(pathname, LOOKUP_PARENT, nd); if (error) return error; -@@ -1037,7 +1164,7 @@ int open_namei(const char * pathname, in +@@ -1037,7 +1167,7 @@ dir = nd->dentry; down(&dir->d_inode->i_sem); - dentry = lookup_hash(&nd->last, nd->dentry); -+ dentry = lookup_hash_it(&nd->last, nd->dentry, it); ++ dentry = lookup_hash_it(&nd->last, nd->dentry, nd, it); do_last: error = PTR_ERR(dentry); -@@ -1046,10 +1173,11 @@ do_last: +@@ -1046,10 +1176,11 @@ goto exit; } @@ -552,7 +555,7 @@ Index: linux-2.4.24/fs/namei.c up(&dir->d_inode->i_sem); dput(nd->dentry); nd->dentry = dentry; -@@ -1153,7 +1281,7 @@ ok: +@@ -1153,7 +1284,7 @@ if (!error) { DQUOT_INIT(inode); @@ -561,7 +564,7 @@ Index: linux-2.4.24/fs/namei.c } put_write_access(inode); if (error) -@@ -1165,8 +1293,10 @@ ok: +@@ -1165,8 +1296,10 @@ return 0; exit_dput: @@ -572,7 +575,7 @@ Index: linux-2.4.24/fs/namei.c path_release(nd); return error; -@@ -1185,7 +1315,10 @@ do_link: +@@ -1185,7 +1318,10 @@ * are done. Procfs-like symlinks just set LAST_BIND. */ UPDATE_ATIME(dentry->d_inode); @@ -583,12 +586,12 @@ Index: linux-2.4.24/fs/namei.c dput(dentry); if (error) return error; -@@ -1207,13 +1340,20 @@ do_link: +@@ -1207,13 +1343,20 @@ } dir = nd->dentry; down(&dir->d_inode->i_sem); - dentry = lookup_hash(&nd->last, nd->dentry); -+ dentry = lookup_hash_it(&nd->last, nd->dentry, it); ++ dentry = lookup_hash_it(&nd->last, nd->dentry, nd, it); putname(nd->last.name); goto do_last; } @@ -606,16 +609,16 @@ Index: linux-2.4.24/fs/namei.c { struct dentry *dentry; -@@ -1221,7 +1361,7 @@ static struct dentry *lookup_create(stru +@@ -1221,7 +1364,7 @@ dentry = ERR_PTR(-EEXIST); if (nd->last_type != LAST_NORM) goto fail; - dentry = lookup_hash(&nd->last, nd->dentry); -+ dentry = lookup_hash_it(&nd->last, nd->dentry, it); ++ dentry = lookup_hash_it(&nd->last, nd->dentry, nd, it); if (IS_ERR(dentry)) goto fail; if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode) -@@ -1277,7 +1417,20 @@ asmlinkage long sys_mknod(const char * f +@@ -1277,7 +1420,20 @@ error = path_lookup(tmp, LOOKUP_PARENT, &nd); if (error) goto out; @@ -637,7 +640,7 @@ Index: linux-2.4.24/fs/namei.c error = PTR_ERR(dentry); mode &= ~current->fs->umask; -@@ -1298,6 +1451,7 @@ asmlinkage long sys_mknod(const char * f +@@ -1298,6 +1454,7 @@ dput(dentry); } up(&nd.dentry->d_inode->i_sem); @@ -645,7 +648,7 @@ Index: linux-2.4.24/fs/namei.c path_release(&nd); out: putname(tmp); -@@ -1345,7 +1499,18 @@ asmlinkage long sys_mkdir(const char * p +@@ -1345,7 +1502,18 @@ error = path_lookup(tmp, LOOKUP_PARENT, &nd); if (error) goto out; @@ -665,7 +668,7 @@ Index: linux-2.4.24/fs/namei.c error = PTR_ERR(dentry); if (!IS_ERR(dentry)) { error = vfs_mkdir(nd.dentry->d_inode, dentry, -@@ -1353,6 +1518,7 @@ asmlinkage long sys_mkdir(const char * p +@@ -1353,6 +1521,7 @@ dput(dentry); } up(&nd.dentry->d_inode->i_sem); @@ -673,7 +676,7 @@ Index: linux-2.4.24/fs/namei.c path_release(&nd); out: putname(tmp); -@@ -1453,8 +1619,16 @@ asmlinkage long sys_rmdir(const char * p +@@ -1453,8 +1622,16 @@ error = -EBUSY; goto exit1; } @@ -687,11 +690,11 @@ Index: linux-2.4.24/fs/namei.c + } down(&nd.dentry->d_inode->i_sem); - dentry = lookup_hash(&nd.last, nd.dentry); -+ dentry = lookup_hash_it(&nd.last, nd.dentry, NULL); ++ dentry = lookup_hash_it(&nd.last, nd.dentry, &nd, NULL); error = PTR_ERR(dentry); if (!IS_ERR(dentry)) { error = vfs_rmdir(nd.dentry->d_inode, dentry); -@@ -1512,8 +1686,15 @@ asmlinkage long sys_unlink(const char * +@@ -1512,8 +1689,15 @@ error = -EISDIR; if (nd.last_type != LAST_NORM) goto exit1; @@ -704,11 +707,11 @@ Index: linux-2.4.24/fs/namei.c + } down(&nd.dentry->d_inode->i_sem); - dentry = lookup_hash(&nd.last, nd.dentry); -+ dentry = lookup_hash_it(&nd.last, nd.dentry, NULL); ++ dentry = lookup_hash_it(&nd.last, nd.dentry, &nd, NULL); error = PTR_ERR(dentry); if (!IS_ERR(dentry)) { /* Why not before? Because we want correct error value */ -@@ -1580,15 +1761,27 @@ asmlinkage long sys_symlink(const char * +@@ -1580,15 +1764,27 @@ error = path_lookup(to, LOOKUP_PARENT, &nd); if (error) goto out; @@ -738,7 +741,7 @@ Index: linux-2.4.24/fs/namei.c putname(to); } putname(from); -@@ -1664,7 +1857,18 @@ asmlinkage long sys_link(const char * ol +@@ -1664,7 +1860,18 @@ error = -EXDEV; if (old_nd.mnt != nd.mnt) goto out_release; @@ -758,7 +761,7 @@ Index: linux-2.4.24/fs/namei.c error = PTR_ERR(new_dentry); if (!IS_ERR(new_dentry)) { error = vfs_link(old_nd.dentry, nd.dentry->d_inode, new_dentry); -@@ -1708,7 +1912,7 @@ exit: +@@ -1708,7 +1915,7 @@ * locking]. */ int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry, @@ -767,7 +770,7 @@ Index: linux-2.4.24/fs/namei.c { int error; struct inode *target; -@@ -1787,7 +1991,7 @@ out_unlock: +@@ -1787,7 +1994,7 @@ } int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry, @@ -776,7 +779,7 @@ Index: linux-2.4.24/fs/namei.c { int error; -@@ -1875,9 +2079,18 @@ static inline int do_rename(const char * +@@ -1875,9 +2082,18 @@ if (newnd.last_type != LAST_NORM) goto exit2; @@ -792,16 +795,16 @@ Index: linux-2.4.24/fs/namei.c double_lock(new_dir, old_dir); - old_dentry = lookup_hash(&oldnd.last, old_dir); -+ old_dentry = lookup_hash_it(&oldnd.last, old_dir, NULL); ++ old_dentry = lookup_hash_it(&oldnd.last, old_dir, &oldnd, NULL); error = PTR_ERR(old_dentry); if (IS_ERR(old_dentry)) goto exit3; -@@ -1893,16 +2106,16 @@ static inline int do_rename(const char * +@@ -1893,16 +2109,16 @@ if (newnd.last.name[newnd.last.len]) goto exit4; } - new_dentry = lookup_hash(&newnd.last, new_dir); -+ new_dentry = lookup_hash_it(&newnd.last, new_dir, NULL); ++ new_dentry = lookup_hash_it(&newnd.last, new_dir, &newnd, NULL); error = PTR_ERR(new_dentry); if (IS_ERR(new_dentry)) goto exit4; @@ -815,7 +818,7 @@ Index: linux-2.4.24/fs/namei.c dput(new_dentry); exit4: dput(old_dentry); -@@ -1953,20 +2166,26 @@ out: +@@ -1953,20 +2169,26 @@ } static inline int @@ -844,7 +847,7 @@ Index: linux-2.4.24/fs/namei.c out: if (current->link_count || res || nd->last_type!=LAST_NORM) return res; -@@ -1990,7 +2209,13 @@ fail: +@@ -1990,7 +2212,13 @@ int vfs_follow_link(struct nameidata *nd, const char *link) { @@ -859,7 +862,7 @@ Index: linux-2.4.24/fs/namei.c } /* get the link contents into pagecache */ -@@ -2032,7 +2257,7 @@ int page_follow_link(struct dentry *dent +@@ -2032,7 +2260,7 @@ { struct page *page = NULL; char *s = page_getlink(dentry, &page); @@ -868,11 +871,27 @@ Index: linux-2.4.24/fs/namei.c if (page) { kunmap(page); page_cache_release(page); -Index: linux-2.4.24/fs/namespace.c +Index: lum/fs/namespace.c =================================================================== ---- linux-2.4.24.orig/fs/namespace.c Fri Nov 28 10:26:21 2003 -+++ linux-2.4.24/fs/namespace.c Wed Mar 17 17:36:14 2004 -@@ -98,6 +98,7 @@ static void detach_mnt(struct vfsmount * +--- lum.orig/fs/namespace.c 2003-11-28 13:26:21.000000000 -0500 ++++ lum/fs/namespace.c 2004-06-07 17:19:43.000000000 -0400 +@@ -15,6 +15,7 @@ + #include + #include + #include ++#include + + #include + +@@ -48,6 +49,7 @@ + INIT_LIST_HEAD(&mnt->mnt_child); + INIT_LIST_HEAD(&mnt->mnt_mounts); + INIT_LIST_HEAD(&mnt->mnt_list); ++ INIT_LIST_HEAD(&mnt->mnt_lustre_list); + if (name) { + int size = strlen(name)+1; + char * newname = kmalloc(size, GFP_KERNEL); +@@ -98,6 +100,7 @@ { old_nd->dentry = mnt->mnt_mountpoint; old_nd->mnt = mnt->mnt_parent; @@ -880,7 +899,7 @@ Index: linux-2.4.24/fs/namespace.c mnt->mnt_parent = mnt; mnt->mnt_mountpoint = mnt->mnt_root; list_del_init(&mnt->mnt_child); -@@ -109,6 +110,7 @@ static void attach_mnt(struct vfsmount * +@@ -109,6 +112,7 @@ { mnt->mnt_parent = mntget(nd->mnt); mnt->mnt_mountpoint = dget(nd->dentry); @@ -888,7 +907,35 @@ Index: linux-2.4.24/fs/namespace.c list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry)); list_add_tail(&mnt->mnt_child, &nd->mnt->mnt_mounts); nd->dentry->d_mounted++; -@@ -488,14 +490,17 @@ static int do_loopback(struct nameidata +@@ -151,6 +155,9 @@ + { + struct super_block *sb = mnt->mnt_sb; + dput(mnt->mnt_root); ++ spin_lock(&dcache_lock); ++ list_del(&mnt->mnt_lustre_list); ++ spin_unlock(&dcache_lock); + free_vfsmnt(mnt); + kill_super(sb); + } +@@ -286,7 +293,7 @@ + } + } + +-static int do_umount(struct vfsmount *mnt, int flags) ++int do_umount(struct vfsmount *mnt, int flags) + { + struct super_block * sb = mnt->mnt_sb; + int retval = 0; +@@ -302,6 +309,8 @@ + */ + + lock_kernel(); ++ if (sb->s_op->umount_lustre) ++ sb->s_op->umount_lustre(sb); + if( (flags&MNT_FORCE) && sb->s_op->umount_begin) + sb->s_op->umount_begin(sb); + unlock_kernel(); +@@ -488,14 +497,17 @@ { struct nameidata old_nd; struct vfsmount *mnt = NULL; @@ -908,7 +955,7 @@ Index: linux-2.4.24/fs/namespace.c down_write(¤t->namespace->sem); err = -EINVAL; -@@ -518,6 +523,7 @@ static int do_loopback(struct nameidata +@@ -518,6 +530,7 @@ } up_write(¤t->namespace->sem); @@ -916,7 +963,7 @@ Index: linux-2.4.24/fs/namespace.c path_release(&old_nd); return err; } -@@ -701,6 +707,7 @@ long do_mount(char * dev_name, char * di +@@ -701,6 +714,7 @@ unsigned long flags, void *data_page) { struct nameidata nd; @@ -924,7 +971,7 @@ Index: linux-2.4.24/fs/namespace.c int retval = 0; int mnt_flags = 0; -@@ -725,9 +732,11 @@ long do_mount(char * dev_name, char * di +@@ -725,9 +739,11 @@ flags &= ~(MS_NOSUID|MS_NOEXEC|MS_NODEV); /* ... and get the mountpoint */ @@ -938,7 +985,7 @@ Index: linux-2.4.24/fs/namespace.c if (flags & MS_REMOUNT) retval = do_remount(&nd, flags & ~MS_REMOUNT, mnt_flags, -@@ -739,6 +747,8 @@ long do_mount(char * dev_name, char * di +@@ -739,6 +755,8 @@ else retval = do_add_mount(&nd, type_page, flags, mnt_flags, dev_name, data_page); @@ -947,7 +994,7 @@ Index: linux-2.4.24/fs/namespace.c path_release(&nd); return retval; } -@@ -904,6 +914,8 @@ asmlinkage long sys_pivot_root(const cha +@@ -904,6 +922,8 @@ { struct vfsmount *tmp; struct nameidata new_nd, old_nd, parent_nd, root_parent, user_nd; @@ -956,7 +1003,7 @@ Index: linux-2.4.24/fs/namespace.c int error; if (!capable(CAP_SYS_ADMIN)) -@@ -911,14 +923,14 @@ asmlinkage long sys_pivot_root(const cha +@@ -911,14 +931,14 @@ lock_kernel(); @@ -973,7 +1020,7 @@ Index: linux-2.4.24/fs/namespace.c if (error) goto out1; -@@ -973,8 +985,10 @@ out2: +@@ -973,8 +993,10 @@ up(&old_nd.dentry->d_inode->i_zombie); up_write(¤t->namespace->sem); path_release(&user_nd); @@ -984,10 +1031,10 @@ Index: linux-2.4.24/fs/namespace.c path_release(&new_nd); out0: unlock_kernel(); -Index: linux-2.4.24/fs/open.c +Index: lum/fs/open.c =================================================================== ---- linux-2.4.24.orig/fs/open.c Mon Aug 25 04:44:43 2003 -+++ linux-2.4.24/fs/open.c Wed Mar 17 17:36:14 2004 +--- lum.orig/fs/open.c 2003-08-25 07:44:43.000000000 -0400 ++++ lum/fs/open.c 2004-06-07 17:19:43.000000000 -0400 @@ -19,6 +19,8 @@ #include @@ -997,7 +1044,7 @@ Index: linux-2.4.24/fs/open.c int vfs_statfs(struct super_block *sb, struct statfs *buf) { -@@ -95,9 +97,10 @@ void fd_install(unsigned int fd, struct +@@ -95,9 +97,10 @@ write_unlock(&files->file_lock); } @@ -1009,7 +1056,7 @@ Index: linux-2.4.24/fs/open.c int error; struct iattr newattrs; -@@ -109,7 +112,13 @@ int do_truncate(struct dentry *dentry, l +@@ -109,7 +112,13 @@ down(&inode->i_sem); newattrs.ia_size = length; newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME; @@ -1024,7 +1071,7 @@ Index: linux-2.4.24/fs/open.c up(&inode->i_sem); up_write(&inode->i_alloc_sem); return error; -@@ -120,12 +129,13 @@ static inline long do_sys_truncate(const +@@ -120,12 +129,13 @@ struct nameidata nd; struct inode * inode; int error; @@ -1039,7 +1086,7 @@ Index: linux-2.4.24/fs/open.c if (error) goto out; inode = nd.dentry->d_inode; -@@ -165,11 +175,13 @@ static inline long do_sys_truncate(const +@@ -165,11 +175,13 @@ error = locks_verify_truncate(inode, NULL, length); if (!error) { DQUOT_INIT(inode); @@ -1054,7 +1101,7 @@ Index: linux-2.4.24/fs/open.c path_release(&nd); out: return error; -@@ -217,7 +229,7 @@ static inline long do_sys_ftruncate(unsi +@@ -217,7 +229,7 @@ error = locks_verify_truncate(inode, file, length); if (!error) @@ -1063,7 +1110,7 @@ Index: linux-2.4.24/fs/open.c out_putf: fput(file); out: -@@ -262,11 +274,13 @@ asmlinkage long sys_utime(char * filenam +@@ -262,11 +274,13 @@ struct inode * inode; struct iattr newattrs; @@ -1078,7 +1125,7 @@ Index: linux-2.4.24/fs/open.c error = -EROFS; if (IS_RDONLY(inode)) goto dput_and_out; -@@ -281,11 +295,25 @@ asmlinkage long sys_utime(char * filenam +@@ -281,11 +295,25 @@ goto dput_and_out; newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET; @@ -1105,7 +1152,7 @@ Index: linux-2.4.24/fs/open.c error = notify_change(nd.dentry, &newattrs); dput_and_out: path_release(&nd); -@@ -306,12 +334,14 @@ asmlinkage long sys_utimes(char * filena +@@ -306,12 +334,14 @@ struct inode * inode; struct iattr newattrs; @@ -1121,7 +1168,7 @@ Index: linux-2.4.24/fs/open.c error = -EROFS; if (IS_RDONLY(inode)) goto dput_and_out; -@@ -326,7 +356,20 @@ asmlinkage long sys_utimes(char * filena +@@ -326,7 +356,20 @@ newattrs.ia_atime = times[0].tv_sec; newattrs.ia_mtime = times[1].tv_sec; newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET; @@ -1143,7 +1190,7 @@ Index: linux-2.4.24/fs/open.c if (current->fsuid != inode->i_uid && (error = permission(inode,MAY_WRITE)) != 0) goto dput_and_out; -@@ -349,6 +392,7 @@ asmlinkage long sys_access(const char * +@@ -349,6 +392,7 @@ int old_fsuid, old_fsgid; kernel_cap_t old_cap; int res; @@ -1151,7 +1198,7 @@ Index: linux-2.4.24/fs/open.c if (mode & ~S_IRWXO) /* where's F_OK, X_OK, W_OK, R_OK? */ return -EINVAL; -@@ -366,13 +410,14 @@ asmlinkage long sys_access(const char * +@@ -366,13 +410,14 @@ else current->cap_effective = current->cap_permitted; @@ -1167,18 +1214,18 @@ Index: linux-2.4.24/fs/open.c path_release(&nd); } -@@ -387,8 +432,9 @@ asmlinkage long sys_chdir(const char * f +@@ -387,8 +432,9 @@ { int error; struct nameidata nd; -+ struct lookup_intent it = { .it_op = IT_GETATTR }; ++ struct lookup_intent it = { .it_op = IT_CHDIR }; - error = __user_walk(filename,LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY,&nd); + error = __user_walk_it(filename,LOOKUP_POSITIVE|LOOKUP_FOLLOW|LOOKUP_DIRECTORY,&nd, &it); if (error) goto out; -@@ -399,6 +445,7 @@ asmlinkage long sys_chdir(const char * f +@@ -399,6 +445,7 @@ set_fs_pwd(current->fs, nd.mnt, nd.dentry); dput_and_out: @@ -1186,7 +1233,7 @@ Index: linux-2.4.24/fs/open.c path_release(&nd); out: return error; -@@ -438,9 +485,10 @@ asmlinkage long sys_chroot(const char * +@@ -438,9 +485,10 @@ { int error; struct nameidata nd; @@ -1199,7 +1246,7 @@ Index: linux-2.4.24/fs/open.c if (error) goto out; -@@ -456,39 +504,56 @@ asmlinkage long sys_chroot(const char * +@@ -456,39 +504,56 @@ set_fs_altroot(); error = 0; dput_and_out: @@ -1270,7 +1317,7 @@ Index: linux-2.4.24/fs/open.c fput(file); out: return err; -@@ -497,30 +562,14 @@ out: +@@ -497,30 +562,14 @@ asmlinkage long sys_chmod(const char * filename, mode_t mode) { struct nameidata nd; @@ -1302,7 +1349,7 @@ Index: linux-2.4.24/fs/open.c path_release(&nd); out: return error; -@@ -540,6 +589,20 @@ static int chown_common(struct dentry * +@@ -540,6 +589,20 @@ error = -EROFS; if (IS_RDONLY(inode)) goto out; @@ -1323,7 +1370,7 @@ Index: linux-2.4.24/fs/open.c error = -EPERM; if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) goto out; -@@ -644,6 +707,7 @@ struct file *filp_open(const char * file +@@ -644,6 +707,7 @@ { int namei_flags, error; struct nameidata nd; @@ -1331,7 +1378,7 @@ Index: linux-2.4.24/fs/open.c namei_flags = flags; if ((namei_flags+1) & O_ACCMODE) -@@ -651,14 +715,15 @@ struct file *filp_open(const char * file +@@ -651,14 +715,15 @@ if (namei_flags & O_TRUNC) namei_flags |= 2; @@ -1352,7 +1399,7 @@ Index: linux-2.4.24/fs/open.c { struct file * f; struct inode *inode; -@@ -695,12 +760,15 @@ struct file *dentry_open(struct dentry * +@@ -695,12 +760,15 @@ } if (f->f_op && f->f_op->open) { @@ -1368,7 +1415,7 @@ Index: linux-2.4.24/fs/open.c return f; cleanup_all: -@@ -715,11 +783,17 @@ cleanup_all: +@@ -715,11 +783,17 @@ cleanup_file: put_filp(f); cleanup_dentry: @@ -1386,10 +1433,10 @@ Index: linux-2.4.24/fs/open.c /* * Find an empty file descriptor entry, and mark it busy. */ -Index: linux-2.4.24/fs/stat.c +Index: lum/fs/stat.c =================================================================== ---- linux-2.4.24.orig/fs/stat.c Mon Aug 25 04:44:43 2003 -+++ linux-2.4.24/fs/stat.c Wed Mar 17 17:36:52 2004 +--- lum.orig/fs/stat.c 2003-08-25 07:44:43.000000000 -0400 ++++ lum/fs/stat.c 2004-06-07 17:19:43.000000000 -0400 @@ -17,10 +17,12 @@ * Revalidate the inode. This is required for proper NFS attribute caching. */ @@ -1405,7 +1452,7 @@ Index: linux-2.4.24/fs/stat.c return inode->i_op->revalidate(dentry); return 0; } -@@ -137,13 +139,15 @@ static int cp_new_stat(struct inode * in +@@ -137,13 +139,15 @@ asmlinkage long sys_stat(char * filename, struct __old_kernel_stat * statbuf) { struct nameidata nd; @@ -1423,7 +1470,7 @@ Index: linux-2.4.24/fs/stat.c path_release(&nd); } return error; -@@ -153,13 +157,15 @@ asmlinkage long sys_stat(char * filename +@@ -153,13 +157,15 @@ asmlinkage long sys_newstat(char * filename, struct stat * statbuf) { struct nameidata nd; @@ -1441,7 +1488,7 @@ Index: linux-2.4.24/fs/stat.c path_release(&nd); } return error; -@@ -174,13 +180,15 @@ asmlinkage long sys_newstat(char * filen +@@ -174,13 +180,15 @@ asmlinkage long sys_lstat(char * filename, struct __old_kernel_stat * statbuf) { struct nameidata nd; @@ -1459,7 +1506,7 @@ Index: linux-2.4.24/fs/stat.c path_release(&nd); } return error; -@@ -191,13 +199,15 @@ asmlinkage long sys_lstat(char * filenam +@@ -191,13 +199,15 @@ asmlinkage long sys_newlstat(char * filename, struct stat * statbuf) { struct nameidata nd; @@ -1477,7 +1524,7 @@ Index: linux-2.4.24/fs/stat.c path_release(&nd); } return error; -@@ -218,7 +228,7 @@ asmlinkage long sys_fstat(unsigned int f +@@ -218,7 +228,7 @@ if (f) { struct dentry * dentry = f->f_dentry; @@ -1486,7 +1533,7 @@ Index: linux-2.4.24/fs/stat.c if (!err) err = cp_old_stat(dentry->d_inode, statbuf); fput(f); -@@ -237,7 +247,7 @@ asmlinkage long sys_newfstat(unsigned in +@@ -237,7 +247,7 @@ if (f) { struct dentry * dentry = f->f_dentry; @@ -1495,7 +1542,7 @@ Index: linux-2.4.24/fs/stat.c if (!err) err = cp_new_stat(dentry->d_inode, statbuf); fput(f); -@@ -259,7 +269,7 @@ asmlinkage long sys_readlink(const char +@@ -259,7 +269,7 @@ error = -EINVAL; if (inode->i_op && inode->i_op->readlink && @@ -1504,7 +1551,7 @@ Index: linux-2.4.24/fs/stat.c UPDATE_ATIME(inode); error = inode->i_op->readlink(nd.dentry, buf, bufsiz); } -@@ -335,12 +345,14 @@ asmlinkage long sys_stat64(char * filena +@@ -335,12 +345,14 @@ { struct nameidata nd; int error; @@ -1521,7 +1568,7 @@ Index: linux-2.4.24/fs/stat.c path_release(&nd); } return error; -@@ -350,12 +362,14 @@ asmlinkage long sys_lstat64(char * filen +@@ -350,12 +362,14 @@ { struct nameidata nd; int error; @@ -1538,7 +1585,7 @@ Index: linux-2.4.24/fs/stat.c path_release(&nd); } return error; -@@ -370,7 +384,7 @@ asmlinkage long sys_fstat64(unsigned lon +@@ -370,7 +384,7 @@ if (f) { struct dentry * dentry = f->f_dentry; @@ -1547,11 +1594,11 @@ Index: linux-2.4.24/fs/stat.c if (!err) err = cp_new_stat64(dentry->d_inode, statbuf); fput(f); -Index: linux-2.4.24/include/linux/dcache.h +Index: lum/include/linux/dcache.h =================================================================== ---- linux-2.4.24.orig/include/linux/dcache.h Thu Nov 28 15:53:15 2002 -+++ linux-2.4.24/include/linux/dcache.h Wed Mar 17 17:36:14 2004 -@@ -6,6 +6,51 @@ +--- lum.orig/include/linux/dcache.h 2002-11-28 18:53:15.000000000 -0500 ++++ lum/include/linux/dcache.h 2004-06-07 17:19:44.000000000 -0400 +@@ -6,6 +6,52 @@ #include #include #include @@ -1566,6 +1613,7 @@ Index: linux-2.4.24/include/linux/dcache.h +#define IT_GETXATTR 0x0040 +#define IT_EXEC 0x0080 +#define IT_PIN 0x0100 ++#define IT_CHDIR 0x0200 + +#define IT_FL_LOCKED 0x0001 +#define IT_FL_FOLLOWED 0x0002 /* set by vfs_follow_link */ @@ -1603,11 +1651,20 @@ Index: linux-2.4.24/include/linux/dcache.h /* * linux/include/linux/dcache.h -@@ -91,8 +136,22 @@ struct dentry_operations { +@@ -84,6 +130,8 @@ + unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */ + }; + ++struct nameidata; ++ + struct dentry_operations { + int (*d_revalidate)(struct dentry *, int); + int (*d_hash) (struct dentry *, struct qstr *); +@@ -91,8 +139,22 @@ int (*d_delete)(struct dentry *); void (*d_release)(struct dentry *); void (*d_iput)(struct dentry *, struct inode *); -+ int (*d_revalidate_it)(struct dentry *, int, struct lookup_intent *); ++ int (*d_revalidate_it)(struct dentry *, int, struct nameidata *, struct lookup_intent *); + void (*d_pin)(struct dentry *, struct vfsmount * , int); + void (*d_unpin)(struct dentry *, struct vfsmount *, int); }; @@ -1626,7 +1683,7 @@ Index: linux-2.4.24/include/linux/dcache.h /* the dentry parameter passed to d_hash and d_compare is the parent * directory of the entries to be compared. It is used in case these * functions need any directory specific information for determining -@@ -124,6 +183,7 @@ d_iput: no no yes +@@ -124,6 +186,7 @@ * s_nfsd_free_path semaphore will be down */ #define DCACHE_REFERENCED 0x0008 /* Recently used, don't discard. */ @@ -1634,11 +1691,11 @@ Index: linux-2.4.24/include/linux/dcache.h extern spinlock_t dcache_lock; -Index: linux-2.4.24/include/linux/fs.h +Index: lum/include/linux/fs.h =================================================================== ---- linux-2.4.24.orig/include/linux/fs.h Wed Mar 17 17:36:14 2004 -+++ linux-2.4.24/include/linux/fs.h Wed Mar 17 17:36:14 2004 -@@ -73,6 +73,7 @@ extern int leases_enable, dir_notify_ena +--- lum.orig/include/linux/fs.h 2004-06-03 16:32:26.000000000 -0400 ++++ lum/include/linux/fs.h 2004-06-07 17:24:37.000000000 -0400 +@@ -73,6 +73,7 @@ #define FMODE_READ 1 #define FMODE_WRITE 2 @@ -1646,7 +1703,7 @@ Index: linux-2.4.24/include/linux/fs.h #define READ 0 #define WRITE 1 -@@ -340,6 +341,9 @@ extern void set_bh_page(struct buffer_he +@@ -340,6 +341,9 @@ #define ATTR_MTIME_SET 256 #define ATTR_FORCE 512 /* Not a change, but a change it */ #define ATTR_ATTR_FLAG 1024 @@ -1656,7 +1713,7 @@ Index: linux-2.4.24/include/linux/fs.h /* * This is the Inode Attributes structure, used for notify_change(). It -@@ -478,6 +482,7 @@ struct inode { +@@ -478,6 +482,7 @@ struct pipe_inode_info *i_pipe; struct block_device *i_bdev; struct char_device *i_cdev; @@ -1664,7 +1721,7 @@ Index: linux-2.4.24/include/linux/fs.h unsigned long i_dnotify_mask; /* Directory notify events */ struct dnotify_struct *i_dnotify; /* for directory notifications */ -@@ -582,6 +587,7 @@ struct file { +@@ -582,6 +587,7 @@ /* needed for tty driver, and maybe others */ void *private_data; @@ -1672,7 +1729,7 @@ Index: linux-2.4.24/include/linux/fs.h /* preallocated helper kiobuf to speedup O_DIRECT */ struct kiobuf *f_iobuf; -@@ -702,6 +708,7 @@ struct nameidata { +@@ -702,6 +708,7 @@ struct qstr last; unsigned int flags; int last_type; @@ -1680,7 +1737,7 @@ Index: linux-2.4.24/include/linux/fs.h }; /* -@@ -822,7 +829,8 @@ extern int vfs_symlink(struct inode *, s +@@ -822,7 +829,8 @@ extern int vfs_link(struct dentry *, struct inode *, struct dentry *); extern int vfs_rmdir(struct inode *, struct dentry *); extern int vfs_unlink(struct inode *, struct dentry *); @@ -1690,13 +1747,13 @@ Index: linux-2.4.24/include/linux/fs.h /* * File types -@@ -884,21 +892,32 @@ struct file_operations { +@@ -884,21 +892,32 @@ struct inode_operations { int (*create) (struct inode *,struct dentry *,int); + int (*create_it) (struct inode *,struct dentry *,int, struct lookup_intent *); struct dentry * (*lookup) (struct inode *,struct dentry *); -+ struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct lookup_intent *, int flags); ++ struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct nameidata *, struct lookup_intent *, int flags); int (*link) (struct dentry *,struct inode *,struct dentry *); + int (*link_raw) (struct nameidata *,struct nameidata *); int (*unlink) (struct inode *,struct dentry *); @@ -1723,7 +1780,15 @@ Index: linux-2.4.24/include/linux/fs.h int (*getattr) (struct dentry *, struct iattr *); int (*setxattr) (struct dentry *, const char *, void *, size_t, int); ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); -@@ -1094,10 +1113,14 @@ static inline int get_lease(struct inode +@@ -938,6 +957,7 @@ + int (*remount_fs) (struct super_block *, int *, char *); + void (*clear_inode) (struct inode *); + void (*umount_begin) (struct super_block *); ++ void (*umount_lustre) (struct super_block *); + + /* Following are for knfsd to interact with "interesting" filesystems + * Currently just reiserfs, but possibly FAT and others later +@@ -1094,10 +1114,14 @@ asmlinkage long sys_open(const char *, int, int); asmlinkage long sys_close(unsigned int); /* yes, it's really unsigned */ @@ -1739,7 +1804,7 @@ Index: linux-2.4.24/include/linux/fs.h extern int filp_close(struct file *, fl_owner_t id); extern char * getname(const char *); -@@ -1386,6 +1409,7 @@ typedef int (*read_actor_t)(read_descrip +@@ -1386,6 +1410,7 @@ extern loff_t default_llseek(struct file *file, loff_t offset, int origin); extern int FASTCALL(__user_walk(const char *, unsigned, struct nameidata *)); @@ -1747,8 +1812,12 @@ Index: linux-2.4.24/include/linux/fs.h extern int FASTCALL(path_init(const char *, unsigned, struct nameidata *)); extern int FASTCALL(path_walk(const char *, struct nameidata *)); extern int FASTCALL(path_lookup(const char *, unsigned, struct nameidata *)); -@@ -1397,6 +1421,8 @@ extern struct dentry * lookup_one_len(co - extern struct dentry * lookup_hash(struct qstr *, struct dentry *); +@@ -1394,9 +1419,11 @@ + extern int follow_down(struct vfsmount **, struct dentry **); + extern int follow_up(struct vfsmount **, struct dentry **); + extern struct dentry * lookup_one_len(const char *, struct dentry *, int); +-extern struct dentry * lookup_hash(struct qstr *, struct dentry *); ++extern struct dentry * lookup_hash(struct qstr *, struct dentry *, struct nameidata *); #define user_path_walk(name,nd) __user_walk(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd) #define user_path_walk_link(name,nd) __user_walk(name, LOOKUP_POSITIVE, nd) +#define user_path_walk_it(name,nd,it) __user_walk_it(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd, it) @@ -1756,7 +1825,7 @@ Index: linux-2.4.24/include/linux/fs.h extern void inode_init_once(struct inode *); extern void iput(struct inode *); -@@ -1500,6 +1526,8 @@ extern struct file_operations generic_ro +@@ -1500,6 +1527,8 @@ extern int vfs_readlink(struct dentry *, char *, int, const char *); extern int vfs_follow_link(struct nameidata *, const char *); @@ -1765,11 +1834,11 @@ Index: linux-2.4.24/include/linux/fs.h extern int page_readlink(struct dentry *, char *, int); extern int page_follow_link(struct dentry *, struct nameidata *); extern struct inode_operations page_symlink_inode_operations; -Index: linux-2.4.24/include/linux/fs_struct.h +Index: lum/include/linux/fs_struct.h =================================================================== ---- linux-2.4.24.orig/include/linux/fs_struct.h Fri Jul 13 15:10:44 2001 -+++ linux-2.4.24/include/linux/fs_struct.h Wed Mar 17 17:36:14 2004 -@@ -34,10 +34,12 @@ static inline void set_fs_root(struct fs +--- lum.orig/include/linux/fs_struct.h 2001-07-13 18:10:44.000000000 -0400 ++++ lum/include/linux/fs_struct.h 2004-06-07 17:19:44.000000000 -0400 +@@ -34,10 +34,12 @@ write_lock(&fs->lock); old_root = fs->root; old_rootmnt = fs->rootmnt; @@ -1782,7 +1851,7 @@ Index: linux-2.4.24/include/linux/fs_struct.h dput(old_root); mntput(old_rootmnt); } -@@ -57,10 +59,12 @@ static inline void set_fs_pwd(struct fs_ +@@ -57,10 +59,12 @@ write_lock(&fs->lock); old_pwd = fs->pwd; old_pwdmnt = fs->pwdmnt; @@ -1795,11 +1864,32 @@ Index: linux-2.4.24/include/linux/fs_struct.h dput(old_pwd); mntput(old_pwdmnt); } -Index: linux-2.4.24/kernel/exit.c +Index: lum/include/linux/mount.h +=================================================================== +--- lum.orig/include/linux/mount.h 2001-10-05 16:05:55.000000000 -0400 ++++ lum/include/linux/mount.h 2004-06-07 17:19:44.000000000 -0400 +@@ -29,6 +29,8 @@ + int mnt_flags; + char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */ + struct list_head mnt_list; ++ struct list_head mnt_lustre_list; /* GNS mount list */ ++ unsigned long mnt_last_used; /* for GNS auto-umount (jiffies) */ + }; + + static inline struct vfsmount *mntget(struct vfsmount *mnt) +@@ -39,6 +41,7 @@ + } + + extern void __mntput(struct vfsmount *mnt); ++extern int do_umount(struct vfsmount *mnt, int flags); + + static inline void mntput(struct vfsmount *mnt) + { +Index: lum/kernel/exit.c =================================================================== ---- linux-2.4.24.orig/kernel/exit.c Thu Nov 28 15:53:15 2002 -+++ linux-2.4.24/kernel/exit.c Wed Mar 17 17:36:14 2004 -@@ -238,11 +238,14 @@ static inline void __put_fs_struct(struc +--- lum.orig/kernel/exit.c 2002-11-28 18:53:15.000000000 -0500 ++++ lum/kernel/exit.c 2004-06-07 17:19:44.000000000 -0400 +@@ -238,11 +238,14 @@ { /* No need to hold fs->lock if we are killing it */ if (atomic_dec_and_test(&fs->count)) { @@ -1814,11 +1904,11 @@ Index: linux-2.4.24/kernel/exit.c dput(fs->altroot); mntput(fs->altrootmnt); } -Index: linux-2.4.24/kernel/fork.c +Index: lum/kernel/fork.c =================================================================== ---- linux-2.4.24.orig/kernel/fork.c Fri Nov 28 10:26:21 2003 -+++ linux-2.4.24/kernel/fork.c Wed Mar 17 17:36:14 2004 -@@ -386,10 +386,13 @@ static inline struct fs_struct *__copy_f +--- lum.orig/kernel/fork.c 2003-11-28 13:26:21.000000000 -0500 ++++ lum/kernel/fork.c 2004-06-07 17:19:44.000000000 -0400 +@@ -386,10 +386,13 @@ fs->umask = old->umask; read_lock(&old->lock); fs->rootmnt = mntget(old->rootmnt); @@ -1832,15 +1922,29 @@ Index: linux-2.4.24/kernel/fork.c fs->altrootmnt = mntget(old->altrootmnt); fs->altroot = dget(old->altroot); } else { -Index: linux-2.4.24/kernel/ksyms.c +Index: lum/kernel/ksyms.c =================================================================== ---- linux-2.4.24.orig/kernel/ksyms.c Wed Mar 17 17:36:14 2004 -+++ linux-2.4.24/kernel/ksyms.c Wed Mar 17 17:36:14 2004 -@@ -275,6 +275,7 @@ EXPORT_SYMBOL(set_page_dirty); +--- lum.orig/kernel/ksyms.c 2004-06-03 16:32:26.000000000 -0400 ++++ lum/kernel/ksyms.c 2004-06-07 17:25:11.000000000 -0400 +@@ -275,6 +275,8 @@ EXPORT_SYMBOL(mark_page_accessed); EXPORT_SYMBOL(vfs_readlink); EXPORT_SYMBOL(vfs_follow_link); +EXPORT_SYMBOL(vfs_follow_link_it); ++EXPORT_SYMBOL(do_umount); EXPORT_SYMBOL(page_readlink); EXPORT_SYMBOL(page_follow_link); EXPORT_SYMBOL(page_symlink_inode_operations); +Index: lum/net/unix/af_unix.c +=================================================================== +--- lum.orig/net/unix/af_unix.c 2002-11-28 18:53:16.000000000 -0500 ++++ lum/net/unix/af_unix.c 2004-06-07 17:19:44.000000000 -0400 +@@ -703,7 +703,7 @@ + /* + * Do the final lookup. + */ +- dentry = lookup_hash(&nd.last, nd.dentry); ++ dentry = lookup_hash(&nd.last, nd.dentry, &nd); + err = PTR_ERR(dentry); + if (IS_ERR(dentry)) + goto out_mknod_unlock; diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.21-chaos.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.21-chaos.patch index b331767..be9054e 100644 --- a/lustre/kernel_patches/patches/vfs_intent-2.4.21-chaos.patch +++ b/lustre/kernel_patches/patches/vfs_intent-2.4.21-chaos.patch @@ -147,7 +147,7 @@ Index: linux-ia64/fs/namei.c struct dentry * dentry = d_lookup(parent, name); + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, flags, it) && ++ if (!dentry->d_op->d_revalidate_it(dentry, flags, NULL, it) && + !d_invalidate(dentry)) { + dput(dentry); + dentry = NULL; @@ -179,7 +179,7 @@ Index: linux-ia64/fs/namei.c if (dentry) { lock_kernel(); + if (dir->i_op->lookup_it) -+ result = dir->i_op->lookup_it(dir, dentry, it, flags); ++ result = dir->i_op->lookup_it(dir, dentry, NULL, it, flags); + else result = dir->i_op->lookup(dir, dentry); unlock_kernel(); @@ -189,7 +189,7 @@ Index: linux-ia64/fs/namei.c result = ERR_PTR(-ENOENT); } + } else if (result->d_op && result->d_op->d_revalidate_it) { -+ if (!result->d_op->d_revalidate_it(result, flags, it) && ++ if (!result->d_op->d_revalidate_it(result, flags, NULL, it) && + !d_invalidate(result)) { + dput(result); + if (counter > 10) @@ -306,7 +306,7 @@ Index: linux-ia64/fs/namei.c dentry = nd->dentry; + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { + err = -ESTALE; -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, it)) { ++ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it)) { + struct dentry *new; + err = permission(dentry->d_parent->d_inode, + MAY_EXEC); @@ -407,7 +407,7 @@ Index: linux-ia64/fs/namei.c goto out; lock_kernel(); + if (inode->i_op->lookup_it) -+ dentry = inode->i_op->lookup_it(inode, new, it, 0); ++ dentry = inode->i_op->lookup_it(inode, new, NULL, it, 0); + else dentry = inode->i_op->lookup(inode, new); unlock_kernel(); @@ -607,7 +607,7 @@ Index: linux-ia64/fs/namei.c + /* SMP-safe */ -static struct dentry *lookup_create(struct nameidata *nd, int is_dir) -+static struct dentry *lookup_create(struct nameidata *nd, int is_dir, ++struct dentry *lookup_create(struct nameidata *nd, int is_dir, + struct lookup_intent *it) { struct dentry *dentry; @@ -894,6 +894,15 @@ Index: linux-ia64/fs/namespace.c list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry)); list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts); nd->dentry->d_mounted++; +@@ -286,7 +293,7 @@ + } + } + +-static int do_umount(struct vfsmount *mnt, int flags) ++int do_umount(struct vfsmount *mnt, int flags) + { + struct super_block * sb = mnt->mnt_sb; + int retval = 0; @@ -488,14 +490,17 @@ static int do_loopback(struct nameidata { struct nameidata old_nd; @@ -1559,7 +1568,7 @@ Index: linux-ia64/include/linux/dcache.h =================================================================== --- linux-ia64.orig/include/linux/dcache.h 2004-03-17 15:47:15.000000000 -0800 +++ linux-ia64/include/linux/dcache.h 2004-03-17 16:05:28.000000000 -0800 -@@ -6,6 +6,51 @@ +@@ -6,6 +6,52 @@ #include #include #include @@ -1574,6 +1583,7 @@ Index: linux-ia64/include/linux/dcache.h +#define IT_GETXATTR 0x0040 +#define IT_EXEC 0x0080 +#define IT_PIN 0x0100 ++#define IT_CHDIR 0x0200 + +#define IT_FL_LOCKED 0x0001 +#define IT_FL_FOLLOWED 0x0002 /* set by vfs_follow_link */ @@ -1611,11 +1621,20 @@ Index: linux-ia64/include/linux/dcache.h /* * linux/include/linux/dcache.h +@@ -84,6 +130,8 @@ + unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */ + }; + ++struct nameidata; ++ + struct dentry_operations { + int (*d_revalidate)(struct dentry *, int); + int (*d_hash) (struct dentry *, struct qstr *); @@ -96,8 +141,22 @@ struct dentry_operations { int (*d_delete)(struct dentry *); void (*d_release)(struct dentry *); void (*d_iput)(struct dentry *, struct inode *); -+ int (*d_revalidate_it)(struct dentry *, int, struct lookup_intent *); ++ int (*d_revalidate_it)(struct dentry *, int, struct nameidata *, struct lookup_intent *); + void (*d_pin)(struct dentry *, struct vfsmount * , int); + void (*d_unpin)(struct dentry *, struct vfsmount *, int); }; @@ -1704,7 +1723,7 @@ Index: linux-ia64/include/linux/fs.h int (*create) (struct inode *,struct dentry *,int); + int (*create_it) (struct inode *,struct dentry *,int, struct lookup_intent *); struct dentry * (*lookup) (struct inode *,struct dentry *); -+ struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct lookup_intent *, int flags); ++ struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct nameidata *, struct lookup_intent *, int flags); int (*link) (struct dentry *,struct inode *,struct dentry *); + int (*link_raw) (struct nameidata *,struct nameidata *); int (*unlink) (struct inode *,struct dentry *); @@ -1731,12 +1750,22 @@ Index: linux-ia64/include/linux/fs.h int (*getattr) (struct dentry *, struct iattr *); int (*setxattr) (struct dentry *, const char *, const void *, size_t, int); ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); -@@ -1131,10 +1150,14 @@ static inline int get_lease(struct inode +@@ -938,6 +957,7 @@ + int (*remount_fs) (struct super_block *, int *, char *); + void (*clear_inode) (struct inode *); + void (*umount_begin) (struct super_block *); ++ void (*umount_lustre) (struct super_block *); + + /* Following are for knfsd to interact with "interesting" filesystems + * Currently just reiserfs, but possibly FAT and others later +@@ -1131,10 +1150,16 @@ static inline int get_lease(struct inode asmlinkage long sys_open(const char *, int, int); asmlinkage long sys_close(unsigned int); /* yes, it's really unsigned */ -extern int do_truncate(struct dentry *, loff_t start); +extern int do_truncate(struct dentry *, loff_t start, int called_from_open); ++struct dentry *lookup_create(struct nameidata *nd, int is_dir, ++ struct lookup_intent *it); extern struct file *filp_open(const char *, int, int); extern struct file * dentry_open(struct dentry *, struct vfsmount *, int); @@ -1844,11 +1873,33 @@ Index: linux-ia64/kernel/ksyms.c =================================================================== --- linux-ia64.orig/kernel/ksyms.c 2004-03-17 16:05:28.000000000 -0800 +++ linux-ia64/kernel/ksyms.c 2004-03-17 16:05:51.000000000 -0800 -@@ -318,6 +318,7 @@ EXPORT_SYMBOL(read_cache_page); +@@ -318,6 +318,9 @@ EXPORT_SYMBOL(read_cache_page); EXPORT_SYMBOL(set_page_dirty); EXPORT_SYMBOL(vfs_readlink); EXPORT_SYMBOL(vfs_follow_link); +EXPORT_SYMBOL(vfs_follow_link_it); ++EXPORT_SYMBOL(do_umount); ++EXPORT_SYMBOL(lookup_create); EXPORT_SYMBOL(page_readlink); EXPORT_SYMBOL(page_follow_link); EXPORT_SYMBOL(page_symlink_inode_operations); +===== include/linux/mount.h 1.7 vs edited ===== +--- linux-ia64.orig/include/linux/mount.h Tue Feb 5 09:49:35 2002 ++++ linux-ia64/include/linux/mount.h Tue May 4 19:23:48 2004 +@@ -29,6 +29,8 @@ + int mnt_flags; + char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */ + struct list_head mnt_list; ++ struct list_head mnt_lustre_list; /* GNS mount list */ ++ unsigned long mnt_last_used; /* for GNS auto-umount (jiffies) */ + }; + + static inline struct vfsmount *mntget(struct vfsmount *mnt) +@@ -39,6 +39,7 @@ + } + + extern void __mntput(struct vfsmount *mnt); ++extern int do_umount(struct vfsmount *mnt, int flags); + + static inline void mntput(struct vfsmount *mnt) + { diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.21-sles8sp3.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.21-sles8sp3.patch index 7fdb561..8e2fcd8 100644 --- a/lustre/kernel_patches/patches/vfs_intent-2.4.21-sles8sp3.patch +++ b/lustre/kernel_patches/patches/vfs_intent-2.4.21-sles8sp3.patch @@ -147,7 +147,7 @@ Index: linux-2.4.21/fs/namei.c struct dentry * dentry = d_lookup(parent, name); + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, flags, it) && ++ if (!dentry->d_op->d_revalidate_it(dentry, flags, NULL, it) && + !d_invalidate(dentry)) { + dput(dentry); + dentry = NULL; @@ -179,7 +179,7 @@ Index: linux-2.4.21/fs/namei.c if (dentry) { lock_kernel(); + if (dir->i_op->lookup_it) -+ result = dir->i_op->lookup_it(dir, dentry, it, flags); ++ result = dir->i_op->lookup_it(dir, dentry, NULL, it, flags); + else result = dir->i_op->lookup(dir, dentry); unlock_kernel(); @@ -189,7 +189,7 @@ Index: linux-2.4.21/fs/namei.c result = ERR_PTR(-ENOENT); } + } else if (result->d_op && result->d_op->d_revalidate_it) { -+ if (!result->d_op->d_revalidate_it(result, flags, it) && ++ if (!result->d_op->d_revalidate_it(result, flags, NULL, it) && + !d_invalidate(result)) { + dput(result); + if (counter > 10) @@ -306,7 +306,7 @@ Index: linux-2.4.21/fs/namei.c dentry = nd->dentry; + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { + err = -ESTALE; -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, it)) { ++ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it)) { + struct dentry *new; + err = permission(dentry->d_parent->d_inode, + MAY_EXEC); @@ -415,7 +415,7 @@ Index: linux-2.4.21/fs/namei.c goto out; lock_kernel(); + if (inode->i_op->lookup_it) -+ dentry = inode->i_op->lookup_it(inode, new, it, 0); ++ dentry = inode->i_op->lookup_it(inode, new, NULL, it, 0); + else dentry = inode->i_op->lookup(inode, new); unlock_kernel(); @@ -902,6 +902,15 @@ Index: linux-2.4.21/fs/namespace.c list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry)); list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts); nd->dentry->d_mounted++; +@@ -286,7 +293,7 @@ + } + } + +-static int do_umount(struct vfsmount *mnt, int flags) ++int do_umount(struct vfsmount *mnt, int flags) + { + struct super_block * sb = mnt->mnt_sb; + int retval = 0; @@ -488,14 +490,17 @@ { struct nameidata old_nd; @@ -1567,7 +1576,7 @@ Index: linux-2.4.21/include/linux/dcache.h =================================================================== --- linux-2.4.21.orig/include/linux/dcache.h 2004-04-24 02:37:59.000000000 -0400 +++ linux-2.4.21/include/linux/dcache.h 2004-04-26 19:06:32.000000000 -0400 -@@ -7,6 +7,51 @@ +@@ -7,6 +7,52 @@ #include #include #include @@ -1582,6 +1591,7 @@ Index: linux-2.4.21/include/linux/dcache.h +#define IT_GETXATTR 0x0040 +#define IT_EXEC 0x0080 +#define IT_PIN 0x0100 ++#define IT_CHDIR 0x0200 + +#define IT_FL_LOCKED 0x0001 +#define IT_FL_FOLLOWED 0x0002 /* set by vfs_follow_link */ @@ -1739,6 +1749,14 @@ Index: linux-2.4.21/include/linux/fs.h int (*getattr) (struct dentry *, struct iattr *); int (*setxattr) (struct dentry *, const char *, const void *, size_t, int); ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); +@@ -938,6 +957,7 @@ + int (*remount_fs) (struct super_block *, int *, char *); + void (*clear_inode) (struct inode *); + void (*umount_begin) (struct super_block *); ++ void (*umount_lustre) (struct super_block *); + + /* Following are for knfsd to interact with "interesting" filesystems + * Currently just reiserfs, but possibly FAT and others later @@ -1204,10 +1223,14 @@ asmlinkage long sys_open(const char *, int, int); @@ -1852,11 +1870,32 @@ Index: linux-2.4.21/kernel/ksyms.c =================================================================== --- linux-2.4.21.orig/kernel/ksyms.c 2004-04-26 18:56:44.000000000 -0400 +++ linux-2.4.21/kernel/ksyms.c 2004-04-26 19:06:32.000000000 -0400 -@@ -329,6 +329,7 @@ +@@ -329,6 +329,8 @@ EXPORT_SYMBOL(set_page_dirty); EXPORT_SYMBOL(vfs_readlink); EXPORT_SYMBOL(vfs_follow_link); +EXPORT_SYMBOL(vfs_follow_link_it); ++EXPORT_SYMBOL(do_umount); EXPORT_SYMBOL(page_readlink); EXPORT_SYMBOL(page_follow_link); EXPORT_SYMBOL(page_symlink_inode_operations); +===== include/linux/mount.h 1.7 vs edited ===== +--- linux-2.4.21.orig/include/linux/mount.h Tue Feb 5 09:49:35 2002 ++++ linux-2.4.21/include/linux/mount.h Tue May 4 19:23:48 2004 +@@ -29,6 +29,8 @@ + int mnt_flags; + char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */ + struct list_head mnt_list; ++ struct list_head mnt_lustre_list; /* GNS mount list */ ++ unsigned long mnt_last_used; /* for GNS auto-umount (jiffies) */ + }; + + static inline struct vfsmount *mntget(struct vfsmount *mnt) +@@ -39,6 +39,7 @@ + } + + extern void __mntput(struct vfsmount *mnt); ++extern int do_umount(struct vfsmount *mnt, int flags); + + static inline void mntput(struct vfsmount *mnt) + { diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.21-suse2.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.21-suse2.patch index 85f8cf4..dc34bb0 100644 --- a/lustre/kernel_patches/patches/vfs_intent-2.4.21-suse2.patch +++ b/lustre/kernel_patches/patches/vfs_intent-2.4.21-suse2.patch @@ -12,10 +12,10 @@ kernel/ksyms.c | 1 12 files changed, 558 insertions(+), 128 deletions(-) -Index: linux-2.4.21-x86_64/fs/dcache.c +Index: kernel-2.4.212lgns/fs/dcache.c =================================================================== ---- linux-2.4.21-x86_64.orig/fs/dcache.c 2003-10-28 10:33:59.000000000 -0800 -+++ linux-2.4.21-x86_64/fs/dcache.c 2004-04-12 19:57:36.000000000 -0700 +--- kernel-2.4.212lgns.orig/fs/dcache.c 2003-10-28 10:33:59.000000000 -0800 ++++ kernel-2.4.212lgns/fs/dcache.c 2004-05-11 06:41:10.000000000 -0700 @@ -186,6 +186,13 @@ spin_unlock(&dcache_lock); return 0; @@ -53,10 +53,10 @@ Index: linux-2.4.21-x86_64/fs/dcache.c } #define do_switch(x,y) do { \ -Index: linux-2.4.21-x86_64/fs/exec.c +Index: kernel-2.4.212lgns/fs/exec.c =================================================================== ---- linux-2.4.21-x86_64.orig/fs/exec.c 2003-10-28 10:34:17.000000000 -0800 -+++ linux-2.4.21-x86_64/fs/exec.c 2004-04-12 19:57:36.000000000 -0700 +--- kernel-2.4.212lgns.orig/fs/exec.c 2003-10-28 10:34:17.000000000 -0800 ++++ kernel-2.4.212lgns/fs/exec.c 2004-05-11 06:41:10.000000000 -0700 @@ -112,8 +112,10 @@ struct file * file; struct nameidata nd; @@ -118,10 +118,10 @@ Index: linux-2.4.21-x86_64/fs/exec.c goto close_fail; retval = binfmt->core_dump(signr, regs, file); -Index: linux-2.4.21-x86_64/fs/namei.c +Index: kernel-2.4.212lgns/fs/namei.c =================================================================== ---- linux-2.4.21-x86_64.orig/fs/namei.c 2003-10-28 10:34:18.000000000 -0800 -+++ linux-2.4.21-x86_64/fs/namei.c 2004-04-12 19:58:44.000000000 -0700 +--- kernel-2.4.212lgns.orig/fs/namei.c 2003-10-28 10:34:18.000000000 -0800 ++++ kernel-2.4.212lgns/fs/namei.c 2004-05-11 06:41:10.000000000 -0700 @@ -94,6 +94,13 @@ * XEmacs seems to be relying on it... */ @@ -147,7 +147,7 @@ Index: linux-2.4.21-x86_64/fs/namei.c struct dentry * dentry = d_lookup(parent, name); + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, flags, it) && ++ if (!dentry->d_op->d_revalidate_it(dentry, flags, NULL, it) && + !d_invalidate(dentry)) { + dput(dentry); + dentry = NULL; @@ -179,7 +179,7 @@ Index: linux-2.4.21-x86_64/fs/namei.c if (dentry) { lock_kernel(); + if (dir->i_op->lookup_it) -+ result = dir->i_op->lookup_it(dir, dentry, it, flags); ++ result = dir->i_op->lookup_it(dir, dentry, NULL, it, flags); + else result = dir->i_op->lookup(dir, dentry); unlock_kernel(); @@ -189,7 +189,7 @@ Index: linux-2.4.21-x86_64/fs/namei.c result = ERR_PTR(-ENOENT); } + } else if (result->d_op && result->d_op->d_revalidate_it) { -+ if (!result->d_op->d_revalidate_it(result, flags, it) && ++ if (!result->d_op->d_revalidate_it(result, flags, NULL, it) && + !d_invalidate(result)) { + dput(result); + if (counter > 10) @@ -306,7 +306,7 @@ Index: linux-2.4.21-x86_64/fs/namei.c dentry = nd->dentry; + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { + err = -ESTALE; -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, it)) { ++ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it)) { + struct dentry *new; + err = permission(dentry->d_parent->d_inode, + MAY_EXEC); @@ -415,7 +415,7 @@ Index: linux-2.4.21-x86_64/fs/namei.c goto out; lock_kernel(); + if (inode->i_op->lookup_it) -+ dentry = inode->i_op->lookup_it(inode, new, it, 0); ++ dentry = inode->i_op->lookup_it(inode, new, NULL, it, 0); + else dentry = inode->i_op->lookup(inode, new); unlock_kernel(); @@ -882,10 +882,10 @@ Index: linux-2.4.21-x86_64/fs/namei.c if (page) { kunmap(page); page_cache_release(page); -Index: linux-2.4.21-x86_64/fs/namespace.c +Index: kernel-2.4.212lgns/fs/namespace.c =================================================================== ---- linux-2.4.21-x86_64.orig/fs/namespace.c 2003-10-28 10:34:12.000000000 -0800 -+++ linux-2.4.21-x86_64/fs/namespace.c 2004-04-12 19:57:36.000000000 -0700 +--- kernel-2.4.212lgns.orig/fs/namespace.c 2003-10-28 10:34:12.000000000 -0800 ++++ kernel-2.4.212lgns/fs/namespace.c 2004-05-11 06:41:10.000000000 -0700 @@ -98,6 +98,7 @@ { old_nd->dentry = mnt->mnt_mountpoint; @@ -902,6 +902,15 @@ Index: linux-2.4.21-x86_64/fs/namespace.c list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry)); list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts); nd->dentry->d_mounted++; +@@ -286,7 +288,7 @@ + } + } + +-static int do_umount(struct vfsmount *mnt, int flags) ++int do_umount(struct vfsmount *mnt, int flags) + { + struct super_block * sb = mnt->mnt_sb; + int retval = 0; @@ -488,14 +490,17 @@ { struct nameidata old_nd; @@ -952,7 +961,7 @@ Index: linux-2.4.21-x86_64/fs/namespace.c if (flags & MS_REMOUNT) retval = do_remount(&nd, flags & ~MS_REMOUNT, mnt_flags, -@@ -739,6 +747,8 @@ +@@ -739,6 +748,8 @@ else retval = do_add_mount(&nd, type_page, flags, mnt_flags, dev_name, data_page); @@ -961,7 +970,7 @@ Index: linux-2.4.21-x86_64/fs/namespace.c path_release(&nd); return retval; } -@@ -904,6 +914,8 @@ +@@ -904,6 +915,8 @@ { struct vfsmount *tmp; struct nameidata new_nd, old_nd, parent_nd, root_parent, user_nd; @@ -970,7 +979,7 @@ Index: linux-2.4.21-x86_64/fs/namespace.c int error; if (!capable(CAP_SYS_ADMIN)) -@@ -911,14 +923,14 @@ +@@ -911,14 +924,14 @@ lock_kernel(); @@ -987,7 +996,7 @@ Index: linux-2.4.21-x86_64/fs/namespace.c if (error) goto out1; -@@ -973,8 +985,10 @@ +@@ -973,8 +986,10 @@ up(&old_nd.dentry->d_inode->i_zombie); up_write(¤t->namespace->sem); path_release(&user_nd); @@ -998,10 +1007,10 @@ Index: linux-2.4.21-x86_64/fs/namespace.c path_release(&new_nd); out0: unlock_kernel(); -Index: linux-2.4.21-x86_64/fs/open.c +Index: kernel-2.4.212lgns/fs/open.c =================================================================== ---- linux-2.4.21-x86_64.orig/fs/open.c 2003-10-28 10:33:59.000000000 -0800 -+++ linux-2.4.21-x86_64/fs/open.c 2004-04-12 19:57:36.000000000 -0700 +--- kernel-2.4.212lgns.orig/fs/open.c 2003-10-28 10:33:59.000000000 -0800 ++++ kernel-2.4.212lgns/fs/open.c 2004-05-11 06:41:10.000000000 -0700 @@ -19,6 +19,8 @@ #include @@ -1402,10 +1411,10 @@ Index: linux-2.4.21-x86_64/fs/open.c /* * Find an empty file descriptor entry, and mark it busy. */ -Index: linux-2.4.21-x86_64/fs/stat.c +Index: kernel-2.4.212lgns/fs/stat.c =================================================================== ---- linux-2.4.21-x86_64.orig/fs/stat.c 2003-10-28 10:33:58.000000000 -0800 -+++ linux-2.4.21-x86_64/fs/stat.c 2004-04-12 19:58:44.000000000 -0700 +--- kernel-2.4.212lgns.orig/fs/stat.c 2003-10-28 10:33:58.000000000 -0800 ++++ kernel-2.4.212lgns/fs/stat.c 2004-05-11 06:41:10.000000000 -0700 @@ -17,10 +17,12 @@ * Revalidate the inode. This is required for proper NFS attribute caching. */ @@ -1563,11 +1572,11 @@ Index: linux-2.4.21-x86_64/fs/stat.c if (!err) err = cp_new_stat64(dentry->d_inode, statbuf); fput(f); -Index: linux-2.4.21-x86_64/include/linux/dcache.h +Index: kernel-2.4.212lgns/include/linux/dcache.h =================================================================== ---- linux-2.4.21-x86_64.orig/include/linux/dcache.h 2003-11-10 16:44:28.000000000 -0800 -+++ linux-2.4.21-x86_64/include/linux/dcache.h 2004-04-12 19:57:36.000000000 -0700 -@@ -7,6 +7,51 @@ +--- kernel-2.4.212lgns.orig/include/linux/dcache.h 2003-11-10 16:44:28.000000000 -0800 ++++ kernel-2.4.212lgns/include/linux/dcache.h 2004-05-11 06:41:10.000000000 -0700 +@@ -7,6 +7,52 @@ #include #include #include @@ -1582,6 +1591,7 @@ Index: linux-2.4.21-x86_64/include/linux/dcache.h +#define IT_GETXATTR 0x0040 +#define IT_EXEC 0x0080 +#define IT_PIN 0x0100 ++#define IT_CHDIR 0x0200 + +#define IT_FL_LOCKED 0x0001 +#define IT_FL_FOLLOWED 0x0002 /* set by vfs_follow_link */ @@ -1619,11 +1629,20 @@ Index: linux-2.4.21-x86_64/include/linux/dcache.h /* * linux/include/linux/dcache.h -@@ -94,8 +139,22 @@ +@@ -87,6 +133,8 @@ + unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */ + }; + ++struct nameidata; ++ + struct dentry_operations { + int (*d_revalidate)(struct dentry *, int); + int (*d_hash) (struct dentry *, struct qstr *); +@@ -94,8 +142,22 @@ int (*d_delete)(struct dentry *); void (*d_release)(struct dentry *); void (*d_iput)(struct dentry *, struct inode *); -+ int (*d_revalidate_it)(struct dentry *, int, struct lookup_intent *); ++ int (*d_revalidate_it)(struct dentry *, int, struct nameidata *, struct lookup_intent *); + void (*d_pin)(struct dentry *, struct vfsmount * , int); + void (*d_unpin)(struct dentry *, struct vfsmount *, int); }; @@ -1642,7 +1661,7 @@ Index: linux-2.4.21-x86_64/include/linux/dcache.h /* the dentry parameter passed to d_hash and d_compare is the parent * directory of the entries to be compared. It is used in case these * functions need any directory specific information for determining -@@ -127,6 +186,7 @@ +@@ -127,6 +189,7 @@ * s_nfsd_free_path semaphore will be down */ #define DCACHE_REFERENCED 0x0008 /* Recently used, don't discard. */ @@ -1650,10 +1669,10 @@ Index: linux-2.4.21-x86_64/include/linux/dcache.h extern spinlock_t dcache_lock; -Index: linux-2.4.21-x86_64/include/linux/fs.h +Index: kernel-2.4.212lgns/include/linux/fs.h =================================================================== ---- linux-2.4.21-x86_64.orig/include/linux/fs.h 2004-04-12 19:57:33.000000000 -0700 -+++ linux-2.4.21-x86_64/include/linux/fs.h 2004-04-12 19:57:36.000000000 -0700 +--- kernel-2.4.212lgns.orig/include/linux/fs.h 2004-05-11 06:37:51.000000000 -0700 ++++ kernel-2.4.212lgns/include/linux/fs.h 2004-05-11 06:48:41.000000000 -0700 @@ -74,6 +74,7 @@ #define FMODE_READ 1 @@ -1712,7 +1731,7 @@ Index: linux-2.4.21-x86_64/include/linux/fs.h int (*create) (struct inode *,struct dentry *,int); + int (*create_it) (struct inode *,struct dentry *,int, struct lookup_intent *); struct dentry * (*lookup) (struct inode *,struct dentry *); -+ struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct lookup_intent *, int flags); ++ struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct nameidata *, struct lookup_intent *, int flags); int (*link) (struct dentry *,struct inode *,struct dentry *); + int (*link_raw) (struct nameidata *,struct nameidata *); int (*unlink) (struct inode *,struct dentry *); @@ -1739,12 +1758,22 @@ Index: linux-2.4.21-x86_64/include/linux/fs.h int (*getattr) (struct dentry *, struct iattr *); int (*setxattr) (struct dentry *, const char *, const void *, size_t, int); ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); -@@ -1205,10 +1224,14 @@ +@@ -1046,6 +1065,7 @@ + int (*remount_fs) (struct super_block *, int *, char *); + void (*clear_inode) (struct inode *); + void (*umount_begin) (struct super_block *); ++ void (*umount_lustre) (struct super_block *); + + /* Following are for knfsd to interact with "interesting" filesystems + * Currently just reiserfs, but possibly FAT and others later +@@ -1205,10 +1225,16 @@ asmlinkage long sys_open(const char *, int, int); asmlinkage long sys_close(unsigned int); /* yes, it's really unsigned */ -extern int do_truncate(struct dentry *, loff_t start); +extern int do_truncate(struct dentry *, loff_t start, int called_from_open); ++struct dentry *lookup_create(struct nameidata *nd, int is_dir, ++ struct lookup_intent *it); extern struct file *filp_open(const char *, int, int); extern struct file * dentry_open(struct dentry *, struct vfsmount *, int); @@ -1755,7 +1784,7 @@ Index: linux-2.4.21-x86_64/include/linux/fs.h extern int filp_close(struct file *, fl_owner_t id); extern char * getname(const char *); -@@ -1504,6 +1527,7 @@ +@@ -1504,6 +1530,7 @@ extern loff_t default_llseek(struct file *file, loff_t offset, int origin); extern int FASTCALL(__user_walk(const char *, unsigned, struct nameidata *)); @@ -1763,7 +1792,7 @@ Index: linux-2.4.21-x86_64/include/linux/fs.h extern int FASTCALL(path_init(const char *, unsigned, struct nameidata *)); extern int FASTCALL(path_walk(const char *, struct nameidata *)); extern int FASTCALL(path_lookup(const char *, unsigned, struct nameidata *)); -@@ -1516,6 +1540,8 @@ +@@ -1516,6 +1543,8 @@ extern struct dentry * lookup_hash(struct qstr *, struct dentry *); #define user_path_walk(name,nd) __user_walk(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd) #define user_path_walk_link(name,nd) __user_walk(name, LOOKUP_POSITIVE, nd) @@ -1772,7 +1801,7 @@ Index: linux-2.4.21-x86_64/include/linux/fs.h extern void inode_init_once(struct inode *); extern void _inode_init_once(struct inode *); -@@ -1667,6 +1693,8 @@ +@@ -1667,6 +1696,8 @@ extern int vfs_readlink(struct dentry *, char *, int, const char *); extern int vfs_follow_link(struct nameidata *, const char *); @@ -1781,10 +1810,10 @@ Index: linux-2.4.21-x86_64/include/linux/fs.h extern int page_readlink(struct dentry *, char *, int); extern int page_follow_link(struct dentry *, struct nameidata *); extern struct inode_operations page_symlink_inode_operations; -Index: linux-2.4.21-x86_64/include/linux/fs_struct.h +Index: kernel-2.4.212lgns/include/linux/fs_struct.h =================================================================== ---- linux-2.4.21-x86_64.orig/include/linux/fs_struct.h 2001-07-13 15:10:44.000000000 -0700 -+++ linux-2.4.21-x86_64/include/linux/fs_struct.h 2004-04-12 19:57:36.000000000 -0700 +--- kernel-2.4.212lgns.orig/include/linux/fs_struct.h 2001-07-13 15:10:44.000000000 -0700 ++++ kernel-2.4.212lgns/include/linux/fs_struct.h 2004-05-11 06:41:10.000000000 -0700 @@ -34,10 +34,12 @@ write_lock(&fs->lock); old_root = fs->root; @@ -1811,10 +1840,31 @@ Index: linux-2.4.21-x86_64/include/linux/fs_struct.h dput(old_pwd); mntput(old_pwdmnt); } -Index: linux-2.4.21-x86_64/kernel/exit.c +Index: kernel-2.4.212lgns/include/linux/mount.h +=================================================================== +--- kernel-2.4.212lgns.orig/include/linux/mount.h 2003-11-06 14:18:54.000000000 -0800 ++++ kernel-2.4.212lgns/include/linux/mount.h 2004-05-11 06:41:10.000000000 -0700 +@@ -29,6 +29,8 @@ + int mnt_flags; + char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */ + struct list_head mnt_list; ++ struct list_head mnt_lustre_list; /* GNS mount list */ ++ unsigned long mnt_last_used; /* for GNS auto-umount (jiffies) */ + }; + + static inline struct vfsmount *mntget(struct vfsmount *mnt) +@@ -39,6 +41,7 @@ + } + + extern void __mntput(struct vfsmount *mnt); ++extern int do_umount(struct vfsmount *mnt, int flags); + + static inline void mntput(struct vfsmount *mnt) + { +Index: kernel-2.4.212lgns/kernel/exit.c =================================================================== ---- linux-2.4.21-x86_64.orig/kernel/exit.c 2003-10-28 10:34:13.000000000 -0800 -+++ linux-2.4.21-x86_64/kernel/exit.c 2004-04-12 19:57:36.000000000 -0700 +--- kernel-2.4.212lgns.orig/kernel/exit.c 2003-10-28 10:34:13.000000000 -0800 ++++ kernel-2.4.212lgns/kernel/exit.c 2004-05-11 06:41:10.000000000 -0700 @@ -288,11 +288,14 @@ { /* No need to hold fs->lock if we are killing it */ @@ -1830,10 +1880,10 @@ Index: linux-2.4.21-x86_64/kernel/exit.c dput(fs->altroot); mntput(fs->altrootmnt); } -Index: linux-2.4.21-x86_64/kernel/fork.c +Index: kernel-2.4.212lgns/kernel/fork.c =================================================================== ---- linux-2.4.21-x86_64.orig/kernel/fork.c 2003-10-28 10:34:17.000000000 -0800 -+++ linux-2.4.21-x86_64/kernel/fork.c 2004-04-12 19:57:36.000000000 -0700 +--- kernel-2.4.212lgns.orig/kernel/fork.c 2003-10-28 10:34:17.000000000 -0800 ++++ kernel-2.4.212lgns/kernel/fork.c 2004-05-11 06:41:10.000000000 -0700 @@ -461,10 +461,13 @@ fs->umask = old->umask; read_lock(&old->lock); @@ -1848,15 +1898,17 @@ Index: linux-2.4.21-x86_64/kernel/fork.c fs->altrootmnt = mntget(old->altrootmnt); fs->altroot = dget(old->altroot); } else { -Index: linux-2.4.21-x86_64/kernel/ksyms.c +Index: kernel-2.4.212lgns/kernel/ksyms.c =================================================================== ---- linux-2.4.21-x86_64.orig/kernel/ksyms.c 2004-04-12 19:57:33.000000000 -0700 -+++ linux-2.4.21-x86_64/kernel/ksyms.c 2004-04-12 19:57:36.000000000 -0700 -@@ -327,6 +327,7 @@ +--- kernel-2.4.212lgns.orig/kernel/ksyms.c 2004-05-11 06:37:51.000000000 -0700 ++++ kernel-2.4.212lgns/kernel/ksyms.c 2004-05-11 06:41:10.000000000 -0700 +@@ -327,6 +327,9 @@ EXPORT_SYMBOL(set_page_dirty); EXPORT_SYMBOL(vfs_readlink); EXPORT_SYMBOL(vfs_follow_link); +EXPORT_SYMBOL(vfs_follow_link_it); ++EXPORT_SYMBOL(do_umount); ++EXPORT_SYMBOL(lookup_create); EXPORT_SYMBOL(page_readlink); EXPORT_SYMBOL(page_follow_link); EXPORT_SYMBOL(page_symlink_inode_operations); diff --git a/lustre/kernel_patches/patches/vfs_intent-2.4.22-rh.patch b/lustre/kernel_patches/patches/vfs_intent-2.4.22-rh.patch index b51ff06..0a66e49 100644 --- a/lustre/kernel_patches/patches/vfs_intent-2.4.22-rh.patch +++ b/lustre/kernel_patches/patches/vfs_intent-2.4.22-rh.patch @@ -141,7 +141,7 @@ struct dentry * dentry = d_lookup(parent, name); + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, flags, it) && ++ if (!dentry->d_op->d_revalidate_it(dentry, flags, NULL, it) && + !d_invalidate(dentry)) { + dput(dentry); + dentry = NULL; @@ -173,7 +173,7 @@ if (dentry) { lock_kernel(); + if (dir->i_op->lookup_it) -+ result = dir->i_op->lookup_it(dir, dentry, it, flags); ++ result = dir->i_op->lookup_it(dir, dentry, NULL, it, flags); + else result = dir->i_op->lookup(dir, dentry); unlock_kernel(); @@ -183,7 +183,7 @@ result = ERR_PTR(-ENOENT); } + } else if (result->d_op && result->d_op->d_revalidate_it) { -+ if (!result->d_op->d_revalidate_it(result, flags, it) && ++ if (!result->d_op->d_revalidate_it(result, flags, NULL, it) && + !d_invalidate(result)) { + dput(result); + if (counter > 10) @@ -294,7 +294,7 @@ dentry = nd->dentry; + if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { + err = -ESTALE; -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, it)) { ++ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it)) { + struct dentry *new; + err = permission(dentry->d_parent->d_inode, + MAY_EXEC); @@ -393,7 +393,7 @@ goto out; lock_kernel(); + if (inode->i_op->lookup_it) -+ dentry = inode->i_op->lookup_it(inode, new, it, 0); ++ dentry = inode->i_op->lookup_it(inode, new, NULL, it, 0); + else dentry = inode->i_op->lookup(inode, new); unlock_kernel(); @@ -593,7 +593,7 @@ + /* SMP-safe */ -static struct dentry *lookup_create(struct nameidata *nd, int is_dir) -+static struct dentry *lookup_create(struct nameidata *nd, int is_dir, ++struct dentry *lookup_create(struct nameidata *nd, int is_dir, + struct lookup_intent *it) { struct dentry *dentry; @@ -878,6 +878,15 @@ list_add(&mnt->mnt_hash, mount_hashtable+hash(nd->mnt, nd->dentry)); list_add(&mnt->mnt_child, &nd->mnt->mnt_mounts); nd->dentry->d_mounted++; +@@ -286,7 +293,7 @@ + } + } + +-static int do_umount(struct vfsmount *mnt, int flags) ++int do_umount(struct vfsmount *mnt, int flags) + { + struct super_block * sb = mnt->mnt_sb; + int retval = 0; @@ -488,14 +490,17 @@ static int do_loopback(struct nameidata { struct nameidata old_nd; @@ -1535,7 +1544,7 @@ fput(f); --- linux-2.4.22-ac1/include/linux/dcache.h~vfs_intent-2.4.22-rh 2003-09-25 14:16:28.000000000 +0400 +++ linux-2.4.22-ac1-alexey/include/linux/dcache.h 2003-09-25 14:42:46.000000000 +0400 -@@ -6,6 +6,51 @@ +@@ -6,6 +6,52 @@ #include #include #include @@ -1550,6 +1559,7 @@ +#define IT_GETXATTR 0x0040 +#define IT_EXEC 0x0080 +#define IT_PIN 0x0100 ++#define IT_CHDIR 0x0200 + +#define IT_FL_LOCKED 0x0001 +#define IT_FL_FOLLOWED 0x0002 /* set by vfs_follow_link */ @@ -1587,11 +1597,20 @@ /* * linux/include/linux/dcache.h +@@ -84,6 +130,8 @@ + unsigned char d_iname[DNAME_INLINE_LEN]; /* small names */ + }; + ++struct nameidata; ++ + struct dentry_operations { + int (*d_revalidate)(struct dentry *, int); + int (*d_hash) (struct dentry *, struct qstr *); @@ -95,8 +140,22 @@ struct dentry_operations { int (*d_delete)(struct dentry *); void (*d_release)(struct dentry *); void (*d_iput)(struct dentry *, struct inode *); -+ int (*d_revalidate_it)(struct dentry *, int, struct lookup_intent *); ++ int (*d_revalidate_it)(struct dentry *, int, struct nameidata *, struct lookup_intent *); + void (*d_pin)(struct dentry *, struct vfsmount * , int); + void (*d_unpin)(struct dentry *, struct vfsmount *, int); }; @@ -1678,7 +1697,7 @@ int (*create) (struct inode *,struct dentry *,int); + int (*create_it) (struct inode *,struct dentry *,int, struct lookup_intent *); struct dentry * (*lookup) (struct inode *,struct dentry *); -+ struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct lookup_intent *, int flags); ++ struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct nameidata *, struct lookup_intent *, int flags); int (*link) (struct dentry *,struct inode *,struct dentry *); + int (*link_raw) (struct nameidata *,struct nameidata *); int (*unlink) (struct inode *,struct dentry *); @@ -1705,12 +1724,22 @@ int (*getattr) (struct dentry *, struct iattr *); int (*setxattr) (struct dentry *, const char *, void *, size_t, int); ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); -@@ -1094,10 +1113,14 @@ static inline int get_lease(struct inode +@@ -938,6 +957,7 @@ + int (*remount_fs) (struct super_block *, int *, char *); + void (*clear_inode) (struct inode *); + void (*umount_begin) (struct super_block *); ++ void (*umount_lustre) (struct super_block *); + + /* Following are for knfsd to interact with "interesting" filesystems + * Currently just reiserfs, but possibly FAT and others later +@@ -1094,10 +1113,16 @@ static inline int get_lease(struct inode asmlinkage long sys_open(const char *, int, int); asmlinkage long sys_close(unsigned int); /* yes, it's really unsigned */ -extern int do_truncate(struct dentry *, loff_t start); +extern int do_truncate(struct dentry *, loff_t start, int called_from_open); ++struct dentry *lookup_create(struct nameidata *nd, int is_dir, ++ struct lookup_intent *it); extern struct file *filp_open(const char *, int, int); extern struct file * dentry_open(struct dentry *, struct vfsmount *, int); @@ -1810,13 +1839,35 @@ } else { --- linux-2.4.22-ac1/kernel/ksyms.c~vfs_intent-2.4.22-rh 2003-09-25 14:39:02.000000000 +0400 +++ linux-2.4.22-ac1-alexey/kernel/ksyms.c 2003-09-25 14:42:46.000000000 +0400 -@@ -295,6 +295,7 @@ EXPORT_SYMBOL(read_cache_page); +@@ -295,6 +295,9 @@ EXPORT_SYMBOL(read_cache_page); EXPORT_SYMBOL(set_page_dirty); EXPORT_SYMBOL(vfs_readlink); EXPORT_SYMBOL(vfs_follow_link); +EXPORT_SYMBOL(vfs_follow_link_it); ++EXPORT_SYMBOL(do_umount); ++EXPORT_SYMBOL(lookup_create); EXPORT_SYMBOL(page_readlink); EXPORT_SYMBOL(page_follow_link); EXPORT_SYMBOL(page_symlink_inode_operations); -_ +Index: linux-2.4.24/include/linux/mount.h +=================================================================== +--- linux-2.4.22-ac1/include/linux/mount.h 2004-05-03 19:56:48.182871712 +0300 ++++ linux-2.4.22-ac1-alexey/include/linux/mount.h 2004-05-03 20:00:02.831280656 +0300 +@@ -29,6 +29,8 @@ + int mnt_flags; + char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */ + struct list_head mnt_list; ++ struct list_head mnt_lustre_list; /* GNS mount list */ ++ unsigned long mnt_last_used; /* for GNS auto-umount (jiffies) */ + }; + + static inline struct vfsmount *mntget(struct vfsmount *mnt) +@@ -39,6 +41,7 @@ + } + + extern void __mntput(struct vfsmount *mnt); ++extern int do_umount(struct vfsmount *mnt, int flags); + + static inline void mntput(struct vfsmount *mnt) + { diff --git a/lustre/kernel_patches/series/vanilla-2.4.24 b/lustre/kernel_patches/series/vanilla-2.4.24 index 4a24f6c..0cbed6a 100644 --- a/lustre/kernel_patches/series/vanilla-2.4.24 +++ b/lustre/kernel_patches/series/vanilla-2.4.24 @@ -4,7 +4,7 @@ uml-export-end_iomem.patch configurable-x86-stack-2.4.20.patch dev_read_only_2.4.20-rh.patch exports_2.4.20-rh-hp.patch -lustre_version.patch +lustre_version.patch vfs_intent-2.4.20-vanilla.patch invalidate_show.patch export-truncate.patch @@ -40,7 +40,8 @@ procfs-ndynamic-2.4.patch ext3-truncate-buffer-head.patch inode-max-readahead-2.4.24.patch dynamic-locks-2.4.24.patch -vfs-pdirops-2.4.20-rh.patch +vfs-pdirops-2.4.20-rh.patch ext3-pdirops-2.4.24-chaos.patch ext3-mds-num-2.4.24.patch export_lookup_create.patch +ext3-raw-lookup-pdirops.patch diff --git a/lustre/ldlm/ldlm_lock.c b/lustre/ldlm/ldlm_lock.c index ec07278..d5607ff 100644 --- a/lustre/ldlm/ldlm_lock.c +++ b/lustre/ldlm/ldlm_lock.c @@ -74,6 +74,8 @@ char *ldlm_it2str(int it) return "unlink"; case IT_GETXATTR: return "getxattr"; + case IT_CHDIR: + return "chdir"; default: CERROR("Unknown intent %d\n", it); return "UNKNOWN"; diff --git a/lustre/ldlm/ldlm_lockd.c b/lustre/ldlm/ldlm_lockd.c index cfaefc5..1da5314 100644 --- a/lustre/ldlm/ldlm_lockd.c +++ b/lustre/ldlm/ldlm_lockd.c @@ -1044,8 +1044,8 @@ static int ldlm_callback_handler(struct ptlrpc_request *req) lock = ldlm_handle2lock_ns(ns, &dlm_req->lock_handle1); if (!lock) { - CDEBUG(D_INODE, "callback on lock "LPX64" - lock disappeared\n", - dlm_req->lock_handle1.cookie); + LDLM_DEBUG_NOLOCK("callback on lock "LPX64" - lock " + "disappeared\n",dlm_req->lock_handle1.cookie); ldlm_callback_reply(req, -EINVAL); RETURN(0); } diff --git a/lustre/llite/Makefile.in b/lustre/llite/Makefile.in index 9492120..8170e1f 100644 --- a/lustre/llite/Makefile.in +++ b/lustre/llite/Makefile.in @@ -1,5 +1,5 @@ MODULES := llite -llite-objs := dcache.o dir.o file.o llite_close.o llite_lib.o llite_nfs.o rw.o lproc_llite.o namei.o special.o symlink.o +llite-objs := dcache.o dir.o file.o llite_close.o llite_gns.o llite_lib.o llite_nfs.o rw.o lproc_llite.o namei.o special.o symlink.o ifeq ($(PATCHLEVEL),4) llite-objs += rw24.o super.o diff --git a/lustre/llite/Makefile.mk b/lustre/llite/Makefile.mk index 06dd10e..166ca64 100644 --- a/lustre/llite/Makefile.mk +++ b/lustre/llite/Makefile.mk @@ -8,4 +8,4 @@ include $(src)/../portals/Kernelenv obj-y += llite.o llite-objs := llite_lib.o dcache.o super.o rw.o \ super25.o file.o dir.o symlink.o namei.o lproc_llite.o \ - rw26.o llite_nfs.o llite_close.o special.o + rw26.o llite_nfs.o llite_close.o llite_gns.o special.o diff --git a/lustre/llite/dcache.c b/lustre/llite/dcache.c index dcf56ef..436dea9 100644 --- a/lustre/llite/dcache.c +++ b/lustre/llite/dcache.c @@ -219,7 +219,8 @@ void ll_frob_intent(struct lookup_intent **itp, struct lookup_intent *deft) it->it_op_release = ll_intent_release; } -int ll_revalidate_it(struct dentry *de, int flags, struct lookup_intent *it) +int ll_revalidate_it(struct dentry *de, int flags, struct nameidata *nd, + struct lookup_intent *it) { int rc; struct ll_fid pfid, cfid; @@ -253,6 +254,9 @@ int ll_revalidate_it(struct dentry *de, int flags, struct lookup_intent *it) if (d_mountpoint(de)) RETURN(1); + if (nd != NULL) + nd->mnt->mnt_last_used = jiffies; + ll_frob_intent(&it, &lookup_it); LASSERT(it); @@ -311,22 +315,28 @@ int ll_revalidate_it(struct dentry *de, int flags, struct lookup_intent *it) __d_rehash(de, 0); spin_unlock(&dcache_lock); + GOTO(out, rc); out: if (req != NULL && rc == 1) ptlrpc_req_finished(req); if (rc == 0) { ll_unhash_aliases(de->d_inode); - /* done in ll_unhash_aliases() - de->d_flags |= DCACHE_LUSTRE_INVALID; */ - } else { - CDEBUG(D_DENTRY, "revalidated dentry %*s (%p) parent %p " - "inode %p refc %d\n", de->d_name.len, - de->d_name.name, de, de->d_parent, de->d_inode, - atomic_read(&de->d_count)); - ll_lookup_finish_locks(it, de); - de->d_flags &= ~DCACHE_LUSTRE_INVALID; + return rc; } - RETURN(rc); + + CDEBUG(D_DENTRY, "revalidated dentry %*s (%p) parent %p " + "inode %p refc %d\n", de->d_name.len, + de->d_name.name, de, de->d_parent, de->d_inode, + atomic_read(&de->d_count)); + ll_lookup_finish_locks(it, de); + de->d_flags &= ~DCACHE_LUSTRE_INVALID; + if (!(de->d_inode->i_mode & S_ISUID) || + !(flags & LOOKUP_CONTINUE || (it->it_op & (IT_CHDIR | IT_OPEN)))) + return rc; + + if (nd) + (void)ll_dir_process_mount_object(de, nd->mnt); + return rc; } /*static*/ void ll_pin(struct dentry *de, struct vfsmount *mnt, int flag) @@ -420,9 +430,9 @@ static int ll_revalidate_nd(struct dentry *dentry, struct nameidata *nd) ENTRY; if (nd && nd->flags & LOOKUP_LAST && !(nd->flags & LOOKUP_LINK_NOTLAST)) - rc = ll_revalidate_it(dentry, nd->flags, &nd->intent); + rc = ll_revalidate_it(dentry, nd->flags, nd, &nd->intent); else - rc = ll_revalidate_it(dentry, 0, NULL); + rc = ll_revalidate_it(dentry, 0, nd, NULL); RETURN(rc); } diff --git a/lustre/llite/dir.c b/lustre/llite/dir.c index b86b79f..0943c38 100644 --- a/lustre/llite/dir.c +++ b/lustre/llite/dir.c @@ -33,6 +33,8 @@ #include #include #include +#include +#include #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) # include // for wait_on_buffer #else @@ -467,6 +469,8 @@ static int ll_dir_ioctl(struct inode *inode, struct file *file, } case LL_IOC_MDC_MKDIRSTRIPE: RETURN(ll_mkdir_stripe(inode, arg)); + case IOC_MDC_FINISH_GNS: + RETURN(ll_finish_gns(sbi)); case LL_IOC_LOV_SETSTRIPE: { struct ptlrpc_request *request = NULL; struct mdc_op_data op_data; diff --git a/lustre/llite/llite_gns.c b/lustre/llite/llite_gns.c new file mode 100644 index 0000000..38cdc53 --- /dev/null +++ b/lustre/llite/llite_gns.c @@ -0,0 +1,413 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * Copyright (C) 2004 Cluster File Systems, Inc. + * Author: Phil Schwan + * + * This file is part of Lustre, http://www.lustre.org. + * + * Lustre is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * Lustre is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Lustre; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#define DEBUG_SUBSYSTEM S_LLITE + +#include +#include +#include +#include +#include + +#include +#include "llite_internal.h" + +/* After roughly how long should we remove an inactive mount? */ +#define GNS_MOUNT_TIMEOUT 120 +/* How often should the GNS timer look for mounts to cleanup? */ +#define GNS_TICK 30 + +int ll_finish_gns(struct ll_sb_info *sbi) +{ + down(&sbi->ll_gns_sem); + if (sbi->ll_gns_state != LL_GNS_STATE_MOUNTING) { + up(&sbi->ll_gns_sem); + CERROR("FINISH_GNS called on mount which was not expecting " + "completion.\n"); + return -EINVAL; + } + + sbi->ll_gns_state = LL_GNS_STATE_FINISHED; + up(&sbi->ll_gns_sem); + complete(&sbi->ll_gns_completion); + + return 0; +} + +/* Pass exactly one (1) page in; when this function returns "page" will point + * somewhere into the middle of the page. */ +int fill_page_with_path(struct dentry *dentry, struct vfsmount *mnt, + char **pagep) +{ + char *path = *pagep, *p; + + path[PAGE_SIZE - 1] = '\0'; + p = path + PAGE_SIZE - 1; + + while (1) { + if (p - path < dentry->d_name.len + 1) + return -ENAMETOOLONG; + if (dentry->d_name.name[0] != '/') { + p -= dentry->d_name.len; + memcpy(p, dentry->d_name.name, dentry->d_name.len); + p--; + *p = '/'; + } + + dentry = dentry->d_parent; + if (dentry->d_parent == dentry) { + if (mnt->mnt_parent == mnt) + break; /* finished walking up */ + mnt = mntget(mnt); + dget(dentry); + while (dentry->d_parent == dentry && + follow_up(&mnt, &dentry)) + ; + mntput(mnt); + dput(dentry); + } + } + *pagep = p; + return 0; +} + +int ll_dir_process_mount_object(struct dentry *dentry, struct vfsmount *mnt) +{ + struct ll_sb_info *sbi; + struct file *mntinfo_fd = NULL; + struct page *datapage = NULL, *pathpage; + struct address_space *mapping; + struct ll_dentry_data *lld = dentry->d_fsdata; + struct dentry *dchild, *tmp_dentry; + struct vfsmount *tmp_mnt; + char *p, *path, *argv[4]; + int stage = 0, rc = 0; + ENTRY; + + if (mnt == NULL) { + CERROR("suid directory found, but no vfsmount available.\n"); + RETURN(-1); + } + + LASSERT(dentry->d_inode != NULL); + LASSERT(lld != NULL); + sbi = ll_i2sbi(dentry->d_inode); + LASSERT(sbi != NULL); + + down(&sbi->ll_gns_sem); + if (sbi->ll_gns_state == LL_GNS_STATE_MOUNTING) { + up(&sbi->ll_gns_sem); + wait_for_completion(&sbi->ll_gns_completion); + if (d_mountpoint(dentry)) + RETURN(0); + RETURN(-1); + } + if (sbi->ll_gns_state == LL_GNS_STATE_FINISHED) { + /* we lost a race; just return */ + up(&sbi->ll_gns_sem); + if (d_mountpoint(dentry)) + RETURN(0); + RETURN(-1); + } + LASSERT(sbi->ll_gns_state == LL_GNS_STATE_IDLE); + sbi->ll_gns_state = LL_GNS_STATE_MOUNTING; + up(&sbi->ll_gns_sem); + + /* We need to build an absolute pathname to pass to mount */ + pathpage = alloc_pages(GFP_HIGHUSER, 0); + if (pathpage == NULL) + GOTO(cleanup, rc = -ENOMEM); + path = kmap(pathpage); + LASSERT(path != NULL); + stage = 1; + fill_page_with_path(dentry, mnt, &path); + + dchild = lookup_one_len(".mntinfo", dentry, strlen(".mntinfo")); + if (dchild == NULL || IS_ERR(dchild)) { + CERROR("Directory %*s is setuid, but without a mount object.\n", + dentry->d_name.len, dentry->d_name.name); + GOTO(cleanup, rc = -1); + } + + mntget(mnt); + + mntinfo_fd = dentry_open(dchild, mnt, 0); + if (IS_ERR(mntinfo_fd)) { + dput(dchild); + mntput(mnt); + GOTO(cleanup, rc = PTR_ERR(mntinfo_fd)); + } + stage = 2; + + if (mntinfo_fd->f_dentry->d_inode->i_size > PAGE_SIZE) { + CERROR("Mount object file is too big (%Ld)\n", + mntinfo_fd->f_dentry->d_inode->i_size); + GOTO(cleanup, rc = -1); + } + mapping = mntinfo_fd->f_dentry->d_inode->i_mapping; + datapage = read_cache_page(mapping, 0, + (filler_t *)mapping->a_ops->readpage, + mntinfo_fd); + if (IS_ERR(datapage)) + GOTO(cleanup, rc = PTR_ERR(datapage)); + + p = kmap(datapage); + LASSERT(p != NULL); + stage = 3; + + p[PAGE_SIZE - 1] = '\0'; + + fput(mntinfo_fd); + mntinfo_fd = NULL; + + argv[0] = "/usr/lib/lustre/gns-upcall.sh"; + argv[1] = p; + argv[2] = path; + argv[3] = NULL; + rc = USERMODEHELPER(argv[0], argv, NULL); + + if (rc != 0) { + CERROR("GNS mount failed: %d\n", rc); + GOTO(cleanup, rc); + } + + wait_for_completion(&sbi->ll_gns_completion); + LASSERT(sbi->ll_gns_state == LL_GNS_STATE_FINISHED); + + if (d_mountpoint(dentry)) { + /* successful follow_down will mntput and dput */ + tmp_mnt = mntget(mnt); + tmp_dentry = dget(dentry); + rc = follow_down(&tmp_mnt, &tmp_dentry); + if (rc == 1) { + struct ll_sb_info *sbi = ll_s2sbi(dentry->d_sb); + spin_lock(&dcache_lock); + LASSERT(list_empty(&tmp_mnt->mnt_lustre_list)); + list_add_tail(&tmp_mnt->mnt_lustre_list, + &sbi->ll_mnt_list); + spin_unlock(&dcache_lock); + + tmp_mnt->mnt_last_used = jiffies; + + mntput(tmp_mnt); + dput(tmp_dentry); + rc = 0; + } else { + mntput(mnt); + dput(dentry); + } + } else { + CERROR("Woke up from GNS mount, but no mountpoint in place.\n"); + rc = -1; + } + + EXIT; +cleanup: + switch (stage) { + case 3: + kunmap(datapage); + page_cache_release(datapage); + case 2: + if (mntinfo_fd != NULL) + fput(mntinfo_fd); + case 1: + kunmap(pathpage); + __free_pages(pathpage, 0); + case 0: + down(&sbi->ll_gns_sem); + sbi->ll_gns_state = LL_GNS_STATE_IDLE; + up(&sbi->ll_gns_sem); + } + return rc; +} + +/* If timeout == 1, only remove the mounts which are properly aged. + * + * If timeout == 0, we are unmounting -- remove them all. */ +int ll_gns_umount_all(struct ll_sb_info *sbi, int timeout) +{ + struct list_head kill_list = LIST_HEAD_INIT(kill_list); + struct page *page = NULL; + char *kpage = NULL, *path; + int rc; + ENTRY; + + if (timeout == 0) { + page = alloc_pages(GFP_HIGHUSER, 0); + if (page == NULL) + RETURN(-ENOMEM); + kpage = kmap(page); + LASSERT(kpage != NULL); + } + + spin_lock(&dcache_lock); + list_splice_init(&sbi->ll_mnt_list, &kill_list); + + /* Walk the list in reverse order, and put them on the front of the + * sbi list each iteration; this avoids list-ordering problems if we + * race with another gns-mounting thread */ + while (!list_empty(&kill_list)) { + struct vfsmount *mnt = + list_entry(kill_list.prev, struct vfsmount, + mnt_lustre_list); + mntget(mnt); + list_del_init(&mnt->mnt_lustre_list); + list_add(&mnt->mnt_lustre_list, &sbi->ll_mnt_list); + + if (timeout && + jiffies - mnt->mnt_last_used < GNS_MOUNT_TIMEOUT * HZ) { + mntput(mnt); + continue; + } + spin_unlock(&dcache_lock); + + CDEBUG(D_INODE, "unmounting mnt %p from sbi %p\n", mnt, sbi); + + rc = do_umount(mnt, 0); + if (rc != 0 && page != NULL) { + int rc2; + path = kpage; + rc2 = fill_page_with_path(mnt->mnt_root, mnt, &path); + CERROR("GNS umount(%s): %d\n", rc2 == 0 ? path : "", + rc); + } + mntput(mnt); + spin_lock(&dcache_lock); + } + spin_unlock(&dcache_lock); + + if (page != NULL) { + kunmap(page); + __free_pages(page, 0); + } + RETURN(0); +} + +static struct list_head gns_sbi_list = LIST_HEAD_INIT(gns_sbi_list); +static struct semaphore gns_sem; +static struct ptlrpc_thread gns_thread; + +void ll_gns_timer_callback(unsigned long data) +{ + struct ll_sb_info *sbi = (void *)data; + ENTRY; + + down(&gns_sem); + if (list_empty(&sbi->ll_gns_sbi_head)) + list_add(&sbi->ll_gns_sbi_head, &gns_sbi_list); + up(&gns_sem); + wake_up(&gns_thread.t_ctl_waitq); + mod_timer(&sbi->ll_gns_timer, jiffies + GNS_TICK * HZ); +} + +static int gns_check_event(void) +{ + int rc; + down(&gns_sem); + rc = !list_empty(&gns_sbi_list); + up(&gns_sem); + return rc; +} + +static int ll_gns_thread_main(void *arg) +{ + unsigned long flags; + ENTRY; + + { + char name[sizeof(current->comm)]; + snprintf(name, sizeof(name) - 1, "ll_gns"); + kportal_daemonize(name); + } + SIGNAL_MASK_LOCK(current, flags); + sigfillset(¤t->blocked); + RECALC_SIGPENDING; + SIGNAL_MASK_UNLOCK(current, flags); + + gns_thread.t_flags = SVC_RUNNING; + wake_up(&gns_thread.t_ctl_waitq); + + while ((gns_thread.t_flags & SVC_STOPPING) == 0) { + struct l_wait_info lwi = { 0 }; + + l_wait_event(gns_thread.t_ctl_waitq, gns_check_event() || + gns_thread.t_flags & SVC_STOPPING, &lwi); + + down(&gns_sem); + while (!list_empty(&gns_sbi_list)) { + struct ll_sb_info *sbi = + list_entry(gns_sbi_list.prev, struct ll_sb_info, + ll_gns_sbi_head); + list_del_init(&sbi->ll_gns_sbi_head); + ll_gns_umount_all(sbi, 1); + } + up(&gns_sem); + } + + gns_thread.t_flags = SVC_STOPPED; + wake_up(&gns_thread.t_ctl_waitq); + + RETURN(0); +} + +void ll_gns_add_timer(struct ll_sb_info *sbi) +{ + mod_timer(&sbi->ll_gns_timer, jiffies + GNS_TICK * HZ); +} + +void ll_gns_del_timer(struct ll_sb_info *sbi) +{ + del_timer(&sbi->ll_gns_timer); +} + +int ll_gns_start_thread(void) +{ + struct l_wait_info lwi = { 0 }; + int rc; + + LASSERT(gns_thread.t_flags == 0); + sema_init(&gns_sem, 1); + + init_waitqueue_head(&gns_thread.t_ctl_waitq); + rc = kernel_thread(ll_gns_thread_main, NULL, CLONE_VM | CLONE_FILES); + if (rc < 0) { + CERROR("cannot start thread: %d\n", rc); + return rc; + } + l_wait_event(gns_thread.t_ctl_waitq, gns_thread.t_flags & SVC_RUNNING, + &lwi); + return 0; +} + +void ll_gns_stop_thread(void) +{ + struct l_wait_info lwi = { 0 }; + + down(&gns_sem); + gns_thread.t_flags = SVC_STOPPING; + up(&gns_sem); + + wake_up(&gns_thread.t_ctl_waitq); + l_wait_event(gns_thread.t_ctl_waitq, gns_thread.t_flags & SVC_STOPPED, + &lwi); + gns_thread.t_flags = 0; +} diff --git a/lustre/llite/llite_internal.h b/lustre/llite/llite_internal.h index d8526f0..7c8927b 100644 --- a/lustre/llite/llite_internal.h +++ b/lustre/llite/llite_internal.h @@ -41,8 +41,21 @@ struct ll_sb_info { unsigned long ll_read_ahead_pages; unsigned long ll_max_read_ahead_pages; + /* list of GNS mounts; protected by the dcache_lock */ + struct list_head ll_mnt_list; + + struct semaphore ll_gns_sem; + wait_queue_head_t ll_gns_waitq; + struct completion ll_gns_completion; + int ll_gns_state; + struct timer_list ll_gns_timer; + struct list_head ll_gns_sbi_head; }; +#define LL_GNS_STATE_IDLE 1100 +#define LL_GNS_STATE_MOUNTING 1101 +#define LL_GNS_STATE_FINISHED 1102 + struct ll_readahead_state { spinlock_t ras_lock; unsigned long ras_last_readpage, ras_consecutive; @@ -166,8 +179,18 @@ void ll_unhash_aliases(struct inode *); void ll_frob_intent(struct lookup_intent **itp, struct lookup_intent *deft); void ll_lookup_finish_locks(struct lookup_intent *it, struct dentry *dentry); -/* llite/llite_lib.c */ +/* llite/llite_gns.c */ +int ll_finish_gns(struct ll_sb_info *sbi); +int fill_page_with_path(struct dentry *, struct vfsmount *, char **pagep); +int ll_dir_process_mount_object(struct dentry *, struct vfsmount *); +int ll_gns_umount_all(struct ll_sb_info *sbi, int timeout); +void ll_gns_timer_callback(unsigned long data); +void ll_gns_add_timer(struct ll_sb_info *sbi); +void ll_gns_del_timer(struct ll_sb_info *sbi); +int ll_gns_start_thread(void); +void ll_gns_stop_thread(void); +/* llite/llite_lib.c */ extern struct super_operations lustre_super_operations; char *ll_read_opt(const char *opt, char *data); diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c index 14dd91a..2e5e41f 100644 --- a/lustre/llite/llite_lib.c +++ b/lustre/llite/llite_lib.c @@ -59,6 +59,15 @@ struct ll_sb_info *lustre_init_sbi(struct super_block *sb) sbi->ll_max_read_ahead_pages = SBI_DEFAULT_RA_MAX; INIT_LIST_HEAD(&sbi->ll_conn_chain); INIT_HLIST_HEAD(&sbi->ll_orphan_dentry_list); + INIT_LIST_HEAD(&sbi->ll_mnt_list); + sema_init(&sbi->ll_gns_sem, 1); + init_completion(&sbi->ll_gns_completion); + sbi->ll_gns_state = LL_GNS_STATE_IDLE; + sbi->ll_gns_timer.data = (unsigned long)sbi; + sbi->ll_gns_timer.function = ll_gns_timer_callback; + init_timer(&sbi->ll_gns_timer); + INIT_LIST_HEAD(&sbi->ll_gns_sbi_head); + ll_set_sbi(sb, sbi); generate_random_uuid(uuid); @@ -71,8 +80,11 @@ void lustre_free_sbi(struct super_block *sb) struct ll_sb_info *sbi = ll_s2sbi(sb); ENTRY; - if (sbi != NULL) + if (sbi != NULL) { + list_del(&sbi->ll_gns_sbi_head); + del_timer(&sbi->ll_gns_timer); OBD_FREE(sbi, sizeof(*sbi)); + } ll_set_sbi(sb, NULL); EXIT; } @@ -218,6 +230,8 @@ int lustre_common_fill_super(struct super_block *sb, char *mdc, char *osc) GOTO(out_root, err); } + ll_gns_add_timer(sbi); + /* making vm readahead 0 for 2.4.x. In the case of 2.6.x, backing dev info assigned to inode mapping is used for determining maximal readahead. */ @@ -247,6 +261,8 @@ void lustre_common_put_super(struct super_block *sb) struct hlist_node *tmp, *next; ENTRY; + ll_gns_del_timer(sbi); + ll_close_thread_shutdown(sbi->ll_lcq); list_del(&sbi->ll_conn_chain); diff --git a/lustre/llite/namei.c b/lustre/llite/namei.c index 9e79cd6..85f950e 100644 --- a/lustre/llite/namei.c +++ b/lustre/llite/namei.c @@ -330,6 +330,7 @@ static int lookup_it_finish(struct ptlrpc_request *request, int offset, static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry, + struct nameidata *nd, struct lookup_intent *it, int flags) { struct dentry *save = dentry, *retval; @@ -351,6 +352,9 @@ static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry, if (d_mountpoint(dentry)) CERROR("Tell Peter, lookup on mtpt, it %s\n", LL_IT2STR(it)); + if (nd != NULL) + nd->mnt->mnt_last_used = jiffies; + ll_frob_intent(&it, &lookup_it); icbd.icbd_childp = &dentry; @@ -372,6 +376,11 @@ static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry, ll_lookup_finish_locks(it, dentry); + if (nd && + dentry->d_inode != NULL && dentry->d_inode->i_mode & S_ISUID && + (flags & LOOKUP_CONTINUE || (it->it_op & (IT_CHDIR | IT_OPEN)))) + ll_dir_process_mount_object(dentry, nd->mnt); + if (dentry == save) GOTO(out, retval = NULL); else @@ -404,9 +413,9 @@ static struct dentry *ll_lookup_nd(struct inode *parent, struct dentry *dentry, ENTRY; if (nd && nd->flags & LOOKUP_LAST && !(nd->flags & LOOKUP_LINK_NOTLAST)) - de = ll_lookup_it(parent, dentry, &nd->intent, nd->flags); + de = ll_lookup_it(parent, dentry, nd, &nd->intent, nd->flags); else - de = ll_lookup_it(parent, dentry, NULL, 0); + de = ll_lookup_it(parent, dentry, nd, NULL, 0); RETURN(de); } diff --git a/lustre/llite/super.c b/lustre/llite/super.c index 133407a..c70a998 100644 --- a/lustre/llite/super.c +++ b/lustre/llite/super.c @@ -60,6 +60,13 @@ static struct super_block *lustre_read_super(struct super_block *sb, RETURN(sb); } +static void ll_umount_lustre(struct super_block *sb) +{ + struct ll_sb_info *sbi = ll_s2sbi(sb); + + ll_gns_umount_all(sbi, 0); +} + static struct file_system_type lustre_lite_fs_type = { .owner = THIS_MODULE, .name = "lustre_lite", @@ -76,6 +83,7 @@ struct super_operations lustre_super_operations = .put_super = lustre_put_super, .statfs = ll_statfs, .umount_begin = ll_umount_begin, + .umount_lustre = ll_umount_lustre, .fh_to_dentry = ll_fh_to_dentry, .dentry_to_fh = ll_dentry_to_fh }; @@ -89,7 +97,7 @@ static struct file_system_type lustre_fs_type = { static int __init init_lustre_lite(void) { - int rc; + int rc, cleanup = 0; printk(KERN_INFO "Lustre: Lustre Lite Client File System; " "info@clusterfs.com\n"); @@ -102,10 +110,29 @@ static int __init init_lustre_lite(void) proc_lustre_fs_root = proc_lustre_root ? proc_mkdir("llite", proc_lustre_root) : NULL; rc = register_filesystem(&lustre_lite_fs_type); - if (rc == 0) - rc = register_filesystem(&lustre_fs_type); if (rc) + goto out; + cleanup = 1; + + rc = register_filesystem(&lustre_fs_type); + if (rc) + goto out; + cleanup = 2; + + rc = ll_gns_start_thread(); + if (rc) + goto out; + return 0; + + out: + switch (cleanup) { + case 2: + unregister_filesystem(&lustre_fs_type); + case 1: unregister_filesystem(&lustre_lite_fs_type); + case 0: + kmem_cache_destroy(ll_file_data_slab); + } return rc; } @@ -114,6 +141,8 @@ static void __exit exit_lustre_lite(void) unregister_filesystem(&lustre_lite_fs_type); unregister_filesystem(&lustre_fs_type); + ll_gns_stop_thread(); + kmem_cache_destroy(ll_file_data_slab); if (proc_lustre_fs_root) { diff --git a/lustre/mdc/mdc_locks.c b/lustre/mdc/mdc_locks.c index 7381065..5e6983e 100644 --- a/lustre/mdc/mdc_locks.c +++ b/lustre/mdc/mdc_locks.c @@ -76,7 +76,8 @@ static int it_to_lock_mode(struct lookup_intent *it) /* CREAT needs to be tested before open (both could be set) */ if (it->it_op & IT_CREAT) return LCK_PW; - else if (it->it_op & (IT_READDIR | IT_GETATTR | IT_OPEN | IT_LOOKUP)) + else if (it->it_op & (IT_READDIR | IT_GETATTR | IT_OPEN | IT_LOOKUP | + IT_CHDIR)) return LCK_PR; LBUG(); @@ -253,7 +254,7 @@ int mdc_enqueue(struct obd_export *exp, /* get ready for the reply */ reply_buffers = 4; req->rq_replen = lustre_msg_size(4, repsize); - } else if (it->it_op & (IT_GETATTR | IT_LOOKUP)) { + } else if (it->it_op & (IT_GETATTR | IT_LOOKUP | IT_CHDIR)) { int valid = OBD_MD_FLNOTOBD | OBD_MD_FLEASIZE; size[2] = sizeof(struct mds_body); size[3] = data->namelen + 1; @@ -432,7 +433,8 @@ int mdc_intent_lock(struct obd_export *exp, struct ll_uctxt *uctxt, CDEBUG(D_DLMTRACE, "name: %*s in %ld, intent: %s\n", len, name, pfid ? (unsigned long) pfid->id : 0 , ldlm_it2str(it->it_op)); - if ((it->it_op == IT_LOOKUP || it->it_op == IT_GETATTR) && cfid) { + if (cfid && (it->it_op == IT_LOOKUP || it->it_op == IT_GETATTR || + it->it_op == IT_CHDIR)) { /* We could just return 1 immediately, but since we should only * be called in revalidate_it if we already have a lock, let's * verify that. */ @@ -551,7 +553,7 @@ int mdc_intent_lock(struct obd_export *exp, struct ll_uctxt *uctxt, } else if (it->it_op == IT_OPEN) { LASSERT(!it_disposition(it, DISP_OPEN_CREATE)); } else { - LASSERT(it->it_op & (IT_GETATTR | IT_LOOKUP)); + LASSERT(it->it_op & (IT_GETATTR | IT_LOOKUP | IT_CHDIR)); } /* If we already have a matching lock, then cancel the new diff --git a/lustre/mds/handler.c b/lustre/mds/handler.c index b6cc997..d69ce24 100644 --- a/lustre/mds/handler.c +++ b/lustre/mds/handler.c @@ -2391,6 +2391,7 @@ static int mds_intent_policy(struct ldlm_namespace *ns, break; case IT_LOOKUP: getattr_part = MDS_INODELOCK_LOOKUP; + case IT_CHDIR: case IT_GETATTR: getattr_part |= MDS_INODELOCK_LOOKUP; case IT_READDIR: diff --git a/lustre/mds/mds_open.c b/lustre/mds/mds_open.c index bc82a93..3ff867b 100644 --- a/lustre/mds/mds_open.c +++ b/lustre/mds/mds_open.c @@ -768,6 +768,21 @@ int mds_lock_new_child(struct obd_device *obd, struct inode *inode, RETURN(rc); } +static int is_mount_object(struct dentry *dparent) +{ + struct dentry *dchild; + + if (!(dparent->d_inode->i_mode & S_ISUID)) + return 0; + + dchild = lookup_one_len(".mntinfo", dparent, strlen(".mntinfo")); + if (IS_ERR(dchild) || dchild == NULL) + return 0; + + dput(dchild); + return 1; +} + int mds_open(struct mds_update_record *rec, int offset, struct ptlrpc_request *req, struct lustre_handle *child_lockh) { @@ -1055,12 +1070,18 @@ got_child: if (S_ISDIR(dchild->d_inode->i_mode)) { if (rec->ur_flags & MDS_OPEN_CREAT || rec->ur_flags & FMODE_WRITE) { - /*we are tryying to create or write a exist dir*/ + /*we are trying to create or write a exist dir*/ GOTO(cleanup, rc = -EISDIR); } if (ll_permission(dchild->d_inode, acc_mode, NULL)) { GOTO(cleanup, rc = -EACCES); } + if (is_mount_object(dchild)) { + CERROR("Found possible GNS mount object %*s; not " + "opening.\n", dchild->d_name.len, + dchild->d_name.name); + GOTO(cleanup, rc = 0); // success, but don't really open + } } if (rc == 0) { diff --git a/lustre/obdclass/class_obd.c b/lustre/obdclass/class_obd.c index f6a0667..e244759 100644 --- a/lustre/obdclass/class_obd.c +++ b/lustre/obdclass/class_obd.c @@ -658,8 +658,8 @@ static void cleanup_obdclass(void) /* Check that we're building against the appropriate version of the Lustre * kernel patch */ #include -#define LUSTRE_MIN_VERSION 32 -#define LUSTRE_MAX_VERSION 37 +#define LUSTRE_MIN_VERSION 500 +#define LUSTRE_MAX_VERSION 500 #if (LUSTRE_KERNEL_VERSION < LUSTRE_MIN_VERSION) # error Cannot continue: Your Lustre kernel patch is older than the sources #elif (LUSTRE_KERNEL_VERSION > LUSTRE_MAX_VERSION) diff --git a/lustre/utils/lctl.c b/lustre/utils/lctl.c index b61c60b..4da2878 100644 --- a/lustre/utils/lctl.c +++ b/lustre/utils/lctl.c @@ -221,6 +221,7 @@ command_t cmdlist[] = { {"deactivate", jt_obd_deactivate, 0, "deactivate an import\n"}, {"recover", jt_obd_recover, 0, "usage: recover []"}, {"lookup", jt_obd_mdc_lookup, 0, "usage: lookup "}, + {"finish_gns", jt_obd_finish_gns, 0, "usage: finish_gns "}, {"notransno", jt_obd_no_transno, 0, "disable sending of committed-transno updates\n"}, {"readonly", jt_obd_set_readonly, 0, diff --git a/lustre/utils/obd.c b/lustre/utils/obd.c index 92e6556..fb5db7b 100644 --- a/lustre/utils/obd.c +++ b/lustre/utils/obd.c @@ -1659,6 +1659,35 @@ int jt_obd_mdc_lookup(int argc, char **argv) return rc; } +int jt_obd_finish_gns(int argc, char **argv) +{ + char *mtpt; + int rc, fd; + struct obd_ioctl_data data; + + if (argc != 2) + return CMD_HELP; + + mtpt = argv[1]; + + fd = open(mtpt, O_RDONLY); + if (fd < 0) { + fprintf(stderr, "open \"%s\" failed: %s\n", mtpt, + strerror(errno)); + return -1; + } + + IOC_INIT(data); + IOC_PACK(argv[0], data); + rc = ioctl(fd, IOC_MDC_FINISH_GNS, buf); + if (rc < 0) { + fprintf(stderr, "error: %s(%s) ioctl error: %s\n", + jt_cmdname(argv[0]), mtpt, strerror(rc = errno)); + } + close(fd); + + return rc; +} int jt_obd_close_uuid(int argc, char **argv) { diff --git a/lustre/utils/obdctl.h b/lustre/utils/obdctl.h index 5d0c9cf..845a50e 100644 --- a/lustre/utils/obdctl.h +++ b/lustre/utils/obdctl.h @@ -72,6 +72,7 @@ int jt_obd_activate(int argc, char **argv); int jt_obd_deactivate(int argc, char **argv); int jt_obd_recover(int argc, char **argv); int jt_obd_mdc_lookup(int argc, char **argv); +int jt_obd_finish_gns(int argc, char **argv); int jt_get_version(int argc, char **argv); int jt_obd_close_uuid(int argc, char **argv); int jt_cfg_record(int argc, char **argv); -- 1.8.3.1