teach logfc() to handle prefices, give it saner calling conventions
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
@@ -388,64 +388,33 @@ EXPORT_SYMBOL(vfs_dup_fs_context);
|
|||||||
* @fc: The filesystem context to log to.
|
* @fc: The filesystem context to log to.
|
||||||
* @fmt: The format of the buffer.
|
* @fmt: The format of the buffer.
|
||||||
*/
|
*/
|
||||||
void logfc(struct fs_context *fc, const char *fmt, ...)
|
void logfc(struct fc_log *log, const char *prefix, char level, const char *fmt, ...)
|
||||||
{
|
{
|
||||||
static const char store_failure[] = "OOM: Can't store error string";
|
|
||||||
struct fc_log *log = fc ? fc->log : NULL;
|
|
||||||
const char *p;
|
|
||||||
va_list va;
|
va_list va;
|
||||||
char *q;
|
struct va_format vaf = {.fmt = fmt, .va = &va};
|
||||||
u8 freeable;
|
|
||||||
|
|
||||||
va_start(va, fmt);
|
va_start(va, fmt);
|
||||||
if (!strchr(fmt, '%')) {
|
|
||||||
p = fmt;
|
|
||||||
goto unformatted_string;
|
|
||||||
}
|
|
||||||
if (strcmp(fmt, "%s") == 0) {
|
|
||||||
p = va_arg(va, const char *);
|
|
||||||
goto unformatted_string;
|
|
||||||
}
|
|
||||||
|
|
||||||
q = kvasprintf(GFP_KERNEL, fmt, va);
|
|
||||||
copied_string:
|
|
||||||
if (!q)
|
|
||||||
goto store_failure;
|
|
||||||
freeable = 1;
|
|
||||||
goto store_string;
|
|
||||||
|
|
||||||
unformatted_string:
|
|
||||||
if ((unsigned long)p >= (unsigned long)__start_rodata &&
|
|
||||||
(unsigned long)p < (unsigned long)__end_rodata)
|
|
||||||
goto const_string;
|
|
||||||
if (log && within_module_core((unsigned long)p, log->owner))
|
|
||||||
goto const_string;
|
|
||||||
q = kstrdup(p, GFP_KERNEL);
|
|
||||||
goto copied_string;
|
|
||||||
|
|
||||||
store_failure:
|
|
||||||
p = store_failure;
|
|
||||||
const_string:
|
|
||||||
q = (char *)p;
|
|
||||||
freeable = 0;
|
|
||||||
store_string:
|
|
||||||
if (!log) {
|
if (!log) {
|
||||||
switch (fmt[0]) {
|
switch (level) {
|
||||||
case 'w':
|
case 'w':
|
||||||
printk(KERN_WARNING "%s\n", q + 2);
|
printk(KERN_WARNING "%s%s%pV\n", prefix ? prefix : "",
|
||||||
|
prefix ? ": " : "", &vaf);
|
||||||
break;
|
break;
|
||||||
case 'e':
|
case 'e':
|
||||||
printk(KERN_ERR "%s\n", q + 2);
|
printk(KERN_ERR "%s%s%pV\n", prefix ? prefix : "",
|
||||||
|
prefix ? ": " : "", &vaf);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printk(KERN_NOTICE "%s\n", q + 2);
|
printk(KERN_NOTICE "%s%s%pV\n", prefix ? prefix : "",
|
||||||
|
prefix ? ": " : "", &vaf);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (freeable)
|
|
||||||
kfree(q);
|
|
||||||
} else {
|
} else {
|
||||||
unsigned int logsize = ARRAY_SIZE(log->buffer);
|
unsigned int logsize = ARRAY_SIZE(log->buffer);
|
||||||
u8 index;
|
u8 index;
|
||||||
|
char *q = kasprintf(GFP_KERNEL, "%c %s%s%pV\n", level,
|
||||||
|
prefix ? prefix : "",
|
||||||
|
prefix ? ": " : "", &vaf);
|
||||||
|
|
||||||
index = log->head & (logsize - 1);
|
index = log->head & (logsize - 1);
|
||||||
BUILD_BUG_ON(sizeof(log->head) != sizeof(u8) ||
|
BUILD_BUG_ON(sizeof(log->head) != sizeof(u8) ||
|
||||||
@@ -457,9 +426,11 @@ store_string:
|
|||||||
log->tail++;
|
log->tail++;
|
||||||
}
|
}
|
||||||
|
|
||||||
log->buffer[index] = q;
|
log->buffer[index] = q ? q : "OOM: Can't store error string";
|
||||||
log->need_free &= ~(1 << index);
|
if (q)
|
||||||
log->need_free |= freeable << index;
|
log->need_free |= 1 << index;
|
||||||
|
else
|
||||||
|
log->need_free &= ~(1 << index);
|
||||||
log->head++;
|
log->head++;
|
||||||
}
|
}
|
||||||
va_end(va);
|
va_end(va);
|
||||||
|
@@ -181,9 +181,13 @@ struct fc_log {
|
|||||||
char *buffer[8];
|
char *buffer[8];
|
||||||
};
|
};
|
||||||
|
|
||||||
extern __attribute__((format(printf, 2, 3)))
|
extern __attribute__((format(printf, 4, 5)))
|
||||||
void logfc(struct fs_context *fc, const char *fmt, ...);
|
void logfc(struct fc_log *log, const char *prefix, char level, const char *fmt, ...);
|
||||||
|
|
||||||
|
#define __logfc(fc, l, fmt, ...) ({ \
|
||||||
|
struct fs_context *__fc = (fc); \
|
||||||
|
logfc(__fc ? __fc->log : NULL, NULL, \
|
||||||
|
l, fmt, ## __VA_ARGS__);})
|
||||||
/**
|
/**
|
||||||
* infof - Store supplementary informational message
|
* infof - Store supplementary informational message
|
||||||
* @fc: The context in which to log the informational message
|
* @fc: The context in which to log the informational message
|
||||||
@@ -192,7 +196,7 @@ void logfc(struct fs_context *fc, const char *fmt, ...);
|
|||||||
* Store the supplementary informational message for the process if the process
|
* Store the supplementary informational message for the process if the process
|
||||||
* has enabled the facility.
|
* has enabled the facility.
|
||||||
*/
|
*/
|
||||||
#define infof(fc, fmt, ...) ({ logfc(fc, "i "fmt, ## __VA_ARGS__); })
|
#define infof(fc, fmt, ...) __logfc(fc, 'i', fmt, ## __VA_ARGS__)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* warnf - Store supplementary warning message
|
* warnf - Store supplementary warning message
|
||||||
@@ -202,7 +206,7 @@ void logfc(struct fs_context *fc, const char *fmt, ...);
|
|||||||
* Store the supplementary warning message for the process if the process has
|
* Store the supplementary warning message for the process if the process has
|
||||||
* enabled the facility.
|
* enabled the facility.
|
||||||
*/
|
*/
|
||||||
#define warnf(fc, fmt, ...) ({ logfc(fc, "w "fmt, ## __VA_ARGS__); })
|
#define warnf(fc, fmt, ...) __logfc(fc, 'w', fmt, ## __VA_ARGS__)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* errorf - Store supplementary error message
|
* errorf - Store supplementary error message
|
||||||
@@ -212,7 +216,7 @@ void logfc(struct fs_context *fc, const char *fmt, ...);
|
|||||||
* Store the supplementary error message for the process if the process has
|
* Store the supplementary error message for the process if the process has
|
||||||
* enabled the facility.
|
* enabled the facility.
|
||||||
*/
|
*/
|
||||||
#define errorf(fc, fmt, ...) ({ logfc(fc, "e "fmt, ## __VA_ARGS__); })
|
#define errorf(fc, fmt, ...) __logfc(fc, 'e', fmt, ## __VA_ARGS__)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* invalf - Store supplementary invalid argument error message
|
* invalf - Store supplementary invalid argument error message
|
||||||
@@ -222,6 +226,6 @@ void logfc(struct fs_context *fc, const char *fmt, ...);
|
|||||||
* Store the supplementary error message for the process if the process has
|
* Store the supplementary error message for the process if the process has
|
||||||
* enabled the facility and return -EINVAL.
|
* enabled the facility and return -EINVAL.
|
||||||
*/
|
*/
|
||||||
#define invalf(fc, fmt, ...) ({ errorf(fc, fmt, ## __VA_ARGS__); -EINVAL; })
|
#define invalf(fc, fmt, ...) (errorf(fc, fmt, ## __VA_ARGS__), -EINVAL)
|
||||||
|
|
||||||
#endif /* _LINUX_FS_CONTEXT_H */
|
#endif /* _LINUX_FS_CONTEXT_H */
|
||||||
|
Reference in New Issue
Block a user