Merge tag 'printk-for-5.10' of git://git.kernel.org/pub/scm/linux/kernel/git/printk...
[platform/kernel/linux-starfive.git] / drivers / base / core.c
index bb5806a..f90e9f7 100644 (file)
@@ -4061,22 +4061,21 @@ void device_shutdown(void)
  */
 
 #ifdef CONFIG_PRINTK
-static int
-create_syslog_header(const struct device *dev, char *hdr, size_t hdrlen)
+static void
+set_dev_info(const struct device *dev, struct dev_printk_info *dev_info)
 {
        const char *subsys;
-       size_t pos = 0;
+
+       memset(dev_info, 0, sizeof(*dev_info));
 
        if (dev->class)
                subsys = dev->class->name;
        else if (dev->bus)
                subsys = dev->bus->name;
        else
-               return 0;
+               return;
 
-       pos += snprintf(hdr + pos, hdrlen - pos, "SUBSYSTEM=%s", subsys);
-       if (pos >= hdrlen)
-               goto overflow;
+       strscpy(dev_info->subsystem, subsys, sizeof(dev_info->subsystem));
 
        /*
         * Add device identifier DEVICE=:
@@ -4092,41 +4091,28 @@ create_syslog_header(const struct device *dev, char *hdr, size_t hdrlen)
                        c = 'b';
                else
                        c = 'c';
-               pos++;
-               pos += snprintf(hdr + pos, hdrlen - pos,
-                               "DEVICE=%c%u:%u",
-                               c, MAJOR(dev->devt), MINOR(dev->devt));
+
+               snprintf(dev_info->device, sizeof(dev_info->device),
+                        "%c%u:%u", c, MAJOR(dev->devt), MINOR(dev->devt));
        } else if (strcmp(subsys, "net") == 0) {
                struct net_device *net = to_net_dev(dev);
 
-               pos++;
-               pos += snprintf(hdr + pos, hdrlen - pos,
-                               "DEVICE=n%u", net->ifindex);
+               snprintf(dev_info->device, sizeof(dev_info->device),
+                        "n%u", net->ifindex);
        } else {
-               pos++;
-               pos += snprintf(hdr + pos, hdrlen - pos,
-                               "DEVICE=+%s:%s", subsys, dev_name(dev));
+               snprintf(dev_info->device, sizeof(dev_info->device),
+                        "+%s:%s", subsys, dev_name(dev));
        }
-
-       if (pos >= hdrlen)
-               goto overflow;
-
-       return pos;
-
-overflow:
-       dev_WARN(dev, "device/subsystem name too long");
-       return 0;
 }
 
 int dev_vprintk_emit(int level, const struct device *dev,
                     const char *fmt, va_list args)
 {
-       char hdr[128];
-       size_t hdrlen;
+       struct dev_printk_info dev_info;
 
-       hdrlen = create_syslog_header(dev, hdr, sizeof(hdr));
+       set_dev_info(dev, &dev_info);
 
-       return vprintk_emit(0, level, hdrlen ? hdr : NULL, hdrlen, fmt, args);
+       return vprintk_emit(0, level, &dev_info, fmt, args);
 }
 EXPORT_SYMBOL(dev_vprintk_emit);