Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752510AbcLFBCN (ORCPT ); Mon, 5 Dec 2016 20:02:13 -0500 Received: from mail-pf0-f177.google.com ([209.85.192.177]:34587 "EHLO mail-pf0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752854AbcLFBCI (ORCPT ); Mon, 5 Dec 2016 20:02:08 -0500 Date: Mon, 5 Dec 2016 17:01:58 -0800 (PST) From: Hugh Dickins X-X-Sender: hugh@eggly.anvils To: Dan Williams cc: linux-nvdimm@ml01.01.org, linux-mm@kvack.org, Dave Hansen , linux-kernel@vger.kernel.org, stable@vger.kernel.org, Pawel Lebioda Subject: Re: [PATCH] device-dax: fail all private mapping attempts In-Reply-To: <147931721349.37471.4835899844582504197.stgit@dwillia2-desk3.amr.corp.intel.com> Message-ID: References: <147931721349.37471.4835899844582504197.stgit@dwillia2-desk3.amr.corp.intel.com> User-Agent: Alpine 2.11 (LSU 23 2013-08-11) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1710 Lines: 44 On Wed, 16 Nov 2016, Dan Williams wrote: > The device-dax implementation originally tried to be tricky and allow > private read-only mappings, but in the process allowed writable > MAP_PRIVATE + MAP_NORESERVE mappings. For simplicity and predictability > just fail all private mapping attempts since device-dax memory is > statically allocated and will never support overcommit. > > Cc: > Cc: Dave Hansen > Fixes: dee410792419 ("/dev/dax, core: file operations and dax-mmap") > Reported-by: Pawel Lebioda > Signed-off-by: Dan Williams > --- > drivers/dax/dax.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/dax/dax.c b/drivers/dax/dax.c > index 0e499bfca41c..3d94ff20fdca 100644 > --- a/drivers/dax/dax.c > +++ b/drivers/dax/dax.c > @@ -270,8 +270,8 @@ static int check_vma(struct dax_dev *dax_dev, struct vm_area_struct *vma, > if (!dax_dev->alive) > return -ENXIO; > > - /* prevent private / writable mappings from being established */ > - if ((vma->vm_flags & (VM_NORESERVE|VM_SHARED|VM_WRITE)) == VM_WRITE) { > + /* prevent private mappings from being established */ > + if ((vma->vm_flags & VM_SHARED) != VM_SHARED) { I think that is more restrictive than you intended: haven't tried, but I believe it rejects a PROT_READ, MAP_SHARED, O_RDONLY fd mmap, leaving no way to mmap /dev/dax without write permission to it. See line 1393 of mm/mmap.c: the test you want is probably if (!(vma->vm_flags & VM_MAYSHARE)) Hugh > dev_info(dev, "%s: %s: fail, attempted private mapping\n", > current->comm, func); > return -EINVAL; > > --