From 8a40553125b00034ffc48505436c989a72be9cf2 Mon Sep 17 00:00:00 2001 From: Randy Dunlap Date: Thu, 25 Aug 2011 09:47:20 +1000 Subject: [PATCH] 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 --- drivers/base/node.c | 6 ++++-- include/linux/sysdev.h | 14 ++++++++++++++ include/linux/vmstat.h | 2 ++ 3 files changed, 20 insertions(+), 2 deletions(-) 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 */ -- 2.39.5