Hi Frank, [auto build test ERROR on robh/for-next] [also build test ERROR on v4.11-rc8 next-20170428] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/frowand-list-gmail-com/of-remove-phandle-properties-from-expanded-device-tree/20170426-000149 base: https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next config: s390-allmodconfig (attached as .config) compiler: s390x-linux-gnu-gcc (Debian 6.1.1-9) 6.1.1 20160705 reproduce: wget https://raw.githubusercontent.com/01org/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=s390 All errors (new ones prefixed by >>): In file included from include/linux/kobject.h:21:0, from include/linux/device.h:17, from include/linux/node.h:17, from include/linux/cpu.h:16, from drivers/of/base.c:25: drivers/of/base.c: In function '__of_add_phandle_sysfs': >> drivers/of/base.c:198:23: error: 'pp' undeclared (first use in this function) sysfs_bin_attr_init(&pp->attr); ^ include/linux/sysfs.h:54:3: note: in definition of macro 'sysfs_attr_init' (attr)->key = &__key; \ ^~~~ drivers/of/base.c:198:2: note: in expansion of macro 'sysfs_bin_attr_init' sysfs_bin_attr_init(&pp->attr); ^~~~~~~~~~~~~~~~~~~ drivers/of/base.c:198:23: note: each undeclared identifier is reported only once for each function it appears in sysfs_bin_attr_init(&pp->attr); ^ include/linux/sysfs.h:54:3: note: in definition of macro 'sysfs_attr_init' (attr)->key = &__key; \ ^~~~ drivers/of/base.c:198:2: note: in expansion of macro 'sysfs_bin_attr_init' sysfs_bin_attr_init(&pp->attr); ^~~~~~~~~~~~~~~~~~~ vim +/pp +198 drivers/of/base.c 19 */ 20 21 #define pr_fmt(fmt) "OF: " fmt 22 23 #include 24 #include > 25 #include 26 #include 27 #include 28 #include 29 #include 30 #include 31 #include 32 #include 33 #include 34 35 #include "of_private.h" 36 37 LIST_HEAD(aliases_lookup); 38 39 struct device_node *of_root; 40 EXPORT_SYMBOL(of_root); 41 struct device_node *of_chosen; 42 struct device_node *of_aliases; 43 struct device_node *of_stdout; 44 static const char *of_stdout_options; 45 46 struct kset *of_kset; 47 48 /* 49 * Used to protect the of_aliases, to hold off addition of nodes to sysfs. 50 * This mutex must be held whenever modifications are being made to the 51 * device tree. The of_{attach,detach}_node() and 52 * of_{add,remove,update}_property() helpers make sure this happens. 53 */ 54 DEFINE_MUTEX(of_mutex); 55 56 /* use when traversing tree through the child, sibling, 57 * or parent members of struct device_node. 58 */ 59 DEFINE_RAW_SPINLOCK(devtree_lock); 60 61 int of_n_addr_cells(struct device_node *np) 62 { 63 const __be32 *ip; 64 65 do { 66 if (np->parent) 67 np = np->parent; 68 ip = of_get_property(np, "#address-cells", NULL); 69 if (ip) 70 return be32_to_cpup(ip); 71 } while (np->parent); 72 /* No #address-cells property for the root node */ 73 return OF_ROOT_NODE_ADDR_CELLS_DEFAULT; 74 } 75 EXPORT_SYMBOL(of_n_addr_cells); 76 77 int of_n_size_cells(struct device_node *np) 78 { 79 const __be32 *ip; 80 81 do { 82 if (np->parent) 83 np = np->parent; 84 ip = of_get_property(np, "#size-cells", NULL); 85 if (ip) 86 return be32_to_cpup(ip); 87 } while (np->parent); 88 /* No #size-cells property for the root node */ 89 return OF_ROOT_NODE_SIZE_CELLS_DEFAULT; 90 } 91 EXPORT_SYMBOL(of_n_size_cells); 92 93 #ifdef CONFIG_NUMA 94 int __weak of_node_to_nid(struct device_node *np) 95 { 96 return NUMA_NO_NODE; 97 } 98 #endif 99 100 #ifndef CONFIG_OF_DYNAMIC 101 static void of_node_release(struct kobject *kobj) 102 { 103 /* Without CONFIG_OF_DYNAMIC, no nodes gets freed */ 104 } 105 #endif /* CONFIG_OF_DYNAMIC */ 106 107 struct kobj_type of_node_ktype = { 108 .release = of_node_release, 109 }; 110 111 static ssize_t of_node_property_read(struct file *filp, struct kobject *kobj, 112 struct bin_attribute *bin_attr, char *buf, 113 loff_t offset, size_t count) 114 { 115 struct property *pp = container_of(bin_attr, struct property, attr); 116 return memory_read_from_buffer(buf, count, &offset, pp->value, pp->length); 117 } 118 119 static ssize_t of_node_phandle_read(struct file *filp, struct kobject *kobj, 120 struct bin_attribute *bin_attr, char *buf, 121 loff_t offset, size_t count) 122 { 123 phandle phandle; 124 struct device_node *np; 125 126 np = container_of(bin_attr, struct device_node, attr_phandle); 127 phandle = cpu_to_be32(np->phandle); 128 return memory_read_from_buffer(buf, count, &offset, &phandle, 129 sizeof(phandle)); 130 } 131 132 /* always return newly allocated name, caller must free after use */ 133 static const char *safe_name(struct kobject *kobj, const char *orig_name) 134 { 135 const char *name = orig_name; 136 struct kernfs_node *kn; 137 int i = 0; 138 139 /* don't be a hero. After 16 tries give up */ 140 while (i < 16 && (kn = sysfs_get_dirent(kobj->sd, name))) { 141 sysfs_put(kn); 142 if (name != orig_name) 143 kfree(name); 144 name = kasprintf(GFP_KERNEL, "%s#%i", orig_name, ++i); 145 } 146 147 if (name == orig_name) { 148 name = kstrdup(orig_name, GFP_KERNEL); 149 } else { 150 pr_warn("Duplicate name in %s, renamed to \"%s\"\n", 151 kobject_name(kobj), name); 152 } 153 return name; 154 } 155 156 int __of_add_property_sysfs(struct device_node *np, struct property *pp) 157 { 158 int rc; 159 160 /* Important: Don't leak passwords */ 161 bool secure = strncmp(pp->name, "security-", 9) == 0; 162 163 if (!IS_ENABLED(CONFIG_SYSFS)) 164 return 0; 165 166 if (!of_kset || !of_node_is_attached(np)) 167 return 0; 168 169 sysfs_bin_attr_init(&pp->attr); 170 pp->attr.attr.name = safe_name(&np->kobj, pp->name); 171 pp->attr.attr.mode = secure ? S_IRUSR : S_IRUGO; 172 pp->attr.size = secure ? 0 : pp->length; 173 pp->attr.read = of_node_property_read; 174 175 rc = sysfs_create_bin_file(&np->kobj, &pp->attr); 176 WARN(rc, "error adding attribute %s to node %s\n", pp->name, np->full_name); 177 return rc; 178 } 179 180 /* 181 * In the imported device tree (fdt), phandle is a property. In the 182 * internal data structure it is instead stored in the struct device_node. 183 * Make phandle visible in sysfs as if it was a property. 184 */ 185 int __of_add_phandle_sysfs(struct device_node *np) 186 { 187 int rc; 188 189 if (!IS_ENABLED(CONFIG_SYSFS)) 190 return 0; 191 192 if (!of_kset || !of_node_is_attached(np)) 193 return 0; 194 195 if (!np->phandle || np->phandle == 0xffffffff) 196 return 0; 197 > 198 sysfs_bin_attr_init(&pp->attr); 199 np->attr_phandle.attr.name = "phandle"; 200 np->attr_phandle.attr.mode = 0444; 201 np->attr_phandle.size = sizeof(np->phandle); --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation