From: Randy Dunlap Date: Wed, 24 Aug 2011 23:47:20 +0000 (+1000) Subject: vmstat_text is only available when PROC_FS or SYSFS is enabled. This X-Git-Tag: next-20110913~1^2~54 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=09ab827e88082108f444590daa63e8962969efa5;p=karo-tx-linux.git vmstat_text is only available when PROC_FS or SYSFS is enabled. This causes build errors in drivers/base/node.c when they are both disabled: drivers/built-in.o: In function `node_read_vmstat': node.c:(.text+0x10e28f): undefined reference to `vmstat_text' Rather than litter drivers/base/node.c with #ifdef/#endif around the affected lines of code, add macros for optional sysdev attributes so that those lines of code will be ignored, without using #ifdef/#endif in the .c file(s). I.e., the ifdeffery is done only in a header file with sysdev_create_file_optional() and sysdev_remove_file_optional(). Signed-off-by: Randy Dunlap Cc: Amerigo Wang Cc: Greg KH Signed-off-by: Andrew Morton --- diff --git a/drivers/base/node.c b/drivers/base/node.c index 793f796c4da3..9e58e71911b3 100644 --- a/drivers/base/node.c +++ b/drivers/base/node.c @@ -176,6 +176,7 @@ static ssize_t node_read_numastat(struct sys_device * dev, } static SYSDEV_ATTR(numastat, S_IRUGO, node_read_numastat, NULL); +#if defined(CONFIG_PROC_FS) || defined(CONFIG_SYSFS) static ssize_t node_read_vmstat(struct sys_device *dev, struct sysdev_attribute *attr, char *buf) { @@ -190,6 +191,7 @@ static ssize_t node_read_vmstat(struct sys_device *dev, return n; } static SYSDEV_ATTR(vmstat, S_IRUGO, node_read_vmstat, NULL); +#endif static ssize_t node_read_distance(struct sys_device * dev, struct sysdev_attribute *attr, char * buf) @@ -274,7 +276,7 @@ int register_node(struct node *node, int num, struct node *parent) sysdev_create_file(&node->sysdev, &attr_meminfo); sysdev_create_file(&node->sysdev, &attr_numastat); sysdev_create_file(&node->sysdev, &attr_distance); - sysdev_create_file(&node->sysdev, &attr_vmstat); + sysdev_create_file_optional(&node->sysdev, &attr_vmstat); scan_unevictable_register_node(node); @@ -299,7 +301,7 @@ void unregister_node(struct node *node) sysdev_remove_file(&node->sysdev, &attr_meminfo); sysdev_remove_file(&node->sysdev, &attr_numastat); sysdev_remove_file(&node->sysdev, &attr_distance); - sysdev_remove_file(&node->sysdev, &attr_vmstat); + sysdev_remove_file_optional(&node->sysdev, &attr_vmstat); scan_unevictable_unregister_node(node); hugetlb_unregister_node(node); /* no-op, if memoryless node */ diff --git a/include/linux/sysdev.h b/include/linux/sysdev.h index 20f63d3e6144..6692a8e50eea 100644 --- a/include/linux/sysdev.h +++ b/include/linux/sysdev.h @@ -114,6 +114,20 @@ struct sysdev_attribute { extern int sysdev_create_file(struct sys_device *, struct sysdev_attribute *); extern void sysdev_remove_file(struct sys_device *, struct sysdev_attribute *); +#if defined(CONFIG_PROC_FS) || defined(CONFIG_SYSFS) +#define sysdev_create_file_optional(sysdev, sysdevattr) \ + return sysdev_create_file(sysdev, sysdevattr); + +#define sysdev_remove_file_optional(sysdev, sysdevattr) \ + sysdev_remove_file(sysdev, sysdevattr); +#else +#define sysdev_create_file_optional(sysdev, sysdevattr) \ + (0) + +#define sysdev_remove_file_optional(sysdev, sysdevattr) \ + do {} while (0) +#endif + /* Create/remove NULL terminated attribute list */ static inline int sysdev_create_files(struct sys_device *d, struct sysdev_attribute **a) diff --git a/include/linux/vmstat.h b/include/linux/vmstat.h index 65efb92da996..b3b17ac0ad65 100644 --- a/include/linux/vmstat.h +++ b/include/linux/vmstat.h @@ -258,6 +258,8 @@ static inline void refresh_zone_stat_thresholds(void) { } #endif /* CONFIG_SMP */ +#if defined(CONFIG_PROC_FS) || defined(CONFIG_SYSFS) extern const char * const vmstat_text[]; +#endif #endif /* _LINUX_VMSTAT_H */