提交 2583e443 编写于 作者: H Harsh Prateek Bora 提交者: Aneesh Kumar K.V

hw/9pfs: Replace rwlocks with RCU variants of interfaces.

Use QLIST_INSERT_HEAD_RCU and rcu_read_lock/unlock instead of rwlocks.
Use v9fs_synth_mutex as a write-only mutex to handle concurrent writers.
Signed-off-by: NHarsh Prateek Bora <harsh@linux.vnet.ibm.com>
Signed-off-by: NAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
上级 5f7d05ec
...@@ -30,8 +30,7 @@ V9fsSynthNode v9fs_synth_root = { ...@@ -30,8 +30,7 @@ V9fsSynthNode v9fs_synth_root = {
.attr = &v9fs_synth_root.actual_attr, .attr = &v9fs_synth_root.actual_attr,
}; };
/*FIXME!! should be converted to qemu_rwlock_t */ static QemuMutex v9fs_synth_mutex;
static pthread_rwlock_t v9fs_synth_mutex;
static int v9fs_synth_node_count; static int v9fs_synth_node_count;
/* set to 1 when the synth fs is ready */ /* set to 1 when the synth fs is ready */
static int v9fs_synth_fs; static int v9fs_synth_fs;
...@@ -60,7 +59,7 @@ static V9fsSynthNode *v9fs_add_dir_node(V9fsSynthNode *parent, int mode, ...@@ -60,7 +59,7 @@ static V9fsSynthNode *v9fs_add_dir_node(V9fsSynthNode *parent, int mode,
} }
node->private = node; node->private = node;
strncpy(node->name, name, sizeof(node->name)); strncpy(node->name, name, sizeof(node->name));
QLIST_INSERT_HEAD(&parent->child, node, sibling); QLIST_INSERT_HEAD_RCU(&parent->child, node, sibling);
return node; return node;
} }
...@@ -79,7 +78,7 @@ int qemu_v9fs_synth_mkdir(V9fsSynthNode *parent, int mode, ...@@ -79,7 +78,7 @@ int qemu_v9fs_synth_mkdir(V9fsSynthNode *parent, int mode,
if (!parent) { if (!parent) {
parent = &v9fs_synth_root; parent = &v9fs_synth_root;
} }
pthread_rwlock_wrlock(&v9fs_synth_mutex); qemu_mutex_lock(&v9fs_synth_mutex);
QLIST_FOREACH(tmp, &parent->child, sibling) { QLIST_FOREACH(tmp, &parent->child, sibling) {
if (!strcmp(tmp->name, name)) { if (!strcmp(tmp->name, name)) {
ret = EEXIST; ret = EEXIST;
...@@ -95,7 +94,7 @@ int qemu_v9fs_synth_mkdir(V9fsSynthNode *parent, int mode, ...@@ -95,7 +94,7 @@ int qemu_v9fs_synth_mkdir(V9fsSynthNode *parent, int mode,
*result = node; *result = node;
ret = 0; ret = 0;
err_out: err_out:
pthread_rwlock_unlock(&v9fs_synth_mutex); qemu_mutex_unlock(&v9fs_synth_mutex);
return ret; return ret;
} }
...@@ -116,7 +115,7 @@ int qemu_v9fs_synth_add_file(V9fsSynthNode *parent, int mode, ...@@ -116,7 +115,7 @@ int qemu_v9fs_synth_add_file(V9fsSynthNode *parent, int mode,
parent = &v9fs_synth_root; parent = &v9fs_synth_root;
} }
pthread_rwlock_wrlock(&v9fs_synth_mutex); qemu_mutex_lock(&v9fs_synth_mutex);
QLIST_FOREACH(tmp, &parent->child, sibling) { QLIST_FOREACH(tmp, &parent->child, sibling) {
if (!strcmp(tmp->name, name)) { if (!strcmp(tmp->name, name)) {
ret = EEXIST; ret = EEXIST;
...@@ -134,10 +133,10 @@ int qemu_v9fs_synth_add_file(V9fsSynthNode *parent, int mode, ...@@ -134,10 +133,10 @@ int qemu_v9fs_synth_add_file(V9fsSynthNode *parent, int mode,
node->attr->mode = mode; node->attr->mode = mode;
node->private = arg; node->private = arg;
strncpy(node->name, name, sizeof(node->name)); strncpy(node->name, name, sizeof(node->name));
QLIST_INSERT_HEAD(&parent->child, node, sibling); QLIST_INSERT_HEAD_RCU(&parent->child, node, sibling);
ret = 0; ret = 0;
err_out: err_out:
pthread_rwlock_unlock(&v9fs_synth_mutex); qemu_mutex_unlock(&v9fs_synth_mutex);
return ret; return ret;
} }
...@@ -230,7 +229,7 @@ static int v9fs_synth_get_dentry(V9fsSynthNode *dir, struct dirent *entry, ...@@ -230,7 +229,7 @@ static int v9fs_synth_get_dentry(V9fsSynthNode *dir, struct dirent *entry,
int i = 0; int i = 0;
V9fsSynthNode *node; V9fsSynthNode *node;
pthread_rwlock_rdlock(&v9fs_synth_mutex); rcu_read_lock();
QLIST_FOREACH(node, &dir->child, sibling) { QLIST_FOREACH(node, &dir->child, sibling) {
/* This is the off child of the directory */ /* This is the off child of the directory */
if (i == off) { if (i == off) {
...@@ -238,7 +237,7 @@ static int v9fs_synth_get_dentry(V9fsSynthNode *dir, struct dirent *entry, ...@@ -238,7 +237,7 @@ static int v9fs_synth_get_dentry(V9fsSynthNode *dir, struct dirent *entry,
} }
i++; i++;
} }
pthread_rwlock_unlock(&v9fs_synth_mutex); rcu_read_unlock();
if (!node) { if (!node) {
/* end of directory */ /* end of directory */
*result = NULL; *result = NULL;
...@@ -483,13 +482,14 @@ static int v9fs_synth_name_to_path(FsContext *ctx, V9fsPath *dir_path, ...@@ -483,13 +482,14 @@ static int v9fs_synth_name_to_path(FsContext *ctx, V9fsPath *dir_path,
goto out; goto out;
} }
/* search for the name in the childern */ /* search for the name in the childern */
pthread_rwlock_rdlock(&v9fs_synth_mutex); rcu_read_lock();
QLIST_FOREACH(node, &dir_node->child, sibling) { QLIST_FOREACH(node, &dir_node->child, sibling) {
if (!strcmp(node->name, name)) { if (!strcmp(node->name, name)) {
break; break;
} }
} }
pthread_rwlock_unlock(&v9fs_synth_mutex); rcu_read_unlock();
if (!node) { if (!node) {
errno = ENOENT; errno = ENOENT;
return -1; return -1;
...@@ -519,11 +519,8 @@ static int v9fs_synth_unlinkat(FsContext *ctx, V9fsPath *dir, ...@@ -519,11 +519,8 @@ static int v9fs_synth_unlinkat(FsContext *ctx, V9fsPath *dir,
static int v9fs_synth_init(FsContext *ctx) static int v9fs_synth_init(FsContext *ctx)
{ {
pthread_rwlockattr_t rwlockattr;
QLIST_INIT(&v9fs_synth_root.child); QLIST_INIT(&v9fs_synth_root.child);
pthread_rwlockattr_init(&rwlockattr); qemu_mutex_init(&v9fs_synth_mutex);
pthread_rwlock_init(&v9fs_synth_mutex, &rwlockattr);
/* Add "." and ".." entries for root */ /* Add "." and ".." entries for root */
v9fs_add_dir_node(&v9fs_synth_root, v9fs_synth_root.attr->mode, v9fs_add_dir_node(&v9fs_synth_root, v9fs_synth_root.attr->mode,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册