diff options
Diffstat (limited to 'fs/dcache.c')
-rw-r--r-- | fs/dcache.c | 70 |
1 files changed, 46 insertions, 24 deletions
diff --git a/fs/dcache.c b/fs/dcache.c index 953173a293a9..f1358e5c3a59 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
@@ -257,6 +257,7 @@ kill_it: | |||
257 | if (dentry) | 257 | if (dentry) |
258 | goto repeat; | 258 | goto repeat; |
259 | } | 259 | } |
260 | EXPORT_SYMBOL(dput); | ||
260 | 261 | ||
261 | /** | 262 | /** |
262 | * d_invalidate - invalidate a dentry | 263 | * d_invalidate - invalidate a dentry |
@@ -314,6 +315,7 @@ int d_invalidate(struct dentry * dentry) | |||
314 | spin_unlock(&dcache_lock); | 315 | spin_unlock(&dcache_lock); |
315 | return 0; | 316 | return 0; |
316 | } | 317 | } |
318 | EXPORT_SYMBOL(d_invalidate); | ||
317 | 319 | ||
318 | /* This should be called _only_ with dcache_lock held */ | 320 | /* This should be called _only_ with dcache_lock held */ |
319 | 321 | ||
@@ -328,6 +330,7 @@ struct dentry * dget_locked(struct dentry *dentry) | |||
328 | { | 330 | { |
329 | return __dget_locked(dentry); | 331 | return __dget_locked(dentry); |
330 | } | 332 | } |
333 | EXPORT_SYMBOL(dget_locked); | ||
331 | 334 | ||
332 | /** | 335 | /** |
333 | * d_find_alias - grab a hashed alias of inode | 336 | * d_find_alias - grab a hashed alias of inode |
@@ -384,6 +387,7 @@ struct dentry * d_find_alias(struct inode *inode) | |||
384 | } | 387 | } |
385 | return de; | 388 | return de; |
386 | } | 389 | } |
390 | EXPORT_SYMBOL(d_find_alias); | ||
387 | 391 | ||
388 | /* | 392 | /* |
389 | * Try to kill dentries associated with this inode. | 393 | * Try to kill dentries associated with this inode. |
@@ -408,6 +412,7 @@ restart: | |||
408 | } | 412 | } |
409 | spin_unlock(&dcache_lock); | 413 | spin_unlock(&dcache_lock); |
410 | } | 414 | } |
415 | EXPORT_SYMBOL(d_prune_aliases); | ||
411 | 416 | ||
412 | /* | 417 | /* |
413 | * Throw away a dentry - free the inode, dput the parent. This requires that | 418 | * Throw away a dentry - free the inode, dput the parent. This requires that |
@@ -610,6 +615,7 @@ void shrink_dcache_sb(struct super_block * sb) | |||
610 | { | 615 | { |
611 | __shrink_dcache_sb(sb, NULL, 0); | 616 | __shrink_dcache_sb(sb, NULL, 0); |
612 | } | 617 | } |
618 | EXPORT_SYMBOL(shrink_dcache_sb); | ||
613 | 619 | ||
614 | /* | 620 | /* |
615 | * destroy a single subtree of dentries for unmount | 621 | * destroy a single subtree of dentries for unmount |
@@ -792,6 +798,7 @@ positive: | |||
792 | spin_unlock(&dcache_lock); | 798 | spin_unlock(&dcache_lock); |
793 | return 1; | 799 | return 1; |
794 | } | 800 | } |
801 | EXPORT_SYMBOL(have_submounts); | ||
795 | 802 | ||
796 | /* | 803 | /* |
797 | * Search the dentry child list for the specified parent, | 804 | * Search the dentry child list for the specified parent, |
@@ -876,6 +883,7 @@ void shrink_dcache_parent(struct dentry * parent) | |||
876 | while ((found = select_parent(parent)) != 0) | 883 | while ((found = select_parent(parent)) != 0) |
877 | __shrink_dcache_sb(sb, &found, 0); | 884 | __shrink_dcache_sb(sb, &found, 0); |
878 | } | 885 | } |
886 | EXPORT_SYMBOL(shrink_dcache_parent); | ||
879 | 887 | ||
880 | /* | 888 | /* |
881 | * Scan `nr' dentries and return the number which remain. | 889 | * Scan `nr' dentries and return the number which remain. |
@@ -968,6 +976,7 @@ struct dentry *d_alloc(struct dentry * parent, const struct qstr *name) | |||
968 | 976 | ||
969 | return dentry; | 977 | return dentry; |
970 | } | 978 | } |
979 | EXPORT_SYMBOL(d_alloc); | ||
971 | 980 | ||
972 | struct dentry *d_alloc_name(struct dentry *parent, const char *name) | 981 | struct dentry *d_alloc_name(struct dentry *parent, const char *name) |
973 | { | 982 | { |
@@ -1012,6 +1021,7 @@ void d_instantiate(struct dentry *entry, struct inode * inode) | |||
1012 | spin_unlock(&dcache_lock); | 1021 | spin_unlock(&dcache_lock); |
1013 | security_d_instantiate(entry, inode); | 1022 | security_d_instantiate(entry, inode); |
1014 | } | 1023 | } |
1024 | EXPORT_SYMBOL(d_instantiate); | ||
1015 | 1025 | ||
1016 | /** | 1026 | /** |
1017 | * d_instantiate_unique - instantiate a non-aliased dentry | 1027 | * d_instantiate_unique - instantiate a non-aliased dentry |
@@ -1108,6 +1118,7 @@ struct dentry * d_alloc_root(struct inode * root_inode) | |||
1108 | } | 1118 | } |
1109 | return res; | 1119 | return res; |
1110 | } | 1120 | } |
1121 | EXPORT_SYMBOL(d_alloc_root); | ||
1111 | 1122 | ||
1112 | static inline struct hlist_head *d_hash(struct dentry *parent, | 1123 | static inline struct hlist_head *d_hash(struct dentry *parent, |
1113 | unsigned long hash) | 1124 | unsigned long hash) |
@@ -1211,7 +1222,6 @@ struct dentry *d_splice_alias(struct inode *inode, struct dentry *dentry) | |||
1211 | BUG_ON(!(new->d_flags & DCACHE_DISCONNECTED)); | 1222 | BUG_ON(!(new->d_flags & DCACHE_DISCONNECTED)); |
1212 | spin_unlock(&dcache_lock); | 1223 | spin_unlock(&dcache_lock); |
1213 | security_d_instantiate(new, inode); | 1224 | security_d_instantiate(new, inode); |
1214 | d_rehash(dentry); | ||
1215 | d_move(new, dentry); | 1225 | d_move(new, dentry); |
1216 | iput(inode); | 1226 | iput(inode); |
1217 | } else { | 1227 | } else { |
@@ -1225,6 +1235,7 @@ struct dentry *d_splice_alias(struct inode *inode, struct dentry *dentry) | |||
1225 | d_add(dentry, inode); | 1235 | d_add(dentry, inode); |
1226 | return new; | 1236 | return new; |
1227 | } | 1237 | } |
1238 | EXPORT_SYMBOL(d_splice_alias); | ||
1228 | 1239 | ||
1229 | /** | 1240 | /** |
1230 | * d_add_ci - lookup or allocate new dentry with case-exact name | 1241 | * d_add_ci - lookup or allocate new dentry with case-exact name |
@@ -1314,6 +1325,7 @@ err_out: | |||
1314 | iput(inode); | 1325 | iput(inode); |
1315 | return ERR_PTR(error); | 1326 | return ERR_PTR(error); |
1316 | } | 1327 | } |
1328 | EXPORT_SYMBOL(d_add_ci); | ||
1317 | 1329 | ||
1318 | /** | 1330 | /** |
1319 | * d_lookup - search for a dentry | 1331 | * d_lookup - search for a dentry |
@@ -1357,6 +1369,7 @@ struct dentry * d_lookup(struct dentry * parent, struct qstr * name) | |||
1357 | } while (read_seqretry(&rename_lock, seq)); | 1369 | } while (read_seqretry(&rename_lock, seq)); |
1358 | return dentry; | 1370 | return dentry; |
1359 | } | 1371 | } |
1372 | EXPORT_SYMBOL(d_lookup); | ||
1360 | 1373 | ||
1361 | struct dentry * __d_lookup(struct dentry * parent, struct qstr * name) | 1374 | struct dentry * __d_lookup(struct dentry * parent, struct qstr * name) |
1362 | { | 1375 | { |
@@ -1483,6 +1496,7 @@ int d_validate(struct dentry *dentry, struct dentry *dparent) | |||
1483 | out: | 1496 | out: |
1484 | return 0; | 1497 | return 0; |
1485 | } | 1498 | } |
1499 | EXPORT_SYMBOL(d_validate); | ||
1486 | 1500 | ||
1487 | /* | 1501 | /* |
1488 | * When a file is deleted, we have two options: | 1502 | * When a file is deleted, we have two options: |
@@ -1528,6 +1542,7 @@ void d_delete(struct dentry * dentry) | |||
1528 | 1542 | ||
1529 | fsnotify_nameremove(dentry, isdir); | 1543 | fsnotify_nameremove(dentry, isdir); |
1530 | } | 1544 | } |
1545 | EXPORT_SYMBOL(d_delete); | ||
1531 | 1546 | ||
1532 | static void __d_rehash(struct dentry * entry, struct hlist_head *list) | 1547 | static void __d_rehash(struct dentry * entry, struct hlist_head *list) |
1533 | { | 1548 | { |
@@ -1556,6 +1571,7 @@ void d_rehash(struct dentry * entry) | |||
1556 | spin_unlock(&entry->d_lock); | 1571 | spin_unlock(&entry->d_lock); |
1557 | spin_unlock(&dcache_lock); | 1572 | spin_unlock(&dcache_lock); |
1558 | } | 1573 | } |
1574 | EXPORT_SYMBOL(d_rehash); | ||
1559 | 1575 | ||
1560 | /* | 1576 | /* |
1561 | * When switching names, the actual string doesn't strictly have to | 1577 | * When switching names, the actual string doesn't strictly have to |
@@ -1702,6 +1718,7 @@ void d_move(struct dentry * dentry, struct dentry * target) | |||
1702 | d_move_locked(dentry, target); | 1718 | d_move_locked(dentry, target); |
1703 | spin_unlock(&dcache_lock); | 1719 | spin_unlock(&dcache_lock); |
1704 | } | 1720 | } |
1721 | EXPORT_SYMBOL(d_move); | ||
1705 | 1722 | ||
1706 | /** | 1723 | /** |
1707 | * d_ancestor - search for an ancestor | 1724 | * d_ancestor - search for an ancestor |
@@ -1868,6 +1885,7 @@ shouldnt_be_hashed: | |||
1868 | spin_unlock(&dcache_lock); | 1885 | spin_unlock(&dcache_lock); |
1869 | BUG(); | 1886 | BUG(); |
1870 | } | 1887 | } |
1888 | EXPORT_SYMBOL_GPL(d_materialise_unique); | ||
1871 | 1889 | ||
1872 | static int prepend(char **buffer, int *buflen, const char *str, int namelen) | 1890 | static int prepend(char **buffer, int *buflen, const char *str, int namelen) |
1873 | { | 1891 | { |
@@ -2005,6 +2023,7 @@ char *d_path(const struct path *path, char *buf, int buflen) | |||
2005 | path_put(&root); | 2023 | path_put(&root); |
2006 | return res; | 2024 | return res; |
2007 | } | 2025 | } |
2026 | EXPORT_SYMBOL(d_path); | ||
2008 | 2027 | ||
2009 | /* | 2028 | /* |
2010 | * Helper function for dentry_operations.d_dname() members | 2029 | * Helper function for dentry_operations.d_dname() members |
@@ -2171,6 +2190,30 @@ int is_subdir(struct dentry *new_dentry, struct dentry *old_dentry) | |||
2171 | return result; | 2190 | return result; |
2172 | } | 2191 | } |
2173 | 2192 | ||
2193 | int path_is_under(struct path *path1, struct path *path2) | ||
2194 | { | ||
2195 | struct vfsmount *mnt = path1->mnt; | ||
2196 | struct dentry *dentry = path1->dentry; | ||
2197 | int res; | ||
2198 | spin_lock(&vfsmount_lock); | ||
2199 | if (mnt != path2->mnt) { | ||
2200 | for (;;) { | ||
2201 | if (mnt->mnt_parent == mnt) { | ||
2202 | spin_unlock(&vfsmount_lock); | ||
2203 | return 0; | ||
2204 | } | ||
2205 | if (mnt->mnt_parent == path2->mnt) | ||
2206 | break; | ||
2207 | mnt = mnt->mnt_parent; | ||
2208 | } | ||
2209 | dentry = mnt->mnt_mountpoint; | ||
2210 | } | ||
2211 | res = is_subdir(dentry, path2->dentry); | ||
2212 | spin_unlock(&vfsmount_lock); | ||
2213 | return res; | ||
2214 | } | ||
2215 | EXPORT_SYMBOL(path_is_under); | ||
2216 | |||
2174 | void d_genocide(struct dentry *root) | 2217 | void d_genocide(struct dentry *root) |
2175 | { | 2218 | { |
2176 | struct dentry *this_parent = root; | 2219 | struct dentry *this_parent = root; |
@@ -2228,6 +2271,7 @@ ino_t find_inode_number(struct dentry *dir, struct qstr *name) | |||
2228 | } | 2271 | } |
2229 | return ino; | 2272 | return ino; |
2230 | } | 2273 | } |
2274 | EXPORT_SYMBOL(find_inode_number); | ||
2231 | 2275 | ||
2232 | static __initdata unsigned long dhash_entries; | 2276 | static __initdata unsigned long dhash_entries; |
2233 | static int __init set_dhash_entries(char *str) | 2277 | static int __init set_dhash_entries(char *str) |
@@ -2297,6 +2341,7 @@ static void __init dcache_init(void) | |||
2297 | 2341 | ||
2298 | /* SLAB cache for __getname() consumers */ | 2342 | /* SLAB cache for __getname() consumers */ |
2299 | struct kmem_cache *names_cachep __read_mostly; | 2343 | struct kmem_cache *names_cachep __read_mostly; |
2344 | EXPORT_SYMBOL(names_cachep); | ||
2300 | 2345 | ||
2301 | EXPORT_SYMBOL(d_genocide); | 2346 | EXPORT_SYMBOL(d_genocide); |
2302 | 2347 | ||
@@ -2326,26 +2371,3 @@ void __init vfs_caches_init(unsigned long mempages) | |||
2326 | bdev_cache_init(); | 2371 | bdev_cache_init(); |
2327 | chrdev_init(); | 2372 | chrdev_init(); |
2328 | } | 2373 | } |
2329 | |||
2330 | EXPORT_SYMBOL(d_alloc); | ||
2331 | EXPORT_SYMBOL(d_alloc_root); | ||
2332 | EXPORT_SYMBOL(d_delete); | ||
2333 | EXPORT_SYMBOL(d_find_alias); | ||
2334 | EXPORT_SYMBOL(d_instantiate); | ||
2335 | EXPORT_SYMBOL(d_invalidate); | ||
2336 | EXPORT_SYMBOL(d_lookup); | ||
2337 | EXPORT_SYMBOL(d_move); | ||
2338 | EXPORT_SYMBOL_GPL(d_materialise_unique); | ||
2339 | EXPORT_SYMBOL(d_path); | ||
2340 | EXPORT_SYMBOL(d_prune_aliases); | ||
2341 | EXPORT_SYMBOL(d_rehash); | ||
2342 | EXPORT_SYMBOL(d_splice_alias); | ||
2343 | EXPORT_SYMBOL(d_add_ci); | ||
2344 | EXPORT_SYMBOL(d_validate); | ||
2345 | EXPORT_SYMBOL(dget_locked); | ||
2346 | EXPORT_SYMBOL(dput); | ||
2347 | EXPORT_SYMBOL(find_inode_number); | ||
2348 | EXPORT_SYMBOL(have_submounts); | ||
2349 | EXPORT_SYMBOL(names_cachep); | ||
2350 | EXPORT_SYMBOL(shrink_dcache_parent); | ||
2351 | EXPORT_SYMBOL(shrink_dcache_sb); | ||