xref: /openbmc/linux/fs/hpfs/dentry.c (revision 498495dba268b20e8eadd7fe93c140c68b6cc9d2)
1*b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  *  linux/fs/hpfs/dentry.c
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  *  Mikulas Patocka (mikulas@artax.karlin.mff.cuni.cz), 1998-1999
61da177e4SLinus Torvalds  *
71da177e4SLinus Torvalds  *  dcache operations
81da177e4SLinus Torvalds  */
91da177e4SLinus Torvalds 
101da177e4SLinus Torvalds #include "hpfs_fn.h"
111da177e4SLinus Torvalds 
121da177e4SLinus Torvalds /*
131da177e4SLinus Torvalds  * Note: the dentry argument is the parent dentry.
141da177e4SLinus Torvalds  */
151da177e4SLinus Torvalds 
hpfs_hash_dentry(const struct dentry * dentry,struct qstr * qstr)16da53be12SLinus Torvalds static int hpfs_hash_dentry(const struct dentry *dentry, struct qstr *qstr)
171da177e4SLinus Torvalds {
181da177e4SLinus Torvalds 	unsigned long	 hash;
191da177e4SLinus Torvalds 	int		 i;
201da177e4SLinus Torvalds 	unsigned l = qstr->len;
211da177e4SLinus Torvalds 
221da177e4SLinus Torvalds 	if (l == 1) if (qstr->name[0]=='.') goto x;
231da177e4SLinus Torvalds 	if (l == 2) if (qstr->name[0]=='.' || qstr->name[1]=='.') goto x;
247e7742eeSAl Viro 	hpfs_adjust_length(qstr->name, &l);
257e7742eeSAl Viro 	/*if (hpfs_chk_name(qstr->name,&l))*/
261da177e4SLinus Torvalds 		/*return -ENAMETOOLONG;*/
271da177e4SLinus Torvalds 		/*return -ENOENT;*/
281da177e4SLinus Torvalds 	x:
291da177e4SLinus Torvalds 
308387ff25SLinus Torvalds 	hash = init_name_hash(dentry);
311da177e4SLinus Torvalds 	for (i = 0; i < l; i++)
321da177e4SLinus Torvalds 		hash = partial_name_hash(hpfs_upcase(hpfs_sb(dentry->d_sb)->sb_cp_table,qstr->name[i]), hash);
331da177e4SLinus Torvalds 	qstr->hash = end_name_hash(hash);
341da177e4SLinus Torvalds 
351da177e4SLinus Torvalds 	return 0;
361da177e4SLinus Torvalds }
371da177e4SLinus Torvalds 
hpfs_compare_dentry(const struct dentry * dentry,unsigned int len,const char * str,const struct qstr * name)386fa67e70SAl Viro static int hpfs_compare_dentry(const struct dentry *dentry,
39621e155aSNick Piggin 		unsigned int len, const char *str, const struct qstr *name)
401da177e4SLinus Torvalds {
41621e155aSNick Piggin 	unsigned al = len;
42621e155aSNick Piggin 	unsigned bl = name->len;
43621e155aSNick Piggin 
44621e155aSNick Piggin 	hpfs_adjust_length(str, &al);
457e7742eeSAl Viro 	/*hpfs_adjust_length(b->name, &bl);*/
46621e155aSNick Piggin 
47621e155aSNick Piggin 	/*
48621e155aSNick Piggin 	 * 'str' is the nane of an already existing dentry, so the name
49621e155aSNick Piggin 	 * must be valid. 'name' must be validated first.
501da177e4SLinus Torvalds 	 */
511da177e4SLinus Torvalds 
52621e155aSNick Piggin 	if (hpfs_chk_name(name->name, &bl))
537e7742eeSAl Viro 		return 1;
54d3fe1985SAl Viro 	if (hpfs_compare_names(dentry->d_sb, str, al, name->name, bl, 0))
557e7742eeSAl Viro 		return 1;
561da177e4SLinus Torvalds 	return 0;
571da177e4SLinus Torvalds }
581da177e4SLinus Torvalds 
5943d344d7SAl Viro const struct dentry_operations hpfs_dentry_operations = {
601da177e4SLinus Torvalds 	.d_hash		= hpfs_hash_dentry,
611da177e4SLinus Torvalds 	.d_compare	= hpfs_compare_dentry,
621da177e4SLinus Torvalds };
63