int unshare_fs_struct(void)用于跟当前task的fs_struct设置新值,实现不共享copy
其源码分析如下:
int unshare_fs_struct(void)
{
struct fs_struct *fs = current->fs;
#申请新的fs_struct
struct fs_struct *new_fs = copy_fs_struct(fs);
int kill;
#新申请的fs_struct为null的话,则退出
if (!new_fs)
return -ENOMEM;
task_lock(current);
spin_lock(&fs->lock);
kill = !--fs->users;
#给当前task设置我们新申请的fs_struct
current->fs = new_fs;
spin_unlock(&fs->lock);
task_unlock(current);
if (kill)
free_fs_struct(fs);
return 0;
}
copy_fs_struct的实现如下:
struct fs_struct *copy_fs_struct(struct fs_struct *old)
{
#新申请fs_struct
struct fs_struct *fs = kmem_cache_alloc(fs_cachep, GFP_KERNEL);
/* We don't need to lock fs - think why ;-) */
#给新申请的fs_struct 赋初值
if (fs) {
fs->users = 1;
fs->in_exec = 0;
spin_lock_init(&fs->lock);
seqcount_init(&fs->seq);
fs->umask = old->umask;
spin_lock(&old->lock);
fs->root = old->root;
path_get(&fs->root);
fs->pwd = old->pwd;
path_get(&fs->pwd);
spin_unlock(&old->lock);
}
return fs;
}
内核文件系统API之unshare_fs_struct
最新推荐文章于 2024-12-19 18:00:09 发布