new primitive: __fs_parse()

fs_parse() analogue taking p_log instead of fs_context.
fs_parse() turned into a wrapper, callers in ceph_common and rbd
switched to __fs_parse().

As the result, fs_parse() never gets NULL fs_context and neither
do fs_context-based logging primitives

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
index 596a118..47e82f0 100644
--- a/drivers/block/rbd.c
+++ b/drivers/block/rbd.c
@@ -6360,7 +6360,7 @@
 	if (ret != -ENOPARAM)
 		return ret;
 
-	token = fs_parse(NULL, &rbd_parameters, param, &result);
+	token = __fs_parse(&log, &rbd_parameters, param, &result);
 	dout("%s fs_parse '%s' token %d\n", __func__, param->key, token);
 	if (token < 0) {
 		if (token == -ENOPARAM)
diff --git a/fs/fs_parser.c b/fs/fs_parser.c
index dc5c673..dadb658 100644
--- a/fs/fs_parser.c
+++ b/fs/fs_parser.c
@@ -80,7 +80,7 @@
  * unknown parameters are okay and -EINVAL if there was a conversion issue or
  * the parameter wasn't recognised and unknowns aren't okay.
  */
-int fs_parse(struct fs_context *fc,
+int __fs_parse(struct p_log *log,
 	     const struct fs_parameter_description *desc,
 	     struct fs_parameter *param,
 	     struct fs_parse_result *result)
@@ -113,8 +113,7 @@
 	}
 
 	if (p->flags & fs_param_deprecated)
-		warnf(fc, "%s: Deprecated parameter '%s'",
-		      desc->name, param->key);
+		warn_plog(log, "Deprecated parameter '%s'", param->key);
 
 	if (result->negated)
 		goto okay;
@@ -152,8 +151,8 @@
 	switch (p->type) {
 	case fs_param_is_flag:
 		if (param->type != fs_value_is_flag)
-			return invalf(fc, "%s: Unexpected value for '%s'",
-				      desc->name, param->key);
+			return inval_plog(log, "Unexpected value for '%s'",
+				      param->key);
 		result->boolean = true;
 		goto okay;
 
@@ -238,10 +237,20 @@
 	return p->opt;
 
 bad_value:
-	return invalf(fc, "%s: Bad value for '%s'", desc->name, param->key);
+	return inval_plog(log, "Bad value for '%s'", param->key);
 unknown_parameter:
 	return -ENOPARAM;
 }
+EXPORT_SYMBOL(__fs_parse);
+
+int fs_parse(struct fs_context *fc,
+	     const struct fs_parameter_description *desc,
+	     struct fs_parameter *param,
+	     struct fs_parse_result *result)
+{
+	struct p_log log = {.prefix = desc->name, .log = fc->log};
+	return __fs_parse(&log, desc, param, result);
+}
 EXPORT_SYMBOL(fs_parse);
 
 /**
diff --git a/include/linux/fs_context.h b/include/linux/fs_context.h
index 6a7eeb2..41f37d3 100644
--- a/include/linux/fs_context.h
+++ b/include/linux/fs_context.h
@@ -189,10 +189,8 @@
 extern __attribute__((format(printf, 4, 5)))
 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__);})
+#define __logfc(fc, l, fmt, ...) logfc((fc)->log, NULL, \
+					l, fmt, ## __VA_ARGS__)
 #define __plog(p, l, fmt, ...) logfc((p)->log, (p)->prefix, \
 					l, fmt, ## __VA_ARGS__)
 /**
diff --git a/include/linux/fs_parser.h b/include/linux/fs_parser.h
index 14bdaac..b0fba26 100644
--- a/include/linux/fs_parser.h
+++ b/include/linux/fs_parser.h
@@ -74,6 +74,10 @@
 	};
 };
 
+extern int __fs_parse(struct p_log *log,
+		    const struct fs_parameter_description *desc,
+		    struct fs_parameter *value,
+		    struct fs_parse_result *result);
 extern int fs_parse(struct fs_context *fc,
 		    const struct fs_parameter_description *desc,
 		    struct fs_parameter *value,
diff --git a/net/ceph/ceph_common.c b/net/ceph/ceph_common.c
index a3f4f00..9f8bc96 100644
--- a/net/ceph/ceph_common.c
+++ b/net/ceph/ceph_common.c
@@ -407,7 +407,7 @@
 	int token, err;
 	struct p_log log = {.prefix = "libceph", .log = fc ? fc->log : NULL};
 
-	token = fs_parse(fc, &ceph_parameters, param, &result);
+	token = __fs_parse(&log, &ceph_parameters, param, &result);
 	dout("%s fs_parse '%s' token %d\n", __func__, param->key, token);
 	if (token < 0)
 		return token;