dentry.c (1465B)
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 16static 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 38static 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 59const struct dentry_operations hpfs_dentry_operations = { 60 .d_hash = hpfs_hash_dentry, 61 .d_compare = hpfs_compare_dentry, 62};