]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - fs/fs_struct.c
fs: scale mntget/mntput
[mirror_ubuntu-artful-kernel.git] / fs / fs_struct.c
index 60b8531f41c52c73be80f26931eb62feb6bc812f..68ca487bedb18e4d39b756659e6be33e6e633451 100644 (file)
@@ -17,11 +17,11 @@ void set_fs_root(struct fs_struct *fs, struct path *path)
        write_seqcount_begin(&fs->seq);
        old_root = fs->root;
        fs->root = *path;
-       path_get(path);
+       path_get_long(path);
        write_seqcount_end(&fs->seq);
        spin_unlock(&fs->lock);
        if (old_root.dentry)
-               path_put(&old_root);
+               path_put_long(&old_root);
 }
 
 /*
@@ -36,12 +36,12 @@ void set_fs_pwd(struct fs_struct *fs, struct path *path)
        write_seqcount_begin(&fs->seq);
        old_pwd = fs->pwd;
        fs->pwd = *path;
-       path_get(path);
+       path_get_long(path);
        write_seqcount_end(&fs->seq);
        spin_unlock(&fs->lock);
 
        if (old_pwd.dentry)
-               path_put(&old_pwd);
+               path_put_long(&old_pwd);
 }
 
 void chroot_fs_refs(struct path *old_root, struct path *new_root)
@@ -59,13 +59,13 @@ void chroot_fs_refs(struct path *old_root, struct path *new_root)
                        write_seqcount_begin(&fs->seq);
                        if (fs->root.dentry == old_root->dentry
                            && fs->root.mnt == old_root->mnt) {
-                               path_get(new_root);
+                               path_get_long(new_root);
                                fs->root = *new_root;
                                count++;
                        }
                        if (fs->pwd.dentry == old_root->dentry
                            && fs->pwd.mnt == old_root->mnt) {
-                               path_get(new_root);
+                               path_get_long(new_root);
                                fs->pwd = *new_root;
                                count++;
                        }
@@ -76,13 +76,13 @@ void chroot_fs_refs(struct path *old_root, struct path *new_root)
        } while_each_thread(g, p);
        read_unlock(&tasklist_lock);
        while (count--)
-               path_put(old_root);
+               path_put_long(old_root);
 }
 
 void free_fs_struct(struct fs_struct *fs)
 {
-       path_put(&fs->root);
-       path_put(&fs->pwd);
+       path_put_long(&fs->root);
+       path_put_long(&fs->pwd);
        kmem_cache_free(fs_cachep, fs);
 }
 
@@ -115,7 +115,13 @@ struct fs_struct *copy_fs_struct(struct fs_struct *old)
                spin_lock_init(&fs->lock);
                seqcount_init(&fs->seq);
                fs->umask = old->umask;
-               get_fs_root_and_pwd(old, &fs->root, &fs->pwd);
+
+               spin_lock(&old->lock);
+               fs->root = old->root;
+               path_get_long(&fs->root);
+               fs->pwd = old->pwd;
+               path_get_long(&fs->pwd);
+               spin_unlock(&old->lock);
        }
        return fs;
 }