1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * linux/fs/hpfs/dentry.c
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Mikulas Patocka (mikulas@artax.karlin.mff.cuni.cz), 1998-1999
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * dcache operations
8*4882a593Smuzhiyun */
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #include "hpfs_fn.h"
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun /*
13*4882a593Smuzhiyun * Note: the dentry argument is the parent dentry.
14*4882a593Smuzhiyun */
15*4882a593Smuzhiyun
hpfs_hash_dentry(const struct dentry * dentry,struct qstr * qstr)16*4882a593Smuzhiyun static int hpfs_hash_dentry(const struct dentry *dentry, struct qstr *qstr)
17*4882a593Smuzhiyun {
18*4882a593Smuzhiyun unsigned long hash;
19*4882a593Smuzhiyun int i;
20*4882a593Smuzhiyun unsigned l = qstr->len;
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun if (l == 1) if (qstr->name[0]=='.') goto x;
23*4882a593Smuzhiyun if (l == 2) if (qstr->name[0]=='.' || qstr->name[1]=='.') goto x;
24*4882a593Smuzhiyun hpfs_adjust_length(qstr->name, &l);
25*4882a593Smuzhiyun /*if (hpfs_chk_name(qstr->name,&l))*/
26*4882a593Smuzhiyun /*return -ENAMETOOLONG;*/
27*4882a593Smuzhiyun /*return -ENOENT;*/
28*4882a593Smuzhiyun x:
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun hash = init_name_hash(dentry);
31*4882a593Smuzhiyun for (i = 0; i < l; i++)
32*4882a593Smuzhiyun hash = partial_name_hash(hpfs_upcase(hpfs_sb(dentry->d_sb)->sb_cp_table,qstr->name[i]), hash);
33*4882a593Smuzhiyun qstr->hash = end_name_hash(hash);
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun return 0;
36*4882a593Smuzhiyun }
37*4882a593Smuzhiyun
hpfs_compare_dentry(const struct dentry * dentry,unsigned int len,const char * str,const struct qstr * name)38*4882a593Smuzhiyun static int hpfs_compare_dentry(const struct dentry *dentry,
39*4882a593Smuzhiyun unsigned int len, const char *str, const struct qstr *name)
40*4882a593Smuzhiyun {
41*4882a593Smuzhiyun unsigned al = len;
42*4882a593Smuzhiyun unsigned bl = name->len;
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun hpfs_adjust_length(str, &al);
45*4882a593Smuzhiyun /*hpfs_adjust_length(b->name, &bl);*/
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun /*
48*4882a593Smuzhiyun * 'str' is the nane of an already existing dentry, so the name
49*4882a593Smuzhiyun * must be valid. 'name' must be validated first.
50*4882a593Smuzhiyun */
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun if (hpfs_chk_name(name->name, &bl))
53*4882a593Smuzhiyun return 1;
54*4882a593Smuzhiyun if (hpfs_compare_names(dentry->d_sb, str, al, name->name, bl, 0))
55*4882a593Smuzhiyun return 1;
56*4882a593Smuzhiyun return 0;
57*4882a593Smuzhiyun }
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun const struct dentry_operations hpfs_dentry_operations = {
60*4882a593Smuzhiyun .d_hash = hpfs_hash_dentry,
61*4882a593Smuzhiyun .d_compare = hpfs_compare_dentry,
62*4882a593Smuzhiyun };
63