fs/adfs: remove truncated filename hashing
authorRussell King <rmk+kernel@armlinux.org.uk>
Sun, 24 Mar 2019 11:02:02 +0000 (11:02 +0000)
committerRussell King <rmk+kernel@armlinux.org.uk>
Fri, 31 May 2019 09:31:00 +0000 (10:31 +0100)
fs/adfs support for truncated filenames is broken, and there is a desire
not to support this into the future.  Let's remove the fs/adfs support
for this.

Viro says:

"FWIW, the word from Linus had been basically "kill it off" on
truncation."

That being:

"Make it so. Make the rule be that d_hash() can only change the hash
itself, rather than the subtle special case for len that we had
because of legacy reasons.."

Acked-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
fs/adfs/dir.c

index 877d5cffe9e9bc54372266cc070809b135adaac1..5d88108339df6e058466cbb6ab83c9147232c865 100644 (file)
@@ -214,22 +214,17 @@ const struct file_operations adfs_dir_operations = {
 static int
 adfs_hash(const struct dentry *parent, struct qstr *qstr)
 {
-       const unsigned int name_len = ADFS_SB(parent->d_sb)->s_namelen;
        const unsigned char *name;
        unsigned long hash;
-       int i;
+       u32 len;
 
-       if (qstr->len < name_len)
-               return 0;
+       if (qstr->len > ADFS_SB(parent->d_sb)->s_namelen)
+               return -ENAMETOOLONG;
 
-       /*
-        * Truncate the name in place, avoids
-        * having to define a compare function.
-        */
-       qstr->len = i = name_len;
+       len = qstr->len;
        name = qstr->name;
        hash = init_name_hash(parent);
-       while (i--)
+       while (len--)
                hash = partial_name_hash(adfs_tolower(*name++), hash);
        qstr->hash = end_name_hash(hash);