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