xref: /OK3568_Linux_fs/kernel/fs/hpfs/dentry.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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