From: adilger Date: Mon, 21 Jun 2004 18:24:32 +0000 (+0000) Subject: Land b1_4_smallfix onto b1_4 (20040621_1216) X-Git-Tag: v1_7_100~1^368~12 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=eb58a44b29a235559aa515d7d03096986aae568d;p=fs%2Flustre-release.git Land b1_4_smallfix onto b1_4 (20040621_1216) - don't cleanup request in ll_file_open() on failed MDS open (3430) - make sure to unset replay flag from failed open requests (3440) - if default stripe count is 0, use OST count for inode size (3636) - update parent mtime/ctime on client for create/unlink (2611) - allow clients to reconnect during replay (1742) - re-awaken ptlrpcd if new requests arrive during check_set (3554) - fix cond_resched (3554) - only evict unfinished clients after recovery (3515) - allow bulk resend, prevent data loss (3570) - remove extraneous obd dereference causing LASSERT failure (3334) - don't use get_cycles() when creating temp. files on the mds (3156) - hold i_sem when setting i_size in ll_extent_lock() (3564) - handle EEXIST for set-stripe, set proper directory name (3336) - fix ksocknal_fmb_callback() error messages (2918) --- diff --git a/lustre/kernel_patches/patches/iopen-2.4.19-suse.patch b/lustre/kernel_patches/patches/iopen-2.4.19-suse.patch index 01c040c..5b1a481 100644 --- a/lustre/kernel_patches/patches/iopen-2.4.19-suse.patch +++ b/lustre/kernel_patches/patches/iopen-2.4.19-suse.patch @@ -74,7 +74,7 @@ Index: linux-2.4.19/fs/ext3/iopen.c =================================================================== --- linux-2.4.19.orig/fs/ext3/iopen.c 2003-01-30 05:24:37.000000000 -0500 +++ linux-2.4.19/fs/ext3/iopen.c 2004-04-23 22:37:48.000000000 -0400 -@@ -0,0 +1,258 @@ +@@ -0,0 +1,282 @@ +/* + * linux/fs/ext3/iopen.c + * @@ -211,13 +211,24 @@ Index: linux-2.4.19/fs/ext3/iopen.c + +/* This function is spliced into ext3_lookup and does the move of a + * disconnected dentry (if it exists) to a connected dentry. -+ * Caller must hold dcache_lock. + */ -+struct dentry *iopen_connect_dentry(struct dentry *de, struct inode *inode) ++struct dentry *iopen_connect_dentry(struct dentry *dentry, struct inode *inode, ++ int rehash) +{ + struct dentry *tmp, *goal = NULL; + struct list_head *lp; + ++ /* verify this dentry is really new */ ++ assert(dentry->d_inode == NULL); ++ assert(list_empty(&dentry->d_alias)); /* d_instantiate */ ++ if (rehash) ++ assert(list_empty(&dentry->d_hash)); /* d_rehash */ ++ assert(list_empty(&dentry->d_subdirs)); ++ ++ spin_lock(&dcache_lock); ++ if (!inode) ++ goto do_rehash; ++ + /* preferrably return a connected dentry */ + list_for_each(lp, &inode->i_dentry) { + tmp = list_entry(lp, struct dentry, d_alias); @@ -231,27 +242,40 @@ Index: linux-2.4.19/fs/ext3/iopen.c + } + + if (!goal) -+ return NULL; ++ goto do_instantiate; + + /* Move the goal to the de hash queue - like d_move() */ + goal->d_flags &= ~DCACHE_NFSD_DISCONNECTED; + list_del_init(&goal->d_hash); + + list_del(&goal->d_child); -+ list_del(&de->d_child); ++ list_del(&dentry->d_child); + + /* Switch the parents and the names.. */ -+ switch_names(goal, de); -+ do_switch(goal->d_parent, de->d_parent); -+ do_switch(goal->d_name.len, de->d_name.len); -+ do_switch(goal->d_name.hash, de->d_name.hash); ++ switch_names(goal, dentry); ++ do_switch(goal->d_parent, dentry->d_parent); ++ do_switch(goal->d_name.len, dentry->d_name.len); ++ do_switch(goal->d_name.hash, dentry->d_name.hash); + + /* And add them back to the (new) parent lists */ + list_add(&goal->d_child, &goal->d_parent->d_subdirs); -+ list_add(&de->d_child, &de->d_parent->d_subdirs); ++ list_add(&dentry->d_child, &dentry->d_parent->d_subdirs); + __d_rehash(goal, 0); ++ spin_unlock(&dcache_lock); ++ iput(inode); + + return goal; ++ ++ /* d_add(), but don't drop dcache_lock before adding dentry to inode */ ++do_instantiate: ++ list_add(&dentry->d_alias, &inode->i_dentry); /* d_instantiate */ ++ dentry->d_inode = inode; ++do_rehash: ++ if (rehash) ++ __d_rehash(dentry, 0); /* d_rehash */ ++ spin_unlock(&dcache_lock); ++ ++ return NULL; +} + +/* @@ -366,12 +390,7 @@ Index: linux-2.4.19/fs/ext3/namei.c /* * define how far ahead to read directories while searching them. -@@ -928,10 +928,14 @@ - struct inode * inode; - struct ext3_dir_entry_2 * de; - struct buffer_head * bh; -+ struct dentry *alternate = NULL; - +@@ -926,6 +927,9 @@ if (dentry->d_name.len > EXT3_NAME_LEN) return ERR_PTR(-ENAMETOOLONG); @@ -381,36 +400,62 @@ Index: linux-2.4.19/fs/ext3/namei.c bh = ext3_find_entry(dentry, &de); inode = NULL; if (bh) { -@@ -943,7 +947,28 @@ +@@ -943,8 +948,8 @@ return ERR_PTR(-EACCES); } } - d_add(dentry, inode); +- return NULL; + -+ /* verify this dentry is really new */ -+ assert(!dentry->d_inode); -+ assert(list_empty(&dentry->d_alias)); /* d_instantiate */ -+ assert(list_empty(&dentry->d_hash)); /* d_rehash */ -+ assert(list_empty(&dentry->d_subdirs)); -+ -+ spin_lock(&dcache_lock); -+ if (inode && (alternate = iopen_connect_dentry(dentry, inode))) { -+ spin_unlock(&dcache_lock); -+ iput(inode); -+ return alternate; ++ return iopen_connect_dentry(dentry, inode, 1); + } + + #define S_SHIFT 12 +@@ -1932,10 +1935,6 @@ + inode->i_nlink); + inode->i_version = ++event; + inode->i_nlink = 0; +- /* There's no need to set i_disksize: the fact that i_nlink is +- * zero will ensure that the right thing happens during any +- * recovery. */ +- inode->i_size = 0; + ext3_orphan_add(handle, inode); + dir->i_nlink--; + inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; +@@ -2086,6 +2085,23 @@ + return err; + } + ++/* Like ext3_add_nondir() except for call to iopen_connect_dentry */ ++static int ext3_add_link(handle_t *handle, struct dentry *dentry, ++ struct inode *inode) ++{ ++ int err = ext3_add_entry(handle, dentry, inode); ++ if (!err) { ++ err = ext3_mark_inode_dirty(handle, inode); ++ if (err == 0) { ++ dput(iopen_connect_dentry(dentry, inode, 0)); ++ return 0; ++ } + } ++ ext3_dec_count(handle, inode); ++ iput(inode); ++ return err; ++} + -+ /* d_add(), but don't drop dcache_lock before adding dentry to inode */ -+ if (inode) /* d_instantiate */ -+ list_add(&dentry->d_alias, &inode->i_dentry); -+ dentry->d_inode = inode; -+ -+ __d_rehash(dentry, 0); /* d_rehash */ -+ spin_unlock(&dcache_lock); -+ - return NULL; - } + static int ext3_link (struct dentry * old_dentry, + struct inode * dir, struct dentry *dentry) + { +@@ -2113,7 +2129,8 @@ + ext3_inc_count(handle, inode); + atomic_inc(&inode->i_count); +- err = ext3_add_nondir(handle, dentry, inode); ++ err = ext3_add_link(handle, dentry, inode); ++ ext3_orphan_del(handle, inode); + ext3_journal_stop(handle, dir); + return err; + } Index: linux-2.4.19/fs/ext3/super.c =================================================================== --- linux-2.4.19.orig/fs/ext3/super.c 2004-04-23 22:37:42.000000000 -0400