From: pschwan Date: Thu, 7 Nov 2002 21:15:07 +0000 (+0000) Subject: - land b_symlink on HEAD X-Git-Tag: 0.5.17~55 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=dad77b4a6cb6b200ccf29c3d730957129865b4a7;p=fs%2Flustre-release.git - land b_symlink on HEAD - print peer when entering recovery, since MDC uuids are no longer descriptive --- diff --git a/lustre/llite/symlink.c b/lustre/llite/symlink.c index 9b230e7..8042589 100644 --- a/lustre/llite/symlink.c +++ b/lustre/llite/symlink.c @@ -83,7 +83,8 @@ static int ll_readlink(struct dentry *dentry, char *buffer, int buflen) RETURN(rc); } -static int ll_follow_link(struct dentry *dentry, struct nameidata *nd) +static int ll_follow_link(struct dentry *dentry, struct nameidata *nd, + struct lookup_intent *it) { struct inode *inode = dentry->d_inode; struct ll_inode_info *lli = ll_i2info(inode); @@ -92,12 +93,21 @@ static int ll_follow_link(struct dentry *dentry, struct nameidata *nd) int rc; ENTRY; + /* we got here from a lookup up to the symlink that we hit */ + if (it->it_lock_mode) { + struct lustre_handle *handle = + (struct lustre_handle *)it->it_lock_handle; + ldlm_lock_decref(handle, it->it_lock_mode); + it->it_lock_mode = 0; + memset(handle, 0, sizeof(*handle)); + } + down(&lli->lli_open_sem); rc = ll_readlink_internal(inode, &request, &symname); if (rc) GOTO(out, rc); - rc = vfs_follow_link(nd, symname); + rc = vfs_follow_link_it(nd, symname, it); out: up(&lli->lli_open_sem); ptlrpc_req_finished(request); @@ -109,5 +119,5 @@ extern int ll_setattr(struct dentry *de, struct iattr *attr); struct inode_operations ll_fast_symlink_inode_operations = { readlink: ll_readlink, setattr: ll_setattr, - follow_link: ll_follow_link + follow_link2: ll_follow_link }; diff --git a/lustre/lov/lov_obd.c b/lustre/lov/lov_obd.c index ad410d6..af37ded 100644 --- a/lustre/lov/lov_obd.c +++ b/lustre/lov/lov_obd.c @@ -54,6 +54,7 @@ static int lov_connect(struct lustre_handle *conn, struct obd_device *obd, struct lustre_handle mdc_conn; obd_uuid_t *uuidarray; int rc, rc2, i; + ENTRY; MOD_INC_USE_COUNT; rc = class_connect(conn, obd, cluuid); @@ -178,7 +179,7 @@ static int lov_connect(struct lustre_handle *conn, struct obd_device *obd, out: ptlrpc_req_finished(req); - return rc; + RETURN(rc); out_disc: while (i-- > 0) { diff --git a/lustre/obdclass/class_obd.c b/lustre/obdclass/class_obd.c index f43f8a5..81a862d 100644 --- a/lustre/obdclass/class_obd.c +++ b/lustre/obdclass/class_obd.c @@ -751,11 +751,8 @@ static void __exit cleanup_obdclass(void) /* Check that we're building against the appropriate version of the Lustre * kernel patch */ -#ifndef LUSTRE_KERNEL_VERSION -# define LUSTRE_KERNEL_VERSION 1 -#endif - -#if (LUSTRE_KERNEL_VERSION != 1) +#include +#if (LUSTRE_KERNEL_VERSION != 2) # error Cannot continue: Your Lustre kernel patch is out of date #endif diff --git a/lustre/patches/patch-2.4.18-14 b/lustre/patches/patch-2.4.18-14 index 90eaee2..22029f1 100644 --- a/lustre/patches/patch-2.4.18-14 +++ b/lustre/patches/patch-2.4.18-14 @@ -1,5 +1,9 @@ ---- linux-2.4.18-12-uml-pristine/arch/ia64/mm/init.c Mon Sep 9 14:41:40 2002 -+++ linux-2.4.18-12-uml/arch/ia64/mm/init.c Mon Sep 9 16:08:12 2002 +--- linux-2.4.18-17.8.0-uml-pristine/include/linux/lustre_version.h Wed Dec 31 19:00:00 1969 ++++ linux-2.4.18-17.8.0-uml/include/linux/lustre_version.h Wed Nov 6 02:34:14 2002 +@@ -0,0 +1 @@ ++#define LUSTRE_KERNEL_VERSION 2 +--- linux-2.4.18-17.8.0-uml-pristine/arch/ia64/mm/init.c 2002-10-19 11:44:08.000000000 -0600 ++++ linux-2.4.18-17.8.0-uml/arch/ia64/mm/init.c 2002-10-19 11:44:51.000000000 -0600 @@ -37,6 +37,12 @@ static unsigned long totalram_pages; @@ -13,8 +17,8 @@ int do_check_pgt_cache (int low, int high) { ---- linux-2.4.18-12-uml-pristine/arch/i386/mm/init.c Mon Sep 9 14:41:54 2002 -+++ linux-2.4.18-12-uml/arch/i386/mm/init.c Mon Sep 9 16:08:12 2002 +--- linux-2.4.18-17.8.0-uml-pristine/arch/i386/mm/init.c 2002-10-19 11:44:04.000000000 -0600 ++++ linux-2.4.18-17.8.0-uml/arch/i386/mm/init.c 2002-10-19 11:44:51.000000000 -0600 @@ -43,6 +43,12 @@ static unsigned long totalram_pages; static unsigned long totalhigh_pages; @@ -28,8 +32,8 @@ int do_check_pgt_cache(int low, int high) { int freed = 0; ---- linux-2.4.18-12-uml-pristine/drivers/block/blkpg.c Mon Sep 9 14:41:58 2002 -+++ linux-2.4.18-12-uml/drivers/block/blkpg.c Mon Sep 9 16:08:12 2002 +--- linux-2.4.18-17.8.0-uml-pristine/drivers/block/blkpg.c 2002-10-19 11:43:55.000000000 -0600 ++++ linux-2.4.18-17.8.0-uml/drivers/block/blkpg.c 2002-10-19 11:44:51.000000000 -0600 @@ -297,3 +297,38 @@ } @@ -69,8 +73,8 @@ +EXPORT_SYMBOL(dev_set_rdonly); +EXPORT_SYMBOL(dev_check_rdonly); +EXPORT_SYMBOL(dev_clear_rdonly); ---- linux-2.4.18-12-uml-pristine/drivers/block/loop.c Mon Sep 9 14:41:58 2002 -+++ linux-2.4.18-12-uml/drivers/block/loop.c Mon Sep 9 16:08:12 2002 +--- linux-2.4.18-17.8.0-uml-pristine/drivers/block/loop.c 2002-10-19 11:43:55.000000000 -0600 ++++ linux-2.4.18-17.8.0-uml/drivers/block/loop.c 2002-10-19 11:44:51.000000000 -0600 @@ -491,6 +491,11 @@ spin_unlock_irq(&lo->lo_lock); @@ -83,8 +87,8 @@ if (lo->lo_flags & LO_FLAGS_READ_ONLY) goto err; } else if (rw == READA) { ---- linux-2.4.18-12-uml-pristine/drivers/ide/ide-disk.c Mon Sep 9 14:41:57 2002 -+++ linux-2.4.18-12-uml/drivers/ide/ide-disk.c Mon Sep 9 16:08:12 2002 +--- linux-2.4.18-17.8.0-uml-pristine/drivers/ide/ide-disk.c 2002-10-19 11:43:58.000000000 -0600 ++++ linux-2.4.18-17.8.0-uml/drivers/ide/ide-disk.c 2002-10-19 11:44:51.000000000 -0600 @@ -557,6 +557,12 @@ */ static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block) @@ -98,8 +102,8 @@ if (IDE_CONTROL_REG) OUT_BYTE(drive->ctl,IDE_CONTROL_REG); ---- linux-2.4.18-12-uml-pristine/fs/ext3/Makefile Fri Dec 21 10:41:55 2001 -+++ linux-2.4.18-12-uml/fs/ext3/Makefile Mon Sep 9 16:08:12 2002 +--- linux-2.4.18-17.8.0-uml-pristine/fs/ext3/Makefile 2002-10-19 11:43:53.000000000 -0600 ++++ linux-2.4.18-17.8.0-uml/fs/ext3/Makefile 2002-10-19 11:44:51.000000000 -0600 @@ -9,6 +9,8 @@ O_TARGET := ext3.o @@ -109,8 +113,8 @@ obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ ioctl.o namei.o super.o symlink.o obj-m := $(O_TARGET) ---- linux-2.4.18-12-uml-pristine/fs/ext3/super.c Mon Sep 9 14:41:50 2002 -+++ linux-2.4.18-12-uml/fs/ext3/super.c Mon Sep 9 16:08:12 2002 +--- linux-2.4.18-17.8.0-uml-pristine/fs/ext3/super.c 2002-10-19 11:43:53.000000000 -0600 ++++ linux-2.4.18-17.8.0-uml/fs/ext3/super.c 2002-10-19 11:44:51.000000000 -0600 @@ -1746,7 +1746,7 @@ unregister_filesystem(&ext3_fs_type); } @@ -120,8 +124,8 @@ MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); MODULE_DESCRIPTION("Second Extended Filesystem with journaling extensions"); ---- linux-2.4.18-12-uml-pristine/include/linux/slab.h Wed Sep 11 12:32:08 2002 -+++ linux-2.4.18-12-uml/include/linux/slab.h Wed Sep 18 15:52:16 2002 +--- linux-2.4.18-17.8.0-uml-pristine/include/linux/slab.h 2002-10-19 11:43:54.000000000 -0600 ++++ linux-2.4.18-17.8.0-uml/include/linux/slab.h 2002-11-02 00:49:24.000000000 -0700 @@ -57,6 +57,7 @@ extern int kmem_cache_shrink(kmem_cache_t *); extern void *kmem_cache_alloc(kmem_cache_t *, int); @@ -130,9 +134,17 @@ extern void *kmalloc(size_t, int); extern void kfree(const void *); ---- linux-2.4.18-12-uml-pristine/kernel/ksyms.c Mon Sep 9 14:41:58 2002 -+++ linux-2.4.18-12-uml/kernel/ksyms.c Mon Sep 9 16:08:12 2002 -@@ -306,6 +306,12 @@ +--- linux-2.4.18-17.8.0-uml-pristine/kernel/ksyms.c 2002-10-19 11:43:53.000000000 -0600 ++++ linux-2.4.18-17.8.0-uml/kernel/ksyms.c 2002-11-02 01:09:34.000000000 -0700 +@@ -292,6 +292,7 @@ + EXPORT_SYMBOL(set_page_dirty); + EXPORT_SYMBOL(vfs_readlink); + EXPORT_SYMBOL(vfs_follow_link); ++EXPORT_SYMBOL(vfs_follow_link_it); + EXPORT_SYMBOL(page_readlink); + EXPORT_SYMBOL(page_follow_link); + EXPORT_SYMBOL(page_symlink_inode_operations); +@@ -306,6 +307,12 @@ EXPORT_SYMBOL_GPL(nr_free_pages); EXPORT_SYMBOL_GPL(page_cache_size); @@ -145,8 +157,8 @@ /* for stackable file systems (lofs, wrapfs, cryptfs, etc.) */ EXPORT_SYMBOL(default_llseek); EXPORT_SYMBOL(dentry_open); ---- linux-2.4.18-12-uml-pristine/include/linux/dcache.h Wed Sep 11 12:32:08 2002 -+++ linux-2.4.18-12-uml/include/linux/dcache.h Wed Sep 18 14:21:14 2002 +--- linux-2.4.18-17.8.0-uml-pristine/include/linux/dcache.h 2002-10-19 11:43:54.000000000 -0600 ++++ linux-2.4.18-17.8.0-uml/include/linux/dcache.h 2002-11-02 00:49:24.000000000 -0700 @@ -6,6 +6,34 @@ #include #include @@ -199,8 +211,8 @@ }; /* the dentry parameter passed to d_hash and d_compare is the parent ---- linux-2.4.18-12-uml-pristine/include/linux/fs.h Wed Sep 11 12:32:08 2002 -+++ linux-2.4.18-12-uml/include/linux/fs.h Wed Sep 18 15:52:16 2002 +--- linux-2.4.18-17.8.0-uml-pristine/include/linux/fs.h 2002-10-19 11:43:54.000000000 -0600 ++++ linux-2.4.18-17.8.0-uml/include/linux/fs.h 2002-11-02 00:49:24.000000000 -0700 @@ -576,6 +576,7 @@ /* needed for tty driver, and maybe others */ @@ -228,7 +240,16 @@ int (*link) (struct dentry *,struct inode *,struct dentry *); int (*unlink) (struct inode *,struct dentry *); int (*symlink) (struct inode *,struct dentry *,const char *); -@@ -1046,6 +1050,7 @@ +@@ -907,6 +911,8 @@ + struct inode *, struct dentry *); + int (*readlink) (struct dentry *, char *,int); + int (*follow_link) (struct dentry *, struct nameidata *); ++ int (*follow_link2) (struct dentry *, struct nameidata *, ++ struct lookup_intent *it); + void (*truncate) (struct inode *); + int (*permission) (struct inode *, int); + int (*revalidate) (struct dentry *); +@@ -1046,6 +1052,7 @@ extern struct vfsmount *kern_mount(struct file_system_type *); extern int may_umount(struct vfsmount *); extern long do_mount(char *, char *, char *, unsigned long, void *); @@ -236,7 +257,7 @@ extern void umount_tree(struct vfsmount *); #define kern_umount mntput -@@ -1380,6 +1385,7 @@ +@@ -1380,6 +1387,7 @@ extern loff_t default_llseek(struct file *file, loff_t offset, int origin); extern int FASTCALL(__user_walk(const char *, unsigned, struct nameidata *)); @@ -244,7 +265,7 @@ 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 *)); -@@ -1391,6 +1397,8 @@ +@@ -1391,6 +1399,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) @@ -253,9 +274,27 @@ extern void inode_init_once(struct inode *); extern void iput(struct inode *); ---- linux-2.4.18-12-uml-pristine/fs/dcache.c Mon Sep 9 14:41:54 2002 -+++ linux-2.4.18-12-uml/fs/dcache.c Mon Sep 9 16:08:12 2002 -@@ -645,6 +645,7 @@ +@@ -1491,6 +1501,8 @@ + + extern int vfs_readlink(struct dentry *, char *, int, const char *); + extern int vfs_follow_link(struct nameidata *, const char *); ++extern int vfs_follow_link_it(struct nameidata *, const char *, ++ struct lookup_intent *it); + 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; +--- linux-2.4.18-17.8.0-uml-pristine/fs/dcache.c 2002-10-19 11:43:53.000000000 -0600 ++++ linux-2.4.18-17.8.0-uml/fs/dcache.c 2002-10-31 13:10:34.000000000 -0700 +@@ -150,6 +150,8 @@ + unhash_it: + list_del_init(&dentry->d_hash); + ++ ++ + kill_it: { + struct dentry *parent; + list_del(&dentry->d_child); +@@ -645,6 +647,7 @@ dentry->d_fsdata = NULL; dentry->d_extra_attributes = NULL; dentry->d_mounted = 0; @@ -263,8 +302,8 @@ INIT_LIST_HEAD(&dentry->d_hash); INIT_LIST_HEAD(&dentry->d_lru); INIT_LIST_HEAD(&dentry->d_subdirs); ---- linux-2.4.18-12-uml-pristine/fs/nfsd/vfs.c Mon Sep 9 14:41:50 2002 -+++ linux-2.4.18-12-uml/fs/nfsd/vfs.c Mon Sep 9 16:08:12 2002 +--- linux-2.4.18-17.8.0-uml-pristine/fs/nfsd/vfs.c 2002-10-19 11:43:53.000000000 -0600 ++++ linux-2.4.18-17.8.0-uml/fs/nfsd/vfs.c 2002-10-19 11:44:51.000000000 -0600 @@ -1298,7 +1298,7 @@ err = nfserr_perm; } else @@ -274,9 +313,16 @@ unlock_kernel(); if (!err && EX_ISSYNC(tfhp->fh_export)) { nfsd_sync_dir(tdentry); ---- linux-2.4.18-12-uml-pristine/fs/namei.c Mon Sep 9 14:41:56 2002 -+++ linux-2.4.18-12-uml/fs/namei.c Wed Sep 18 16:59:58 2002 -@@ -94,6 +94,14 @@ +--- linux-2.4.18-17.8.0-uml-pristine/fs/namei.c 2002-10-19 11:43:53.000000000 -0600 ++++ linux-2.4.18-17.8.0-uml/fs/namei.c 2002-11-02 01:02:26.000000000 -0700 +@@ -1,3 +1,6 @@ ++ ++ ++ + /* + * linux/fs/namei.c + * +@@ -94,6 +97,14 @@ * XEmacs seems to be relying on it... */ @@ -291,7 +337,7 @@ /* 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 +268,19 @@ +@@ -260,10 +271,19 @@ * Internal lookup() using the new generic dcache. * SMP-safe */ @@ -312,7 +358,7 @@ if (dentry && dentry->d_op && dentry->d_op->d_revalidate) { if (!dentry->d_op->d_revalidate(dentry, flags) && !d_invalidate(dentry)) { dput(dentry); -@@ -281,7 +298,8 @@ +@@ -281,7 +301,8 @@ * make sure that nobody added the entry to the dcache in the meantime.. * SMP-safe */ @@ -322,7 +368,7 @@ { struct dentry * result; struct inode *dir = parent->d_inode; -@@ -300,6 +318,9 @@ +@@ -300,6 +321,9 @@ result = ERR_PTR(-ENOMEM); if (dentry) { lock_kernel(); @@ -332,7 +378,7 @@ result = dir->i_op->lookup(dir, dentry); unlock_kernel(); if (result) -@@ -321,6 +342,12 @@ +@@ -321,6 +345,12 @@ dput(result); result = ERR_PTR(-ENOENT); } @@ -345,7 +391,33 @@ } return result; } -@@ -449,7 +476,8 @@ +@@ -334,7 +364,8 @@ + * Without that kind of total limit, nasty chains of consecutive + * symlinks can cause almost arbitrarily long lookups. + */ +-static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd) ++static inline int do_follow_link(struct dentry *dentry, struct nameidata *nd, ++ struct lookup_intent *it) + { + int err; + if (current->link_count >= max_recursive_link) +@@ -348,10 +379,14 @@ + current->link_count++; + current->total_link_count++; + UPDATE_ATIME(dentry->d_inode); +- err = dentry->d_inode->i_op->follow_link(dentry, nd); ++ if (dentry->d_inode->i_op->follow_link2) ++ err = dentry->d_inode->i_op->follow_link2(dentry, nd, it); ++ else ++ err = dentry->d_inode->i_op->follow_link(dentry, nd); + current->link_count--; + return err; + loop: ++ intent_release(dentry, it); + path_release(nd); + return -ELOOP; + } +@@ -449,7 +484,8 @@ * * We expect 'base' to be positive and a directory. */ @@ -355,7 +427,7 @@ { struct dentry *dentry; struct inode *inode; -@@ -526,12 +554,12 @@ +@@ -526,12 +562,12 @@ break; } /* This does the actual lookups.. */ @@ -370,7 +442,18 @@ err = PTR_ERR(dentry); if (IS_ERR(dentry)) break; -@@ -565,7 +593,7 @@ +@@ -548,8 +584,8 @@ + if (!inode->i_op) + goto out_dput; + +- if (inode->i_op->follow_link) { +- err = do_follow_link(dentry, nd); ++ if (inode->i_op->follow_link || inode->i_op->follow_link2) { ++ err = do_follow_link(dentry, nd, it); + dput(dentry); + if (err) + goto return_err; +@@ -565,7 +601,7 @@ nd->dentry = dentry; } err = -ENOTDIR; @@ -379,7 +462,7 @@ break; continue; /* here ends the main loop */ -@@ -592,12 +620,12 @@ +@@ -592,12 +628,12 @@ if (err < 0) break; } @@ -394,7 +477,20 @@ err = PTR_ERR(dentry); if (IS_ERR(dentry)) break; -@@ -621,7 +649,8 @@ +@@ -606,8 +642,10 @@ + ; + inode = dentry->d_inode; + if ((lookup_flags & LOOKUP_FOLLOW) +- && inode && inode->i_op && inode->i_op->follow_link) { +- err = do_follow_link(dentry, nd); ++ && inode && inode->i_op && ++ (inode->i_op->follow_link || ++ inode->i_op->follow_link2)) { ++ err = do_follow_link(dentry, nd, it); + dput(dentry); + if (err) + goto return_err; +@@ -621,7 +659,8 @@ goto no_inode; if (lookup_flags & LOOKUP_DIRECTORY) { err = -ENOTDIR; @@ -404,7 +500,7 @@ break; } goto return_base; -@@ -663,10 +693,21 @@ +@@ -663,10 +702,21 @@ return err; } @@ -427,7 +523,7 @@ } /* SMP-safe */ -@@ -751,6 +795,17 @@ +@@ -751,6 +801,17 @@ } /* SMP-safe */ @@ -445,7 +541,7 @@ int path_lookup(const char *path, unsigned flags, struct nameidata *nd) { int error = 0; -@@ -779,7 +834,8 @@ +@@ -779,7 +840,8 @@ * needs parent already locked. Doesn't follow mounts. * SMP-safe. */ @@ -455,7 +551,7 @@ { struct dentry * dentry; struct inode *inode; -@@ -802,13 +858,16 @@ +@@ -802,13 +864,16 @@ goto out; } @@ -473,7 +569,7 @@ dentry = inode->i_op->lookup(inode, new); unlock_kernel(); if (!dentry) -@@ -820,6 +879,12 @@ +@@ -820,6 +885,12 @@ return dentry; } @@ -486,7 +582,7 @@ /* SMP-safe */ struct dentry * lookup_one_len(const char * name, struct dentry * base, int len) { -@@ -841,7 +906,7 @@ +@@ -841,7 +912,7 @@ } this.hash = end_name_hash(hash); @@ -495,7 +591,7 @@ access: return ERR_PTR(-EACCES); } -@@ -872,6 +937,23 @@ +@@ -872,6 +943,23 @@ return err; } @@ -519,7 +615,7 @@ /* * It's inline, so penalty for filesystems that don't use sticky bit is * minimal. -@@ -1010,7 +1092,8 @@ +@@ -1010,7 +1098,8 @@ * for symlinks (where the permissions are checked later). * SMP-safe */ @@ -529,7 +625,7 @@ { int acc_mode, error = 0; struct inode *inode; -@@ -1024,7 +1107,7 @@ +@@ -1024,7 +1113,7 @@ * The simplest case - just a plain lookup. */ if (!(flag & O_CREAT)) { @@ -538,7 +634,7 @@ if (error) return error; dentry = nd->dentry; -@@ -1034,6 +1117,10 @@ +@@ -1034,6 +1123,10 @@ /* * Create - we need to know the parent. */ @@ -549,7 +645,7 @@ error = path_lookup(pathname, LOOKUP_PARENT, nd); if (error) return error; -@@ -1049,7 +1137,7 @@ +@@ -1049,7 +1142,7 @@ dir = nd->dentry; down(&dir->d_inode->i_sem); @@ -558,7 +654,7 @@ do_last: error = PTR_ERR(dentry); -@@ -1058,6 +1146,7 @@ +@@ -1058,6 +1151,7 @@ goto exit; } @@ -566,7 +662,17 @@ /* Negative dentry, just create the file */ if (!dentry->d_inode) { error = vfs_create(dir->d_inode, dentry, -@@ -1177,8 +1267,10 @@ +@@ -1091,7 +1185,8 @@ + error = -ENOENT; + if (!dentry->d_inode) + goto exit_dput; +- if (dentry->d_inode->i_op && dentry->d_inode->i_op->follow_link) ++ if (dentry->d_inode->i_op && (dentry->d_inode->i_op->follow_link || ++ dentry->d_inode->i_op->follow_link2)) + goto do_link; + + dput(nd->dentry); +@@ -1177,8 +1272,10 @@ return 0; exit_dput: @@ -577,16 +683,21 @@ path_release(nd); return error; -@@ -1198,6 +1290,8 @@ +@@ -1197,7 +1294,12 @@ + * are done. Procfs-like symlinks just set LAST_BIND. */ UPDATE_ATIME(dentry->d_inode); - error = dentry->d_inode->i_op->follow_link(dentry, nd); +- error = dentry->d_inode->i_op->follow_link(dentry, nd); ++ if (dentry->d_inode->i_op->follow_link2) ++ error = dentry->d_inode->i_op->follow_link2(dentry, nd, it); ++ else ++ error = dentry->d_inode->i_op->follow_link(dentry, nd); + if (error) + intent_release(dentry, it); dput(dentry); if (error) return error; -@@ -1219,13 +1313,20 @@ +@@ -1219,13 +1321,20 @@ } dir = nd->dentry; down(&dir->d_inode->i_sem); @@ -609,7 +720,7 @@ { struct dentry *dentry; -@@ -1233,7 +1334,7 @@ +@@ -1233,7 +1342,7 @@ dentry = ERR_PTR(-EEXIST); if (nd->last_type != LAST_NORM) goto fail; @@ -618,7 +729,7 @@ if (IS_ERR(dentry)) goto fail; if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode) -@@ -1279,6 +1380,7 @@ +@@ -1279,6 +1388,7 @@ char * tmp; struct dentry * dentry; struct nameidata nd; @@ -626,7 +737,7 @@ if (S_ISDIR(mode)) return -EPERM; -@@ -1289,7 +1391,7 @@ +@@ -1289,7 +1399,7 @@ error = path_lookup(tmp, LOOKUP_PARENT, &nd); if (error) goto out; @@ -635,7 +746,7 @@ error = PTR_ERR(dentry); mode &= ~current->fs->umask; -@@ -1307,6 +1410,7 @@ +@@ -1307,6 +1417,7 @@ default: error = -EINVAL; } @@ -643,7 +754,7 @@ dput(dentry); } up(&nd.dentry->d_inode->i_sem); -@@ -1347,6 +1451,7 @@ +@@ -1347,6 +1458,7 @@ { int error = 0; char * tmp; @@ -651,7 +762,7 @@ tmp = getname(pathname); error = PTR_ERR(tmp); -@@ -1357,11 +1462,12 @@ +@@ -1357,11 +1469,12 @@ error = path_lookup(tmp, LOOKUP_PARENT, &nd); if (error) goto out; @@ -665,7 +776,7 @@ dput(dentry); } up(&nd.dentry->d_inode->i_sem); -@@ -1445,6 +1552,7 @@ +@@ -1445,6 +1558,7 @@ char * name; struct dentry *dentry; struct nameidata nd; @@ -673,7 +784,7 @@ name = getname(pathname); if(IS_ERR(name)) -@@ -1466,10 +1574,11 @@ +@@ -1466,10 +1580,11 @@ goto exit1; } down(&nd.dentry->d_inode->i_sem); @@ -686,7 +797,7 @@ dput(dentry); } up(&nd.dentry->d_inode->i_sem); -@@ -1513,6 +1623,7 @@ +@@ -1513,6 +1628,7 @@ char * name; struct dentry *dentry; struct nameidata nd; @@ -694,7 +805,7 @@ name = getname(pathname); if(IS_ERR(name)) -@@ -1525,7 +1636,7 @@ +@@ -1525,7 +1641,7 @@ if (nd.last_type != LAST_NORM) goto exit1; down(&nd.dentry->d_inode->i_sem); @@ -703,7 +814,7 @@ error = PTR_ERR(dentry); if (!IS_ERR(dentry)) { /* Why not before? Because we want correct error value */ -@@ -1533,6 +1644,7 @@ +@@ -1533,6 +1649,7 @@ goto slashes; error = vfs_unlink(nd.dentry->d_inode, dentry); exit2: @@ -711,7 +822,7 @@ dput(dentry); } up(&nd.dentry->d_inode->i_sem); -@@ -1579,6 +1692,7 @@ +@@ -1579,6 +1696,7 @@ int error = 0; char * from; char * to; @@ -719,7 +830,7 @@ from = getname(oldname); if(IS_ERR(from)) -@@ -1592,10 +1706,12 @@ +@@ -1592,10 +1710,12 @@ error = path_lookup(to, LOOKUP_PARENT, &nd); if (error) goto out; @@ -733,7 +844,7 @@ dput(dentry); } up(&nd.dentry->d_inode->i_sem); -@@ -1660,6 +1777,7 @@ +@@ -1660,6 +1780,7 @@ { int error; char * to; @@ -741,7 +852,7 @@ to = getname(newname); error = PTR_ERR(to); -@@ -1667,7 +1785,7 @@ +@@ -1667,7 +1788,7 @@ struct dentry *new_dentry; struct nameidata nd, old_nd; @@ -750,7 +861,7 @@ if (error) goto exit; error = path_lookup(to, LOOKUP_PARENT, &nd); -@@ -1676,10 +1794,12 @@ +@@ -1676,10 +1797,12 @@ error = -EXDEV; if (old_nd.mnt != nd.mnt) goto out_release; @@ -764,7 +875,7 @@ dput(new_dentry); } up(&nd.dentry->d_inode->i_sem); -@@ -1720,7 +1841,8 @@ +@@ -1720,7 +1843,8 @@ * locking]. */ int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry, @@ -774,7 +885,7 @@ { int error; struct inode *target; -@@ -1778,6 +1900,7 @@ +@@ -1778,6 +1902,7 @@ error = -EBUSY; else error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry); @@ -782,7 +893,7 @@ if (target) { if (!error) target->i_flags |= S_DEAD; -@@ -1799,7 +1923,8 @@ +@@ -1799,7 +1924,8 @@ } int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry, @@ -792,7 +903,7 @@ { int error; -@@ -1830,6 +1951,7 @@ +@@ -1830,6 +1956,7 @@ error = -EBUSY; else error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry); @@ -852,15 +963,58 @@ + new_dir->d_inode, new_dentry, &it); unlock_kernel(); -+ intent_release(new_dentry, &it); ++ intent_release(new_dentry, NULL); dput(new_dentry); exit4: -+ intent_release(old_dentry, &it); // FIXME: release same intent twice!!! ++ intent_release(old_dentry, &it); dput(old_dentry); exit3: double_up(&new_dir->d_inode->i_sem, &old_dir->d_inode->i_sem); ---- linux-2.4.18-12-uml-pristine/fs/open.c Mon Sep 9 14:41:56 2002 -+++ linux-2.4.18-12-uml/fs/open.c Mon Sep 9 16:11:20 2002 +@@ -1965,7 +2097,8 @@ + } + + static inline int +-__vfs_follow_link(struct nameidata *nd, const char *link) ++__vfs_follow_link(struct nameidata *nd, const char *link, ++ struct lookup_intent *it) + { + int res = 0; + char *name; +@@ -1978,7 +2111,7 @@ + /* weird __emul_prefix() stuff did it */ + goto out; + } +- res = link_path_walk(link, nd); ++ res = link_path_walk_it(link, nd, it); + out: + if (current->link_count || res || nd->last_type!=LAST_NORM) + return res; +@@ -2000,7 +2133,13 @@ + + int vfs_follow_link(struct nameidata *nd, const char *link) + { +- return __vfs_follow_link(nd, link); ++ return __vfs_follow_link(nd, link, NULL); ++} ++ ++int vfs_follow_link_it(struct nameidata *nd, const char *link, ++ struct lookup_intent *it) ++{ ++ return __vfs_follow_link(nd, link, it); + } + + /* get the link contents into pagecache */ +@@ -2042,7 +2181,7 @@ + { + struct page *page = NULL; + char *s = page_getlink(dentry, &page); +- int res = __vfs_follow_link(nd, s); ++ int res = __vfs_follow_link(nd, s, NULL); + if (page) { + kunmap(page); + page_cache_release(page); +--- linux-2.4.18-17.8.0-uml-pristine/fs/open.c 2002-10-19 11:43:53.000000000 -0600 ++++ linux-2.4.18-17.8.0-uml/fs/open.c 2002-10-19 11:44:51.000000000 -0600 @@ -19,6 +19,9 @@ #include @@ -886,7 +1040,7 @@ if (error) goto out; inode = nd.dentry->d_inode; -@@ -168,6 +173,7 @@ +@@ -168,6 +172,7 @@ put_write_access(inode); dput_and_out: @@ -894,7 +1048,7 @@ path_release(&nd); out: return error; -@@ -259,8 +265,9 @@ +@@ -259,8 +264,9 @@ struct nameidata nd; struct inode * inode; struct iattr newattrs; @@ -905,7 +1059,7 @@ if (error) goto out; inode = nd.dentry->d_inode; -@@ -286,6 +294,7 @@ +@@ -286,6 +292,7 @@ } error = notify_change(nd.dentry, &newattrs); dput_and_out: @@ -913,7 +1067,7 @@ path_release(&nd); out: return error; -@@ -303,8 +312,9 @@ +@@ -303,8 +310,9 @@ struct nameidata nd; struct inode * inode; struct iattr newattrs; @@ -924,7 +1078,7 @@ if (error) goto out; -@@ -331,6 +342,7 @@ +@@ -331,6 +339,7 @@ } error = notify_change(nd.dentry, &newattrs); dput_and_out: @@ -932,7 +1086,7 @@ path_release(&nd); out: return error; -@@ -347,6 +359,7 @@ +@@ -347,6 +356,7 @@ int old_fsuid, old_fsgid; kernel_cap_t old_cap; int res; @@ -940,7 +1094,7 @@ if (mode & ~S_IRWXO) /* where's F_OK, X_OK, W_OK, R_OK? */ return -EINVAL; -@@ -364,13 +377,14 @@ +@@ -364,13 +374,14 @@ else current->cap_effective = current->cap_permitted; @@ -956,7 +1110,7 @@ path_release(&nd); } -@@ -385,8 +399,11 @@ +@@ -385,8 +396,11 @@ { int error; struct nameidata nd; @@ -969,7 +1123,7 @@ if (error) goto out; -@@ -397,6 +415,7 @@ +@@ -397,6 +411,7 @@ set_fs_pwd(current->fs, nd.mnt, nd.dentry); dput_and_out: @@ -977,7 +1131,7 @@ path_release(&nd); out: return error; -@@ -436,9 +455,10 @@ +@@ -436,9 +451,10 @@ { int error; struct nameidata nd; @@ -990,7 +1144,7 @@ if (error) goto out; -@@ -454,6 +475,7 @@ +@@ -454,6 +470,7 @@ set_fs_altroot(); error = 0; dput_and_out: @@ -998,7 +1152,7 @@ path_release(&nd); out: return error; -@@ -498,8 +520,9 @@ +@@ -498,8 +515,9 @@ struct inode * inode; int error; struct iattr newattrs; @@ -1009,7 +1163,7 @@ if (error) goto out; inode = nd.dentry->d_inode; -@@ -519,6 +543,7 @@ +@@ -519,6 +537,7 @@ error = notify_change(nd.dentry, &newattrs); dput_and_out: @@ -1017,7 +1171,7 @@ path_release(&nd); out: return error; -@@ -588,10 +613,12 @@ +@@ -588,10 +607,12 @@ { struct nameidata nd; int error; @@ -1031,7 +1185,7 @@ path_release(&nd); } return error; -@@ -601,10 +629,12 @@ +@@ -601,10 +622,12 @@ { struct nameidata nd; int error; @@ -1045,7 +1199,7 @@ path_release(&nd); } return error; -@@ -638,10 +669,16 @@ +@@ -638,10 +661,16 @@ * for the internal routines (ie open_namei()/follow_link() etc). 00 is * used by symlinks. */ @@ -1062,19 +1216,18 @@ namei_flags = flags; if ((namei_flags+1) & O_ACCMODE) -@@ -649,18 +686,19 @@ +@@ -649,18 +678,19 @@ if (namei_flags & O_TRUNC) namei_flags |= 2; - error = open_namei(filename, namei_flags, mode, &nd); - if (!error) - return dentry_open(nd.dentry, nd.mnt, flags); -- -- return ERR_PTR(error); + error = open_namei_it(filename, namei_flags, mode, &nd, &it); + if (error) + return ERR_PTR(error); -+ + +- return ERR_PTR(error); + return dentry_open_it(nd.dentry, nd.mnt, flags, &it); } @@ -1088,7 +1241,7 @@ { struct file * f; struct inode *inode; -@@ -711,6 +749,7 @@ +@@ -711,6 +741,7 @@ do_readahead(f, 0, (48 * 1024) >> PAGE_SHIFT); @@ -1096,7 +1249,7 @@ return f; cleanup_all: -@@ -725,11 +764,17 @@ +@@ -725,11 +756,17 @@ cleanup_file: put_filp(f); cleanup_dentry: @@ -1114,8 +1267,8 @@ /* * Find an empty file descriptor entry, and mark it busy. */ ---- linux-2.4.18-12-uml-pristine/fs/stat.c Mon Sep 9 14:41:56 2002 -+++ linux-2.4.18-12-uml/fs/stat.c Mon Sep 9 16:08:12 2002 +--- linux-2.4.18-17.8.0-uml-pristine/fs/stat.c 2002-10-19 11:43:53.000000000 -0600 ++++ linux-2.4.18-17.8.0-uml/fs/stat.c 2002-10-19 11:44:51.000000000 -0600 @@ -13,6 +13,7 @@ #include @@ -1152,8 +1305,8 @@ path_release(&nd); } return error; ---- linux-2.4.18-12-uml-pristine/mm/slab.c Mon Sep 9 14:41:53 2002 -+++ linux-2.4.18-12-uml/mm/slab.c Mon Sep 9 16:08:12 2002 +--- linux-2.4.18-17.8.0-uml-pristine/mm/slab.c 2002-10-19 11:43:54.000000000 -0600 ++++ linux-2.4.18-17.8.0-uml/mm/slab.c 2002-10-19 11:44:51.000000000 -0600 @@ -1208,6 +1208,59 @@ * Called with the cache-lock held. */ diff --git a/lustre/ptlrpc/recovd.c b/lustre/ptlrpc/recovd.c index e216424..9f5d2a2 100644 --- a/lustre/ptlrpc/recovd.c +++ b/lustre/ptlrpc/recovd.c @@ -123,8 +123,10 @@ void recovd_conn_fail(struct ptlrpc_connection *conn) EXIT; return; } - + CERROR("connection %p to %s failed\n", conn, conn->c_remote_uuid); + CERROR("peer is %08x %08lx %08lx\n", conn->c_peer->peer_nid, + conn->c_peer->peer_ni.nal_idx, conn->c_peer->peer_ni.handle_idx); list_del(&rd->rd_managed_chain); list_add_tail(&rd->rd_managed_chain, &recovd->recovd_troubled_items); if (rd->rd_phase != RD_IDLE) { @@ -215,12 +217,12 @@ static int recovd_handle_event(struct recovd_obd *recovd) cb_failed: /* must always reach here with recovd_lock held! */ CERROR("recovery FAILED for rd %p (conn %p): %d\n", rd, class_rd2conn(rd), rc); - + spin_unlock(&recovd->recovd_lock); (void)rd->rd_recover(rd, PTLRPC_RECOVD_PHASE_FAILURE); spin_lock(&recovd->recovd_lock); break; - + case RD_TROUBLED: if (!rd->rd_recover) { CERROR("no rd_recover for rd %p (conn %p)\n", @@ -232,38 +234,38 @@ static int recovd_handle_event(struct recovd_obd *recovd) rd, class_rd2conn(rd)); rd->rd_phase = RD_PREPARING; rd->rd_next_phase = RD_PREPARED; - + spin_unlock(&recovd->recovd_lock); rc = rd->rd_recover(rd, PTLRPC_RECOVD_PHASE_PREPARE); spin_lock(&recovd->recovd_lock); if (rc) goto cb_failed; - + break; - + case RD_PREPARED: - + CERROR("recovery prepared for rd %p (conn %p)\n", rd, class_rd2conn(rd)); rd->rd_phase = RD_RECOVERING; rd->rd_next_phase = RD_RECOVERED; - + spin_unlock(&recovd->recovd_lock); rc = rd->rd_recover(rd, PTLRPC_RECOVD_PHASE_RECOVER); spin_lock(&recovd->recovd_lock); if (rc) goto cb_failed; - + break; - + case RD_RECOVERED: rd->rd_phase = RD_IDLE; rd->rd_next_phase = RD_TROUBLED; - + CERROR("recovery complete for rd %p (conn %p)\n", rd, class_rd2conn(rd)); break; - + default: break; }