From 5311b4d31a19d4f56b317262fcd59b585774dd30 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Thu, 25 Nov 2010 03:56:24 +0100 Subject: [PATCH] --- yaml --- r: 229154 b: refs/heads/master c: 4651c5900e7a3c84d4b70412f8bbc40c1bcb50cf h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/udf/namei.c | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index 14eb684b9c05..3e2b1fd99367 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 8754a3f718f08dc21b3c5eccd044f612d4bc1ab1 +refs/heads/master: 4651c5900e7a3c84d4b70412f8bbc40c1bcb50cf diff --git a/trunk/fs/udf/namei.c b/trunk/fs/udf/namei.c index 26815a25379d..a2974f7563a2 100644 --- a/trunk/fs/udf/namei.c +++ b/trunk/fs/udf/namei.c @@ -471,15 +471,19 @@ static struct fileIdentDesc *udf_add_entry(struct inode *dir, f_pos >> dir->i_sb->s_blocksize_bits, 1, err); if (!fibh->ebh) goto out_err; + /* Extents could have been merged, invalidate our position */ + brelse(epos.bh); + epos.bh = NULL; + epos.block = dinfo->i_location; + epos.offset = udf_file_entry_alloc_offset(dir); if (!fibh->soffset) { - if (udf_next_aext(dir, &epos, &eloc, &elen, 1) == - (EXT_RECORDED_ALLOCATED >> 30)) { - block = eloc.logicalBlockNum + ((elen - 1) >> + /* Find the freshly allocated block */ + while (udf_next_aext(dir, &epos, &eloc, &elen, 1) == + (EXT_RECORDED_ALLOCATED >> 30)) + ; + block = eloc.logicalBlockNum + ((elen - 1) >> dir->i_sb->s_blocksize_bits); - } else - block++; - brelse(fibh->sbh); fibh->sbh = fibh->ebh; fi = (struct fileIdentDesc *)(fibh->sbh->b_data);