From: Shaozhi Shawn Ye Date: Wed, 10 Sep 2008 07:02:51 +0000 (+0200) Subject: smalloc: Remove read/write lock race condition which will result in segmentation... X-Git-Tag: fio-1.22-rc1~6 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=d1271dc19c335c39298e16b825f84fdd8650132e;ds=sidebyside smalloc: Remove read/write lock race condition which will result in segmentation fault Signed-off-by: Jens Axboe --- diff --git a/smalloc.c b/smalloc.c index 1c975df4..7f3c10b1 100644 --- a/smalloc.c +++ b/smalloc.c @@ -226,9 +226,7 @@ static int add_pool(struct pool *pool, unsigned int alloc_size) pool->fd = fd; - global_write_lock(); nr_pools++; - global_write_unlock(); return 0; out_unlink: fprintf(stderr, "smalloc: failed adding pool\n"); @@ -442,7 +440,7 @@ void *smalloc(unsigned int size) { unsigned int i; - global_read_lock(); + global_write_lock(); i = last_pool; do { @@ -451,7 +449,7 @@ void *smalloc(unsigned int size) if (ptr) { last_pool = i; - global_read_unlock(); + global_write_unlock(); return ptr; } } @@ -464,15 +462,13 @@ void *smalloc(unsigned int size) break; else { i = nr_pools; - global_read_unlock(); if (add_pool(&mp[nr_pools], size)) goto out; - global_read_lock(); } } while (1); - global_read_unlock(); out: + global_write_unlock(); return NULL; }