Merge tag 'mm-nonmm-stable-2023-04-27-16-01' of git://git.kernel.org/pub/scm/linux...
[linux-block.git] / lib / vsprintf.c
index be71a03c936a314a3ed1e98072809cdcc077d1cb..40f560959b169b4c4ac6154d658cfe76cfd0c5a6 100644 (file)
@@ -2052,6 +2052,25 @@ char *format_page_flags(char *buf, char *end, unsigned long flags)
        return buf;
 }
 
+static
+char *format_page_type(char *buf, char *end, unsigned int page_type)
+{
+       buf = number(buf, end, page_type, default_flag_spec);
+
+       if (buf < end)
+               *buf = '(';
+       buf++;
+
+       if (page_type_has_type(page_type))
+               buf = format_flags(buf, end, ~page_type, pagetype_names);
+
+       if (buf < end)
+               *buf = ')';
+       buf++;
+
+       return buf;
+}
+
 static noinline_for_stack
 char *flags_string(char *buf, char *end, void *flags_ptr,
                   struct printf_spec spec, const char *fmt)
@@ -2065,6 +2084,8 @@ char *flags_string(char *buf, char *end, void *flags_ptr,
        switch (fmt[1]) {
        case 'p':
                return format_page_flags(buf, end, *(unsigned long *)flags_ptr);
+       case 't':
+               return format_page_type(buf, end, *(unsigned int *)flags_ptr);
        case 'v':
                flags = *(unsigned long *)flags_ptr;
                names = vmaflag_names;
@@ -3621,7 +3642,7 @@ int vsscanf(const char *buf, const char *fmt, va_list args)
                if (!digit
                    || (base == 16 && !isxdigit(digit))
                    || (base == 10 && !isdigit(digit))
-                   || (base == 8 && (!isdigit(digit) || digit > '7'))
+                   || (base == 8 && !isodigit(digit))
                    || (base == 0 && !isdigit(digit)))
                        break;