[Pkg-lustre-svn-commit] updated: [29e8c86] Fix an LBUG concerning open-unlinked directories
Patrick Winnertz
winnie at debian.org
Wed Apr 28 12:14:37 UTC 2010
The following commit has been merged in the master branch:
commit 29e8c86e883e730590b5ac7f867410f65f4f317f
Author: Patrick Winnertz <winnie at debian.org>
Date: Wed Apr 28 14:13:50 2010 +0200
Fix an LBUG concerning open-unlinked directories
Signed-off-by: Patrick Winnertz <winnie at debian.org>
diff --git a/debian/patches/00list b/debian/patches/00list
index 91f2174..c6ebb7c 100644
--- a/debian/patches/00list
+++ b/debian/patches/00list
@@ -26,3 +26,6 @@ no-strict-aliasing.dpatch
fix_bashisms_for_dash.dpatch
configure_error_on_unstable.dpatch
fix_dentry_conf_test.dpatch
+LBUG_open-unlinked_bug_22177-1.dpatch
+LBUG_open-unlinked_bug_22177-2.dpatch
+LBUG_open-unlinked_bug_22177-3.dpatch
diff --git a/debian/patches/LBUG_open-unlinked_bug_22177-1.dpatch b/debian/patches/LBUG_open-unlinked_bug_22177-1.dpatch
new file mode 100644
index 0000000..b5588b9
--- /dev/null
+++ b/debian/patches/LBUG_open-unlinked_bug_22177-1.dpatch
@@ -0,0 +1,132 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## LBUG_open-unlinked_bug_22177-1.dpatch by Patrick Winnertz <winnie at debian.org>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Patch from bugzilla #22177
+
+ at DPATCH@
+diff --git a/lustre/mds/mds_reint.c b/lustre/mds/mds_reint.c
+index 97dc613..3c53148 100644
+--- a/lustre/mds/mds_reint.c
++++ b/lustre/mds/mds_reint.c
+@@ -1755,31 +1755,37 @@ static int mds_orphan_add_link(struct mds_update_record *rec,
+ * for linking and return real mode back then -bzzz */
+ mode = inode->i_mode;
+ inode->i_mode = S_IFREG;
+- /* avoid vfs_link upon 0 nlink inode */
+- ++inode->i_nlink;
++ /* avoid vfs_link upon 0 nlink inode, inc by 2 instead of 1 because
++ * ext3_inc_count() can reset i_nlink for indexed directory */
++ inode->i_nlink += 2;
+ rc = ll_vfs_link(dentry, mds->mds_vfsmnt, pending_dir, pending_child,
+ mds->mds_vfsmnt);
+ if (rc)
+- CERROR("error linking orphan %s to PENDING: rc = %d\n",
++ CERROR("error linking orphan %s %s to PENDING: rc = %d\n",
++ S_ISDIR(mode) ? "dir" : S_ISREG(mode) ? "file" : "other",
+ rec->ur_name, rc);
+ else
+ mds_inode_set_orphan(inode);
+
+ /* return mode and correct i_nlink if inode is directory */
+ inode->i_mode = mode;
+- LASSERTF(inode->i_nlink == 2, "%s nlink == %d\n",
++ LASSERTF(rc || inode->i_nlink == 3, "%s nlink == %d\n",
+ S_ISDIR(mode) ? "dir" : S_ISREG(mode) ? "file" : "other",
+ inode->i_nlink);
++
+ if (S_ISDIR(mode)) {
+ pending_dir->i_nlink++;
+ if (pending_dir->i_sb->s_op->dirty_inode)
+ pending_dir->i_sb->s_op->dirty_inode(pending_dir);
+- } else {
+- --inode->i_nlink;
+- if (inode->i_sb->s_op->dirty_inode)
+- inode->i_sb->s_op->dirty_inode(inode);
+ }
+
++ inode->i_nlink -= 2;
++ if (inode->i_sb->s_op->dirty_inode)
++ inode->i_sb->s_op->dirty_inode(inode);
++
++ if (rc)
++ GOTO(out_dput, rc);
++
+ GOTO(out_dput, rc = 1);
+ out_dput:
+ l_dput(pending_child);
+@@ -2048,11 +2054,18 @@ static int mds_reint_unlink(struct mds_update_record *rec, int offset,
+ }
+
+ if (rc == 0 && child_inode->i_nlink == 0) {
+- if (mds_orphan_needed(obd, child_inode))
++ if (mds_orphan_needed(obd, child_inode)) {
+ rc = mds_orphan_add_link(rec, obd, dchild);
+-
+- if (rc == 1)
+- GOTO(cleanup, rc = 0);
++ if (rc == 1)
++ /* child inode was successfully linked
++ * to PENDING */
++ GOTO(cleanup, rc = 0);
++ else
++ /* we failed to move the file to PENDING,
++ * really unlink the file as if there were
++ * no more openers */
++ rc = 0;
++ }
+
+ if (!S_ISREG(child_inode->i_mode))
+ GOTO(cleanup, rc);
+@@ -2738,11 +2751,18 @@ no_unlink:
+ }
+
+ if (rc == 0 && new_inode != NULL && new_inode->i_nlink == 0) {
+- if (mds_orphan_needed(obd, new_inode))
++ if (mds_orphan_needed(obd, new_inode)) {
+ rc = mds_orphan_add_link(rec, obd, de_new);
+
+- if (rc == 1)
+- GOTO(cleanup, rc = 0);
++ if (rc == 1)
++ /* inode successfully linked to PENDING */
++ GOTO(cleanup, rc = 0);
++ else
++ /* we failed to move the file to PENDING,
++ * really unlink the file as if there were
++ * no more openers */
++ rc = 0;
++ }
+
+ if (!S_ISREG(new_inode->i_mode))
+ GOTO(cleanup, rc);
+diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh
+index 4241a6b..7cefe84 100644
+--- a/lustre/tests/sanity.sh
++++ b/lustre/tests/sanity.sh
+@@ -6458,6 +6458,25 @@ test_202() {
+ }
+ run_test 202 "O_APPEND+O_DIRECT multistripe write ========================"
+
++test_203() { # bug 22177
++ mkdir -p $DIR/$tdir || error "creating dir $DIR/$tdir"
++ # create enough files to index the directory
++ createmany -o $DIR/$tdir/foobar 4000
++ # print attributes for debug purpose
++ lsattr -d .
++ # open dir
++ multiop_bg_pause $DIR/$tdir D_Sc || return 1
++ MULTIPID=$!
++ # remove the files & current working dir
++ unlinkmany $DIR/$tdir/foobar 4000
++ rmdir $DIR/$tdir
++ kill -USR1 $MULTIPID
++ wait $MULTIPID
++ stat $DIR/$tdir && error "open-unlinked dir was not removed!"
++ return 0
++}
++run_test 203 "Test open-unlinked dir ========================"
++
+ #
+ # tests that do cleanup/setup should be run at the end
+ #
diff --git a/debian/patches/LBUG_open-unlinked_bug_22177-2.dpatch b/debian/patches/LBUG_open-unlinked_bug_22177-2.dpatch
new file mode 100644
index 0000000..bec6f50
--- /dev/null
+++ b/debian/patches/LBUG_open-unlinked_bug_22177-2.dpatch
@@ -0,0 +1,20 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## LBUG_open-unlinked_bug_22177.dpatch by Patrick Winnertz <winnie at debian.org>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Patch from Bugzilla #22177, should be fixed in 1.8.3
+
+ at DPATCH@
+diff --git a/lustre/mds/mds_open.c b/lustre/mds/mds_open.c
+index 4feb1d8..31e1768 100644
+--- a/lustre/mds/mds_open.c
++++ b/lustre/mds/mds_open.c
+@@ -1496,7 +1496,7 @@ int mds_mfd_close(struct ptlrpc_request *req, int offset,
+ CDEBUG(D_INODE, "destroying orphan object %s\n", fidname);
+
+ if ((S_ISREG(inode->i_mode) && inode->i_nlink != 1) ||
+- (S_ISDIR(inode->i_mode) && inode->i_nlink != 2))
++ (S_ISDIR(inode->i_mode) && inode->i_nlink > 2))
+ CERROR("found \"orphan\" %s %s with link count %d\n",
+ S_ISREG(inode->i_mode) ? "file" : "dir",
+ fidname, inode->i_nlink);
diff --git a/debian/patches/LBUG_open-unlinked_bug_22177-3.dpatch b/debian/patches/LBUG_open-unlinked_bug_22177-3.dpatch
new file mode 100644
index 0000000..c783a28
--- /dev/null
+++ b/debian/patches/LBUG_open-unlinked_bug_22177-3.dpatch
@@ -0,0 +1,49 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## LBUG_open-unlinked_bug_22177-3.dpatch by Patrick Winnertz <winnie at debian.org>
+##
+## All lines beginning with `## DP:' are a description of the patch.
+## DP: Patch from bugzilla #22177, should be fixed in 1.8.3
+
+ at DPATCH@
+diff --git a/lustre/mds/mds_reint.c b/lustre/mds/mds_reint.c
+index 97dc613..4de6d2d 100644
+--- a/lustre/mds/mds_reint.c
++++ b/lustre/mds/mds_reint.c
+@@ -1755,8 +1755,9 @@ static int mds_orphan_add_link(struct mds_update_record *rec,
+ * for linking and return real mode back then -bzzz */
+ mode = inode->i_mode;
+ inode->i_mode = S_IFREG;
+- /* avoid vfs_link upon 0 nlink inode */
+- ++inode->i_nlink;
++ /* avoid vfs_link upon 0 nlink inode, inc by 2 instead of 1 because
++ * ext3_inc_count() can reset i_nlink for indexed directory */
++ inode->i_nlink += 2;
+ rc = ll_vfs_link(dentry, mds->mds_vfsmnt, pending_dir, pending_child,
+ mds->mds_vfsmnt);
+ if (rc)
+@@ -1767,19 +1768,21 @@ static int mds_orphan_add_link(struct mds_update_record *rec,
+
+ /* return mode and correct i_nlink if inode is directory */
+ inode->i_mode = mode;
+- LASSERTF(inode->i_nlink == 2, "%s nlink == %d\n",
++ LASSERTF(inode->i_nlink == 3, "%s nlink == %d\n",
+ S_ISDIR(mode) ? "dir" : S_ISREG(mode) ? "file" : "other",
+ inode->i_nlink);
+ if (S_ISDIR(mode)) {
+ pending_dir->i_nlink++;
+ if (pending_dir->i_sb->s_op->dirty_inode)
+ pending_dir->i_sb->s_op->dirty_inode(pending_dir);
++ inode->i_nlink -= 1;
+ } else {
+- --inode->i_nlink;
+- if (inode->i_sb->s_op->dirty_inode)
+- inode->i_sb->s_op->dirty_inode(inode);
++ inode->i_nlink -= 2;
+ }
+
++ if (inode->i_sb->s_op->dirty_inode)
++ inode->i_sb->s_op->dirty_inode(inode);
++
+ GOTO(out_dput, rc = 1);
+ out_dput:
+ l_dput(pending_child);
--
Lustre Debian Packaging
More information about the Pkg-lustre-svn-commit
mailing list