Skip to content

Commit

Permalink
Fix the race between capifs remount and node creation
Browse files Browse the repository at this point in the history
we don't want to deal with half-updated config

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
  • Loading branch information
Al Viro committed May 9, 2009
1 parent 2a32ceb commit b0c4f32
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions drivers/isdn/capi/capifs.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,14 +75,17 @@ static int capifs_remount(struct super_block *s, int *flags, char *data)
}
}

replace_mount_options(s, new_opt);
mutex_lock(&s->s_root->d_inode->i_mutex);

replace_mount_options(s, new_opt);
config.setuid = setuid;
config.setgid = setgid;
config.uid = uid;
config.gid = gid;
config.mode = mode;

mutex_unlock(&s->s_root->d_inode->i_mutex);

return 0;
}

Expand Down Expand Up @@ -153,13 +156,16 @@ void capifs_new_ncci(unsigned int number, dev_t device)
if (!inode)
return;
inode->i_ino = number+2;

dentry = get_node(number);

/* config contents is protected by root's i_mutex */
inode->i_uid = config.setuid ? config.uid : current_fsuid();
inode->i_gid = config.setgid ? config.gid : current_fsgid();
inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
init_special_inode(inode, S_IFCHR|config.mode, device);
//inode->i_op = &capifs_file_inode_operations;

dentry = get_node(number);
if (!IS_ERR(dentry) && !dentry->d_inode)
d_instantiate(dentry, inode);
mutex_unlock(&capifs_root->d_inode->i_mutex);
Expand Down

0 comments on commit b0c4f32

Please sign in to comment.