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:
@@ -68,6 +68,15 @@ static ihk_spinlock_t procfs_file_list_lock;
|
|||||||
* We create a procfs entry if there is not already one.
|
* We create a procfs entry if there is not already one.
|
||||||
* This process is recursive to the root of the procfs tree.
|
* 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)
|
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);
|
strncpy(name, f->fname, PROCFS_NAME_MAX);
|
||||||
mode = f->mode;
|
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') {
|
if (name[PROCFS_NAME_MAX - 1] != '\0') {
|
||||||
printk("ERROR: procfs_creat: file name not properly terminated.\n");
|
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;
|
entry->read_proc = mckernel_procfs_read;
|
||||||
quit:
|
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");
|
dprintk("procfs_create: done\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user