From mboxrd@z Thu Jan 1 00:00:00 1970 From: tristan Date: Fri, 26 Mar 2010 09:32:08 +0800 Subject: [Ocfs2-devel] [PATCH 1/1] Ocfs2: __ocfs2_find_path() needs to treat hole correctly. In-Reply-To: <4BAC0D51.90807@oracle.com> References: <1269506159-30981-1-git-send-email-tristan.ye@oracle.com> <4BABF398.4040706@oracle.com> <4BAC0D12.6070603@oracle.com> <4BAC0D51.90807@oracle.com> Message-ID: <4BAC0E98.2060906@oracle.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: ocfs2-devel@oss.oracle.com Tao Ma wrote: > > > tristan wrote: >> Tao Ma wrote: >>> Tristan Ye wrote: >>>> Currently, __ocfs2_find_path() was lack of a mechanism to detect >>>> a hole between two extent blocks if the cpos we want to search is >>>> within the hole, as a result, the last rec will be returned >>>> incorrectly. >>>> >>> Do you mean extent block or extent rec? The extent block are >>> contiguous and there should be no hole. >>> oh, here. We should never meet with this. So Nack. >> >> I meant the extent records in none-leaf extent blocks, may the hole >> exist between these recs? > no, there is no holes except the leaf extent rec. Gotcha, Thanks for teaching;) I thought there may be a bug along with my punching hole patch, seems that is fine... > > Regards, > Tao >> >> >> Tristan. >> >> >>> >>> Regards, >>> Tao >>>> This patch attempts to detect a hole, and return the rightmost >>>> extent block preceding the hole. >>>> >>>> Signed-off-by: Tristan Ye >>>> --- >>>> fs/ocfs2/alloc.c | 11 +++++++++++ >>>> 1 files changed, 11 insertions(+), 0 deletions(-) >>>> >>>> diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c >>>> index 9f8bd91..2638a18 100644 >>>> --- a/fs/ocfs2/alloc.c >>>> +++ b/fs/ocfs2/alloc.c >>>> @@ -1841,6 +1841,17 @@ static int __ocfs2_find_path(struct >>>> ocfs2_caching_info *ci, >>>> ocfs2_rec_clusters(el, rec); >>>> if (cpos >= le32_to_cpu(rec->e_cpos) && cpos < range) >>>> break; >>>> + >>>> + /* >>>> + * Return the rightmost extent block leftly adjacent >>>> + * to a hole if there is any between two extent blocks. >>>> + * >>>> + * Otherwise, we get the last rec of this block >>>> unexpectly. >>>> + */ >>>> + if (cpos < le32_to_cpu(rec->e_cpos)) { >>>> + i--; >>>> + break; >>>> + } >>>> } >>>> >>>> blkno = le64_to_cpu(el->l_recs[i].e_blkno); >>>> >>> >>