Merge arlied/drm-next into drm-misc-next
[linux-2.6-microblaze.git] / fs / hpfs / dentry.c
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 };