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); | ||
