Skip to content

Commit

Permalink
libnvdimm: don't fail init for full badblocks list
Browse files Browse the repository at this point in the history
If the badblocks list runs out of space it simply means that software is
unable to intercept all errors.  This is no different than the latent
discovery of new badblocks case and should not be an initialization
failure condition.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
  • Loading branch information
Dan Williams committed Jan 9, 2016
1 parent 16263ff commit 87ba05d
Showing 1 changed file with 16 additions and 11 deletions.
27 changes: 16 additions & 11 deletions drivers/nvdimm/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -360,6 +360,18 @@ struct nvdimm_bus *__nvdimm_bus_register(struct device *parent,
}
EXPORT_SYMBOL_GPL(__nvdimm_bus_register);

static void set_badblock(struct gendisk *disk, sector_t s, int num)
{
struct device *dev = disk->driverfs_dev;

dev_dbg(dev, "Found a poison range (0x%llx, 0x%llx)\n",
(u64) s * 512, (u64) num * 512);
/* this isn't an error as the hardware will still throw an exception */
if (disk_set_badblocks(disk, s, num))
dev_info_once(dev, "%s: failed for sector %llx\n",
__func__, (u64) s);
}

/**
* __add_badblock_range() - Convert a physical address range to bad sectors
* @disk: the disk associated with the namespace
Expand Down Expand Up @@ -396,15 +408,14 @@ static int __add_badblock_range(struct gendisk *disk, u64 ns_offset, u64 len)
while (remaining) {
int done = min_t(u64, remaining, INT_MAX);

rc = disk_set_badblocks(disk, s, done);
if (rc)
return rc;
set_badblock(disk, s, done);
remaining -= done;
s += done;
}
return 0;
} else
return disk_set_badblocks(disk, start_sector, num_sectors);
set_badblock(disk, start_sector, num_sectors);

return 0;
}

/**
Expand Down Expand Up @@ -463,9 +474,6 @@ int nvdimm_namespace_add_poison(struct gendisk *disk, resource_size_t offset,
rc = __add_badblock_range(disk, start - ns_start, len);
if (rc)
return rc;
dev_info(&nvdimm_bus->dev,
"Found a poison range (0x%llx, 0x%llx)\n",
start, len);
continue;
}
/* Deal with overlap for poison starting before the namespace */
Expand All @@ -480,9 +488,6 @@ int nvdimm_namespace_add_poison(struct gendisk *disk, resource_size_t offset,
rc = __add_badblock_range(disk, 0, len);
if (rc)
return rc;
dev_info(&nvdimm_bus->dev,
"Found a poison range (0x%llx, 0x%llx)\n",
pl->start, len);
}
}

Expand Down

0 comments on commit 87ba05d

Please sign in to comment.