1 // SPDX-License-Identifier: GPL-2.0 2 /* 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 16 static int hpfs_hash_dentry(const struct dentry *dentry, struct qstr *qstr) 17 { 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; 24 hpfs_adjust_length(qstr->name, &l); 25 /*if (hpfs_chk_name(qstr->name,&l))*/ 26 /*return -ENAMETOOLONG;*/ 27 /*return -ENOENT;*/ 28 x: 29 30 hash = init_name_hash(dentry); 31 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 38 static int hpfs_compare_dentry(const struct dentry *dentry, 39 unsigned int len, const char *str, const struct qstr *name) 40 { 41 unsigned al = len; 42 unsigned bl = name->len; 43 44 hpfs_adjust_length(str, &al); 45 /*hpfs_adjust_length(b->name, &bl);*/ 46 47 /* 48 * 'str' is the nane of an already existing dentry, so the name 49 * must be valid. 'name' must be validated first. 50 */ 51 52 if (hpfs_chk_name(name->name, &bl)) 53 return 1; 54 if (hpfs_compare_names(dentry->d_sb, str, al, name->name, bl, 0)) 55 return 1; 56 return 0; 57 } 58 59 const struct dentry_operations hpfs_dentry_operations = { 60 .d_hash = hpfs_hash_dentry, 61 .d_compare = hpfs_compare_dentry, 62 }; 63