From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753640AbcAVOxj (ORCPT ); Fri, 22 Jan 2016 09:53:39 -0500 Received: from mx2.suse.de ([195.135.220.15]:60567 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753260AbcAVOxg (ORCPT ); Fri, 22 Jan 2016 09:53:36 -0500 Date: Fri, 22 Jan 2016 15:53:45 +0100 From: Jan Kara To: Ross Zwisler Cc: linux-kernel@vger.kernel.org, Alexander Viro , Andrew Morton , Dan Williams , Dave Chinner , Jan Kara , Matthew Wilcox , linux-fsdevel@vger.kernel.org, linux-nvdimm@ml01.01.org Subject: Re: [PATCH v2 1/5] dax: never rely on bh.b_dev being set by get_block() Message-ID: <20160122145345.GJ16898@quack.suse.cz> References: <1453398364-22537-1-git-send-email-ross.zwisler@linux.intel.com> <1453398364-22537-2-git-send-email-ross.zwisler@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1453398364-22537-2-git-send-email-ross.zwisler@linux.intel.com> User-Agent: Mutt/1.5.24 (2015-08-30) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu 21-01-16 10:46:00, Ross Zwisler wrote: > Previously in DAX we assumed that calls to get_block() would set bh.b_bdev, > and we would then use that value even in error cases for debugging. This > caused a NULL pointer dereference in __dax_dbg() which was fixed by a > previous commit, but that commit only changed the one place where we were > hitting an error. > > Instead, update dax.c so that we always initialize bh.b_bdev as best we can > based on the information that DAX has. get_block() may or may not update > to a new value, but this at least lets us get something helpful from > bh.b_bdev for error messages and not have to worry about whether it was set > by get_block() or not. > > Signed-off-by: Ross Zwisler > Reported-by: Jan Kara Looks good. You can add: Reviewed-by: Jan Kara Honza > --- > fs/dax.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/fs/dax.c b/fs/dax.c > index 0db21ea..cee9e1b 100644 > --- a/fs/dax.c > +++ b/fs/dax.c > @@ -246,6 +246,7 @@ ssize_t dax_do_io(struct kiocb *iocb, struct inode *inode, > loff_t end = pos + iov_iter_count(iter); > > memset(&bh, 0, sizeof(bh)); > + bh.b_bdev = inode->i_sb->s_bdev; > > if ((flags & DIO_LOCKING) && iov_iter_rw(iter) == READ) { > struct address_space *mapping = inode->i_mapping; > @@ -582,6 +583,7 @@ int __dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf, > > memset(&bh, 0, sizeof(bh)); > block = (sector_t)vmf->pgoff << (PAGE_SHIFT - blkbits); > + bh.b_bdev = inode->i_sb->s_bdev; > bh.b_size = PAGE_SIZE; > > repeat: > @@ -1018,6 +1020,7 @@ int dax_zero_page_range(struct inode *inode, loff_t from, unsigned length, > BUG_ON((offset + length) > PAGE_CACHE_SIZE); > > memset(&bh, 0, sizeof(bh)); > + bh.b_bdev = inode->i_sb->s_bdev; > bh.b_size = PAGE_CACHE_SIZE; > err = get_block(inode, index, &bh, 0); > if (err < 0) > -- > 2.5.0 > > -- Jan Kara SUSE Labs, CR