From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sergei Antonov Subject: Re: [PATCH] hfsplus: fix cross-page bio requests Date: Sun, 7 Jun 2015 22:09:21 +0200 Message-ID: References: <1428656543-6790-1-git-send-email-saproj@gmail.com> <1428684500.2798.4.camel@slavad-ubuntu-14.04> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Cc: "linux-fsdevel@vger.kernel.org" , Anton Altaparmakov , Al Viro , Christoph Hellwig , Andrew Morton , Hin-Tak Leung , Sougata Santra To: Viacheslav Dubeyko Return-path: Received: from mail-oi0-f41.google.com ([209.85.218.41]:33484 "EHLO mail-oi0-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751042AbbFGUJW (ORCPT ); Sun, 7 Jun 2015 16:09:22 -0400 Received: by oiha141 with SMTP id a141so17747485oih.0 for ; Sun, 07 Jun 2015 13:09:21 -0700 (PDT) In-Reply-To: Sender: linux-fsdevel-owner@vger.kernel.org List-ID: On 7 June 2015 at 22:05, Sergei Antonov wrote: > On 10 April 2015 at 18:48, Viacheslav Dubeyko wrote: >> On Fri, 2015-04-10 at 11:02 +0200, Sergei Antonov wrote: >>> Function hfsplus_submit_bio() did not work when the passed buffer spanned >>> over more than one page. That was because bio_alloc() is passed 1 as a number >>> of vectors but more than one vector were added inside the 'while' loop. >>> It periodically caused a mount error when the volume header could not be read. >>> >>> This patch modifies the code so that only one vector is used. It works for >>> multiple pages too. Also adds a return code check after bio_alloc(). >> >> I think that it really makes sense to describe the issue's reproducing >> way. It will be really precious for understanding of symptoms and >> reasons of the issue. >> >> Could you add more detailed description? >> >> Then, I will have opportunity to test your patch. > > Well, the description says it all. To put it bluntly, when this line > from wrapper.c > sbi->s_vhdr_buf = kmalloc(hfsplus_min_io_size(sb), GFP_KERNEL); > assigns s_vhdr_buf a value satisfying condition (PAGE_SIZE - (value & > PAGE_SIZE) < 512) then this call (also from wrapper.c) returns an I'm sorry, the right condition is (PAGE_SIZE - (value & (PAGE_SIZE - 1)) < 512). > error: > error = hfsplus_submit_bio(sb, part_start + HFSPLUS_VOLHEAD_SECTOR, > sbi->s_vhdr_buf, (void **)&sbi->s_vhdr, > READ); > > To give a specific example, sbi->s_vhdr_buf equal to > 0xffff8804085acec0 spans two pages and hfsplus_submit_bio() can not > read into such a buffer, returns an error, mount operation fails.