procfs: delay ack until get_procfs_entry() ends

This commit avoids the problem that causes get_procfs_entry() to create
entries which have same name.  See get_procfs_entry().
This commit is contained in:
NAKAMURA Gou
2014-10-09 18:47:13 +09:00
parent 7fcd36fbd3
commit 2e5874880a

View File

@ -68,6 +68,15 @@ static ihk_spinlock_t procfs_file_list_lock;
* We create a procfs entry if there is not already one.
* This process is recursive to the root of the procfs tree.
*/
/*
* XXX: Two or more entries which have same name can be created.
*
* get_procfs_entry() avoids creating an entry which has already been created.
* But, it allows creating an entry which is being created by another thread.
*
* This problem occurred when two requests which created files with a common
* ancestor directory which was not explicitly created were racing.
*/
static struct proc_dir_entry *get_procfs_entry(char *p, int osnum, int mode)
{
@ -169,10 +178,6 @@ void procfs_create(void *__os, int ref, int osnum, int pid, unsigned long arg)
strncpy(name, f->fname, PROCFS_NAME_MAX);
mode = f->mode;
f->status = 1; /* Now the peer can free the data. */
ihk_device_unmap_virtual(dev, f, sizeof(struct procfs_file));
ihk_device_unmap_memory(dev, parg, sizeof(struct procfs_file));
if (name[PROCFS_NAME_MAX - 1] != '\0') {
printk("ERROR: procfs_creat: file name not properly terminated.\n");
@ -191,6 +196,9 @@ void procfs_create(void *__os, int ref, int osnum, int pid, unsigned long arg)
entry->read_proc = mckernel_procfs_read;
quit:
f->status = 1; /* Now the peer can free the data. */
ihk_device_unmap_virtual(dev, f, sizeof(struct procfs_file));
ihk_device_unmap_memory(dev, parg, sizeof(struct procfs_file));
dprintk("procfs_create: done\n");
}