From 2f9149b75e4714e2accb7d2af9d5402353af8217 Mon Sep 17 00:00:00 2001 From: Dmitry Monakhov Date: Mon, 1 Mar 2010 23:29:39 -0500 Subject: [PATCH] --- yaml --- r: 185871 b: refs/heads/master c: 6e3617e579e070d3655a93ee9ed7149113e795e0 h: refs/heads/master i: 185869: a6ec65999553ddaebe960cc2cf9f2a50627b8595 185867: abe81015799d3ad4d013073152694219d5c6e5fc 185863: f8692266722d1510638da04aec3d59b2c19ff1e0 185855: 38d116dc4bca1df2f2ee579bb69ecd2c6a1b3f36 v: v3 --- [refs] | 2 +- trunk/fs/ext4/namei.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 65b7ff1d70bd..6c028bdce4ac 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: da1dafca84413145f5ac59998b4cdd06fb89f721 +refs/heads/master: 6e3617e579e070d3655a93ee9ed7149113e795e0 diff --git a/trunk/fs/ext4/namei.c b/trunk/fs/ext4/namei.c index a13948f8242f..608d21f873ec 100644 --- a/trunk/fs/ext4/namei.c +++ b/trunk/fs/ext4/namei.c @@ -2013,6 +2013,13 @@ int ext4_orphan_add(handle_t *handle, struct inode *inode) err = ext4_reserve_inode_write(handle, inode, &iloc); if (err) goto out_unlock; + /* + * Due to previous errors inode may be already a part of on-disk + * orphan list. If so skip on-disk list modification. + */ + if (NEXT_ORPHAN(inode) && NEXT_ORPHAN(inode) <= + (le32_to_cpu(EXT4_SB(sb)->s_es->s_inodes_count))) + goto mem_insert; /* Insert this inode at the head of the on-disk orphan list... */ NEXT_ORPHAN(inode) = le32_to_cpu(EXT4_SB(sb)->s_es->s_last_orphan); @@ -2030,6 +2037,7 @@ int ext4_orphan_add(handle_t *handle, struct inode *inode) * * This is safe: on error we're going to ignore the orphan list * anyway on the next recovery. */ +mem_insert: if (!err) list_add(&EXT4_I(inode)->i_orphan, &EXT4_SB(sb)->s_orphan);