Skip to content
  • Oliver O'Halloran's avatar
    libnvdimm: Fix altmap reservation size calculation · 07464e88
    Oliver O'Halloran authored
    Libnvdimm reserves the first 8K of pfn and devicedax namespaces to
    store a superblock describing the namespace. This 8K reservation
    is contained within the altmap area which the kernel uses for the
    vmemmap backing for the pages within the namespace. The altmap
    allows for some pages at the start of the altmap area to be reserved
    and that mechanism is used to protect the superblock from being
    re-used as vmemmap backing.
    
    The number of PFNs to reserve is calculated using:
    
    	PHYS_PFN(SZ_8K)
    
    Which is implemented as:
    
     #define PHYS_PFN(x) ((unsigned long)((x) >> PAGE_SHIFT))
    
    So on systems where PAGE_SIZE is greater than 8K the reservation
    size is truncated to zero and the superblock area is re-used as
    vmemmap backing. As a result all the namespace information stored
    in the superblock (i.e. if it's a PFN or DAX namespace) is lost
    and the namespace needs to be re-created to get access to the
    contents.
    
    This patch fixes this by using PFN_UP() rather than PHYS_PFN() to ensure
    that at least one page is reserved. On systems with a 4K pages size this
    patch should have no effect.
    
    Cc: stable@vger.kernel.org
    Cc: Dan Williams <dan.j.williams@intel.com>
    Fixes: ac515c08
    
     ("libnvdimm, pmem, pfn: move pfn setup to the core")
    Signed-off-by: default avatarOliver O'Halloran <oohall@gmail.com>
    Reviewed-by: default avatarVishal Verma <vishal.l.verma@intel.com>
    Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
    07464e88