Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | #ifndef __LINUX_DCACHE_H #define __LINUX_DCACHE_H /* * linux/include/linux/dcache.h * * Directory cache data structures */ #define D_MAXLEN 1024 #define IS_ROOT(x) ((x) == (x)->d_parent) /* * "quick string" -- eases parameter passing, but more importantly * saves "metadata" about the string (ie length and the hash). */ struct qstr { const unsigned char * name; unsigned int len, hash; }; /* Name hashing routines. Initial hash value */ #define init_name_hash() 0 /* partial hash update function. Assume roughly 4 bits per character */ static inline unsigned long partial_name_hash(unsigned char c, unsigned long prevhash) { prevhash = (prevhash << 4) | (prevhash >> (8*sizeof(unsigned long)-4)); return prevhash ^ c; } /* Finally: cut down the number of bits to a int value (and try to avoid losing bits) */ static inline unsigned long end_name_hash(unsigned long hash) { if (sizeof(hash) > sizeof(unsigned int)) hash += hash >> 4*sizeof(hash); return (unsigned int) hash; } struct dentry { int d_count; unsigned int d_flags; struct inode * d_inode; /* Where the name belongs to - NULL is negative */ struct dentry * d_parent; /* parent directory */ struct dentry * d_mounts; /* mount information */ struct dentry * d_covers; struct list_head d_hash; /* lookup hash list */ struct list_head d_alias; /* inode alias list */ struct list_head d_lru; /* d_count = 0 LRU list */ struct qstr d_name; unsigned long d_time; /* used by d_revalidate */ int (*d_revalidate)(struct dentry *); }; /* d_flags entries */ #define DCACHE_AUTOFS_PENDING 0x0001 /* autofs: "under construction" */ /* * d_drop() unhashes the entry from the parent * dentry hashes, so that it won't be found through * a VFS lookup any more. Note that this is different * from deleting the dentry - d_delete will try to * mark the dentry negative if possible, giving a * successful _negative_ lookup, while d_drop will * just make the cache lookup fail. * * d_drop() is used mainly for stuff that wants * to invalidate a dentry for some reason (NFS * timeouts or autofs deletes). */ static inline void d_drop(struct dentry * dentry) { list_del(&dentry->d_hash); INIT_LIST_HEAD(&dentry->d_hash); } /* * These are the low-level FS interfaces to the dcache.. */ extern void d_instantiate(struct dentry *, struct inode *); extern void d_delete(struct dentry *); /* allocate/de-allocate */ extern void d_free(struct dentry *); extern struct dentry * d_alloc(struct dentry * parent, const struct qstr *name); extern void shrink_dcache(void); /* only used at mount-time */ extern struct dentry * d_alloc_root(struct inode * root_inode, struct dentry * old_root); /* * This adds the entry to the hash queues and initializes "d_inode". * The entry was actually filled in earlier during "d_alloc()" */ extern void d_add(struct dentry * entry, struct inode * inode); /* used for rename() and baskets */ extern void d_move(struct dentry * entry, struct dentry * newdentry); /* appendix may either be NULL or be used for transname suffixes */ extern struct dentry * d_lookup(struct dentry * dir, struct qstr * name); /* validate "insecure" dentry pointer */ extern int d_validate(struct dentry *dentry, struct dentry *dparent, unsigned int hash, unsigned int len); /* write full pathname into buffer and return start of pathname */ extern char * d_path(struct dentry * entry, char * buf, int buflen); /* Allocation counts.. */ static inline struct dentry * dget(struct dentry *dentry) { if (dentry) dentry->d_count++; return dentry; } extern void dput(struct dentry *); /* * This is ugly. The inode:dentry relationship is a 1:n * relationship, so we have to return one (random) dentry * from the alias list. We select the first one.. */ #define i_dentry(inode) \ list_entry((inode)->i_dentry.next, struct dentry, d_alias) #endif /* __LINUX_DCACHE_H */ |