1 /* 2 * linux/fs/hpfs/dentry.c 3 * 4 * Mikulas Patocka (mikulas@artax.karlin.mff.cuni.cz), 1998-1999 5 * 6 * dcache operations 7 */ 8 9 #include "hpfs_fn.h" 10 11 /* 12 * Note: the dentry argument is the parent dentry. 13 */ 14 15 static int hpfs_hash_dentry(const struct dentry *dentry, const struct inode *inode, 16 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(); 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 *parent, 39 const struct inode *pinode, 40 const struct dentry *dentry, const struct inode *inode, 41 unsigned int len, const char *str, const struct qstr *name) 42 { 43 unsigned al = len; 44 unsigned bl = name->len; 45 46 hpfs_adjust_length(str, &al); 47 /*hpfs_adjust_length(b->name, &bl);*/ 48 49 /* 50 * 'str' is the nane of an already existing dentry, so the name 51 * must be valid. 'name' must be validated first. 52 */ 53 54 if (hpfs_chk_name(name->name, &bl)) 55 return 1; 56 if (hpfs_compare_names(parent->d_sb, str, al, name->name, bl, 0)) 57 return 1; 58 return 0; 59 } 60 61 static const struct dentry_operations hpfs_dentry_operations = { 62 .d_hash = hpfs_hash_dentry, 63 .d_compare = hpfs_compare_dentry, 64 }; 65 66 void hpfs_set_dentry_operations(struct dentry *dentry) 67 { 68 dentry->d_op = &hpfs_dentry_operations; 69 } 70