|
@@ -464,20 +464,20 @@ static void free_vfsmnt(struct vfsmount *mnt)
|
|
|
* @dir. If @dir is set return the first mount else return the last mount.
|
|
|
* vfsmount_lock must be held for read or write.
|
|
|
*/
|
|
|
-struct vfsmount *__lookup_mnt(struct vfsmount *mnt, struct dentry *dentry,
|
|
|
+struct mount *__lookup_mnt(struct vfsmount *mnt, struct dentry *dentry,
|
|
|
int dir)
|
|
|
{
|
|
|
struct list_head *head = mount_hashtable + hash(mnt, dentry);
|
|
|
struct list_head *tmp = head;
|
|
|
- struct vfsmount *p, *found = NULL;
|
|
|
+ struct mount *p, *found = NULL;
|
|
|
|
|
|
for (;;) {
|
|
|
tmp = dir ? tmp->next : tmp->prev;
|
|
|
p = NULL;
|
|
|
if (tmp == head)
|
|
|
break;
|
|
|
- p = list_entry(tmp, struct vfsmount, mnt_hash);
|
|
|
- if (p->mnt_parent == mnt && p->mnt_mountpoint == dentry) {
|
|
|
+ p = list_entry(tmp, struct mount, mnt.mnt_hash);
|
|
|
+ if (p->mnt.mnt_parent == mnt && p->mnt.mnt_mountpoint == dentry) {
|
|
|
found = p;
|
|
|
break;
|
|
|
}
|
|
@@ -491,13 +491,18 @@ struct vfsmount *__lookup_mnt(struct vfsmount *mnt, struct dentry *dentry,
|
|
|
*/
|
|
|
struct vfsmount *lookup_mnt(struct path *path)
|
|
|
{
|
|
|
- struct vfsmount *child_mnt;
|
|
|
+ struct mount *child_mnt;
|
|
|
|
|
|
br_read_lock(vfsmount_lock);
|
|
|
- if ((child_mnt = __lookup_mnt(path->mnt, path->dentry, 1)))
|
|
|
- mntget(child_mnt);
|
|
|
- br_read_unlock(vfsmount_lock);
|
|
|
- return child_mnt;
|
|
|
+ child_mnt = __lookup_mnt(path->mnt, path->dentry, 1);
|
|
|
+ if (child_mnt) {
|
|
|
+ mnt_add_count(child_mnt, 1);
|
|
|
+ br_read_unlock(vfsmount_lock);
|
|
|
+ return &child_mnt->mnt;
|
|
|
+ } else {
|
|
|
+ br_read_unlock(vfsmount_lock);
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static inline int check_mnt(struct vfsmount *mnt)
|