[PATCH v5] vfat: Deduplicate hex2bin()

From: Andy Shevchenko
Date: Mon Jul 31 2017 - 10:33:58 EST


We may use hex2bin() instead of custom approach.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>
---
This is blast from the past (2011). Instead of dirty looking bitwise
types here, though __be16 would be correct, I decide to go with
an array of two u8 items.

This patch relies on
http://marc.info/?l=linux-kernel&m=150150935411183&w=2 being applied,
which is currently not.

fs/fat/namei_vfat.c | 35 ++++++++++-------------------------
1 file changed, 10 insertions(+), 25 deletions(-)

diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c
index 6a7152d0c250..56127f76c41f 100644
--- a/fs/fat/namei_vfat.c
+++ b/fs/fat/namei_vfat.c
@@ -17,6 +17,7 @@

#include <linux/module.h>
#include <linux/ctype.h>
+#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/namei.h>
#include "fat.h"
@@ -510,11 +511,10 @@ xlate_to_uni(const unsigned char *name, int len, unsigned char *outname,
struct nls_table *nls)
{
const unsigned char *ip;
- unsigned char nc;
unsigned char *op;
- unsigned int ec;
- int i, k, fill;
+ int i, fill;
int charlen;
+ u8 hc[2];

if (utf8) {
*outlen = utf8s_to_utf16s(name, len, UTF16_HOST_ENDIAN,
@@ -532,31 +532,16 @@ xlate_to_uni(const unsigned char *name, int len, unsigned char *outname,
if (escape && (*ip == ':')) {
if (i > len - 5)
return -EINVAL;
- ec = 0;
- for (k = 1; k < 5; k++) {
- nc = ip[k];
- ec <<= 4;
- if (nc >= '0' && nc <= '9') {
- ec |= nc - '0';
- continue;
- }
- if (nc >= 'a' && nc <= 'f') {
- ec |= nc - ('a' - 10);
- continue;
- }
- if (nc >= 'A' && nc <= 'F') {
- ec |= nc - ('A' - 10);
- continue;
- }
- return -EINVAL;
- }
- *op++ = ec & 0xFF;
- *op++ = ec >> 8;
+
+ fill = hex2bin(hc, ip + 1, 2);
+ if (fill)
+ return fill;
+ *op++ = hc[1];
+ *op++ = hc[0];
ip += 5;
i += 5;
} else {
- charlen = nls->char2uni(ip, len - i,
- (wchar_t *)op);
+ charlen = nls->char2uni(ip, len - i, (wchar_t *)op);
if (charlen < 0)
return -EINVAL;
ip += charlen;
--
2.13.2