Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.11-rc8 115 lines 2.4 kB view raw
1/* 2 * Copyright(c) 2013-2015 Intel Corporation. All rights reserved. 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of version 2 of the GNU General Public License as 6 * published by the Free Software Foundation. 7 * 8 * This program is distributed in the hope that it will be useful, but 9 * WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 11 * General Public License for more details. 12 */ 13#include <linux/vmalloc.h> 14#include <linux/module.h> 15#include <linux/device.h> 16#include <linux/sizes.h> 17#include <linux/ndctl.h> 18#include <linux/slab.h> 19#include <linux/mm.h> 20#include <linux/nd.h> 21#include "label.h" 22#include "nd.h" 23 24static int nvdimm_probe(struct device *dev) 25{ 26 struct nvdimm_drvdata *ndd; 27 int rc; 28 29 rc = nvdimm_check_config_data(dev); 30 if (rc) { 31 /* not required for non-aliased nvdimm, ex. NVDIMM-N */ 32 if (rc == -ENOTTY) 33 rc = 0; 34 return rc; 35 } 36 37 ndd = kzalloc(sizeof(*ndd), GFP_KERNEL); 38 if (!ndd) 39 return -ENOMEM; 40 41 dev_set_drvdata(dev, ndd); 42 ndd->dpa.name = dev_name(dev); 43 ndd->ns_current = -1; 44 ndd->ns_next = -1; 45 ndd->dpa.start = 0; 46 ndd->dpa.end = -1; 47 ndd->dev = dev; 48 get_device(dev); 49 kref_init(&ndd->kref); 50 51 rc = nvdimm_init_nsarea(ndd); 52 if (rc) 53 goto err; 54 55 rc = nvdimm_init_config_data(ndd); 56 if (rc) 57 goto err; 58 59 dev_dbg(dev, "config data size: %d\n", ndd->nsarea.config_size); 60 61 nvdimm_bus_lock(dev); 62 ndd->ns_current = nd_label_validate(ndd); 63 ndd->ns_next = nd_label_next_nsindex(ndd->ns_current); 64 nd_label_copy(ndd, to_next_namespace_index(ndd), 65 to_current_namespace_index(ndd)); 66 rc = nd_label_reserve_dpa(ndd); 67 if (ndd->ns_current >= 0) 68 nvdimm_set_aliasing(dev); 69 nvdimm_bus_unlock(dev); 70 71 if (rc) 72 goto err; 73 74 return 0; 75 76 err: 77 put_ndd(ndd); 78 return rc; 79} 80 81static int nvdimm_remove(struct device *dev) 82{ 83 struct nvdimm_drvdata *ndd = dev_get_drvdata(dev); 84 85 if (!ndd) 86 return 0; 87 88 nvdimm_bus_lock(dev); 89 dev_set_drvdata(dev, NULL); 90 nvdimm_bus_unlock(dev); 91 put_ndd(ndd); 92 93 return 0; 94} 95 96static struct nd_device_driver nvdimm_driver = { 97 .probe = nvdimm_probe, 98 .remove = nvdimm_remove, 99 .drv = { 100 .name = "nvdimm", 101 }, 102 .type = ND_DRIVER_DIMM, 103}; 104 105int __init nvdimm_init(void) 106{ 107 return nd_driver_register(&nvdimm_driver); 108} 109 110void nvdimm_exit(void) 111{ 112 driver_unregister(&nvdimm_driver.drv); 113} 114 115MODULE_ALIAS_ND_DEVICE(ND_DEVICE_DIMM);