blob: 89a36fdc68cbb77a62b3b1cc27735cc89d6a64f2 [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001// SPDX-License-Identifier: GPL-2.0
Linus Torvalds1da177e2005-04-16 15:20:36 -07002/*
3 * linux/fs/hpfs/dentry.c
4 *
5 * Mikulas Patocka (mikulas@artax.karlin.mff.cuni.cz), 1998-1999
6 *
7 * dcache operations
8 */
9
10#include "hpfs_fn.h"
11
12/*
13 * Note: the dentry argument is the parent dentry.
14 */
15
Linus Torvaldsda53be12013-05-21 15:22:44 -070016static int hpfs_hash_dentry(const struct dentry *dentry, struct qstr *qstr)
Linus Torvalds1da177e2005-04-16 15:20:36 -070017{
18 unsigned long hash;
19 int i;
20 unsigned l = qstr->len;
21
22 if (l == 1) if (qstr->name[0]=='.') goto x;
23 if (l == 2) if (qstr->name[0]=='.' || qstr->name[1]=='.') goto x;
Al Viro7e7742e2010-01-31 17:09:29 -050024 hpfs_adjust_length(qstr->name, &l);
25 /*if (hpfs_chk_name(qstr->name,&l))*/
Linus Torvalds1da177e2005-04-16 15:20:36 -070026 /*return -ENAMETOOLONG;*/
27 /*return -ENOENT;*/
28 x:
29
Linus Torvalds8387ff22016-06-10 07:51:30 -070030 hash = init_name_hash(dentry);
Linus Torvalds1da177e2005-04-16 15:20:36 -070031 for (i = 0; i < l; i++)
32 hash = partial_name_hash(hpfs_upcase(hpfs_sb(dentry->d_sb)->sb_cp_table,qstr->name[i]), hash);
33 qstr->hash = end_name_hash(hash);
34
35 return 0;
36}
37
Al Viro6fa67e72016-07-31 16:37:25 -040038static int hpfs_compare_dentry(const struct dentry *dentry,
Nick Piggin621e1552011-01-07 17:49:27 +110039 unsigned int len, const char *str, const struct qstr *name)
Linus Torvalds1da177e2005-04-16 15:20:36 -070040{
Nick Piggin621e1552011-01-07 17:49:27 +110041 unsigned al = len;
42 unsigned bl = name->len;
43
44 hpfs_adjust_length(str, &al);
Al Viro7e7742e2010-01-31 17:09:29 -050045 /*hpfs_adjust_length(b->name, &bl);*/
Nick Piggin621e1552011-01-07 17:49:27 +110046
47 /*
48 * 'str' is the nane of an already existing dentry, so the name
49 * must be valid. 'name' must be validated first.
Linus Torvalds1da177e2005-04-16 15:20:36 -070050 */
51
Nick Piggin621e1552011-01-07 17:49:27 +110052 if (hpfs_chk_name(name->name, &bl))
Al Viro7e7742e2010-01-31 17:09:29 -050053 return 1;
Al Virod3fe1982016-07-29 18:23:59 -040054 if (hpfs_compare_names(dentry->d_sb, str, al, name->name, bl, 0))
Al Viro7e7742e2010-01-31 17:09:29 -050055 return 1;
Linus Torvalds1da177e2005-04-16 15:20:36 -070056 return 0;
57}
58
Al Viro43d344d2011-01-12 16:12:05 -050059const struct dentry_operations hpfs_dentry_operations = {
Linus Torvalds1da177e2005-04-16 15:20:36 -070060 .d_hash = hpfs_hash_dentry,
61 .d_compare = hpfs_compare_dentry,
62};