diff options
Diffstat (limited to 'fs/fs_struct.c')
| -rw-r--r-- | fs/fs_struct.c | 26 | 
1 files changed, 16 insertions, 10 deletions
diff --git a/fs/fs_struct.c b/fs/fs_struct.c index 60b8531f41c..68ca487bedb 100644 --- a/fs/fs_struct.c +++ b/fs/fs_struct.c @@ -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;  }  |