[Pvfs2-cvs] commit by slang in pvfs2/src/kernel/linux-2.6:
pvfs2-bufmap.c
CVS commit program
cvs at parl.clemson.edu
Thu Apr 3 12:58:46 EST 2008
Update of /projects/cvsroot/pvfs2/src/kernel/linux-2.6
In directory parlweb1:/tmp/cvs-serv10820/src/kernel/linux-2.6
Modified Files:
Tag: pvfs-2-7-branch
pvfs2-bufmap.c
Log Message:
merge bufmap fixes to 2.7 branch.
Index: pvfs2-bufmap.c
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/kernel/linux-2.6/pvfs2-bufmap.c,v
diff -p -u -r1.54.2.1 -r1.54.2.2
--- pvfs2-bufmap.c 20 Mar 2008 03:29:13 -0000 1.54.2.1
+++ pvfs2-bufmap.c 3 Apr 2008 17:58:46 -0000 1.54.2.2
@@ -24,6 +24,7 @@ inline int pvfs_bufmap_shift_query(void)
}
static int bufmap_init = 0;
+DECLARE_RWSEM(bufmap_init_sem);
static struct page **bufmap_page_array = NULL;
/* array to track usage of buffer descriptors */
@@ -108,6 +109,7 @@ int pvfs_bufmap_initialize(struct PVFS_d
"(ptr (%p) sz (%d) cnt(%d).\n",
user_desc->ptr, user_desc->size, user_desc->count);
+ down_write(&bufmap_init_sem);
if (bufmap_init == 1)
{
gossip_err("pvfs2: error: bufmap already initialized.\n");
@@ -171,13 +173,13 @@ int pvfs_bufmap_initialize(struct PVFS_d
}
/* map the pages */
- down_read(¤t->mm->mmap_sem);
+ down_write(¤t->mm->mmap_sem);
ret = get_user_pages(
current, current->mm, (unsigned long)user_desc->ptr,
bufmap_page_count, 1, 0, bufmap_page_array, NULL);
- up_read(¤t->mm->mmap_sem);
+ up_write(¤t->mm->mmap_sem);
if (ret < 0)
{
@@ -245,12 +247,14 @@ int pvfs_bufmap_initialize(struct PVFS_d
spin_unlock(&readdir_index_lock);
bufmap_init = 1;
+ up_write(&bufmap_init_sem);
gossip_debug(GOSSIP_BUFMAP_DEBUG, "pvfs2_bufmap_initialize: exiting normally\n");
return 0;
init_failure:
finalize_bufmap_descriptors();
+ up_write(&bufmap_init_sem);
return ret;
}
@@ -267,10 +271,12 @@ void pvfs_bufmap_finalize(void)
gossip_debug(GOSSIP_BUFMAP_DEBUG, "pvfs2_bufmap_finalize: called\n");
+ down_write(&bufmap_init_sem);
if (bufmap_init == 0)
{
gossip_debug(GOSSIP_BUFMAP_DEBUG, "pvfs2_bufmap_finalize: not yet "
"initialized; returning\n");
+ up_write(&bufmap_init_sem);
return;
}
@@ -284,6 +290,7 @@ void pvfs_bufmap_finalize(void)
bufmap_init = 0;
finalize_bufmap_descriptors();
+ up_write(&bufmap_init_sem);
gossip_debug(GOSSIP_BUFMAP_DEBUG, "pvfs2_bufmap_finalize: exiting normally\n");
}
@@ -378,12 +385,25 @@ static void put_back_slot(struct slot_ar
int pvfs_bufmap_get(int *buffer_index)
{
struct slot_args slargs;
+ int ret;
+
+ down_read(&bufmap_init_sem);
+ if (bufmap_init == 0)
+ {
+ gossip_err("pvfs_bufmap_get: not yet "
+ "initialized.\n");
+ gossip_err("pvfs2: please confirm that pvfs2-client daemon is running.\n");
+ up_read(&bufmap_init_sem);
+ return -EIO;
+ }
slargs.slot_count = pvfs2_bufmap_desc_count;
slargs.slot_array = buffer_index_array;
slargs.slot_lock = &buffer_index_lock;
slargs.slot_wq = &bufmap_waitq;
- return wait_for_a_slot(&slargs, buffer_index);
+ ret = wait_for_a_slot(&slargs, buffer_index);
+ up_read(&bufmap_init_sem);
+ return(ret);
}
/* pvfs_bufmap_put()
@@ -396,11 +416,22 @@ void pvfs_bufmap_put(int buffer_index)
{
struct slot_args slargs;
+ down_read(&bufmap_init_sem);
+ if (bufmap_init == 0)
+ {
+ gossip_err("pvfs_bufmap_put: not yet "
+ "initialized.\n");
+ gossip_err("pvfs2: please confirm that pvfs2-client daemon is running.\n");
+ up_read(&bufmap_init_sem);
+ return;
+ }
+
slargs.slot_count = pvfs2_bufmap_desc_count;
slargs.slot_array = buffer_index_array;
slargs.slot_lock = &buffer_index_lock;
slargs.slot_wq = &bufmap_waitq;
put_back_slot(&slargs, buffer_index);
+ up_read(&bufmap_init_sem);
return;
}
@@ -417,23 +448,48 @@ void pvfs_bufmap_put(int buffer_index)
int readdir_index_get(int *buffer_index)
{
struct slot_args slargs;
+ int ret;
+
+ down_read(&bufmap_init_sem);
+ if (bufmap_init == 0)
+ {
+ gossip_err("pvfs_bufmap_get: not yet "
+ "initialized.\n");
+ gossip_err("pvfs2: please confirm that pvfs2-client daemon is running.\n");
+ up_read(&bufmap_init_sem);
+ return -EIO;
+ }
slargs.slot_count = PVFS2_READDIR_DEFAULT_DESC_COUNT;
slargs.slot_array = readdir_index_array;
slargs.slot_lock = &readdir_index_lock;
slargs.slot_wq = &readdir_waitq;
- return wait_for_a_slot(&slargs, buffer_index);
+ ret = wait_for_a_slot(&slargs, buffer_index);
+ up_read(&bufmap_init_sem);
+ return(ret);
}
void readdir_index_put(int buffer_index)
{
struct slot_args slargs;
+ down_read(&bufmap_init_sem);
+ if (bufmap_init == 0)
+ {
+ gossip_err("pvfs_bufmap_get: not yet "
+ "initialized.\n");
+ gossip_err("pvfs2: please confirm that pvfs2-client daemon is running.\n");
+ up_read(&bufmap_init_sem);
+ return;
+ }
+
+
slargs.slot_count = PVFS2_READDIR_DEFAULT_DESC_COUNT;
slargs.slot_array = readdir_index_array;
slargs.slot_lock = &readdir_index_lock;
slargs.slot_wq = &readdir_waitq;
put_back_slot(&slargs, buffer_index);
+ up_read(&bufmap_init_sem);
return;
}
@@ -454,11 +510,13 @@ int pvfs_bufmap_copy_to_user(void __user
gossip_debug(GOSSIP_BUFMAP_DEBUG, "pvfs_bufmap_copy_to_user: to %p, from %p, index %d, "
"size %zd\n", to, from, buffer_index, size);
+ down_read(&bufmap_init_sem);
if (bufmap_init == 0)
{
gossip_err("pvfs_bufmap_copy_to_user: not yet "
"initialized.\n");
gossip_err("pvfs2: please confirm that pvfs2-client daemon is running.\n");
+ up_read(&bufmap_init_sem);
return -EIO;
}
@@ -475,6 +533,7 @@ int pvfs_bufmap_copy_to_user(void __user
if (ret)
{
gossip_debug(GOSSIP_BUFMAP_DEBUG, "Failed to copy data to user space %zd\n", ret);
+ up_read(&bufmap_init_sem);
return -EFAULT;
}
@@ -482,6 +541,7 @@ int pvfs_bufmap_copy_to_user(void __user
amt_copied += cur_copy_size;
index++;
}
+ up_read(&bufmap_init_sem);
return 0;
}
@@ -496,11 +556,13 @@ int pvfs_bufmap_copy_to_kernel(
gossip_debug(GOSSIP_BUFMAP_DEBUG, "pvfs_bufmap_copy_to_kernel: to %p, index %d, size %zd\n",
to, buffer_index, size);
+ down_read(&bufmap_init_sem);
if (bufmap_init == 0)
{
gossip_err("pvfs_bufmap_copy_to_kernel: not yet "
"initialized.\n");
gossip_err("pvfs2: please confirm that pvfs2-client daemon is running.\n");
+ up_read(&bufmap_init_sem);
return -EIO;
}
@@ -518,6 +580,7 @@ int pvfs_bufmap_copy_to_kernel(
amt_copied += cur_copy_size;
index++;
}
+ up_read(&bufmap_init_sem);
return 0;
}
@@ -541,11 +604,13 @@ int pvfs_bufmap_copy_from_user(
gossip_debug(GOSSIP_BUFMAP_DEBUG, "pvfs_bufmap_copy_from_user: from %p, index %d, "
"size %zd\n", from, buffer_index, size);
+ down_read(&bufmap_init_sem);
if (bufmap_init == 0)
{
gossip_err("pvfs_bufmap_copy_from_user: not yet "
"initialized.\n");
gossip_err("pvfs2: please confirm that pvfs2-client daemon is running.\n");
+ up_read(&bufmap_init_sem);
return -EIO;
}
@@ -569,6 +634,7 @@ int pvfs_bufmap_copy_from_user(
if (ret)
{
gossip_debug(GOSSIP_BUFMAP_DEBUG, "Failed to copy data from user space\n");
+ up_read(&bufmap_init_sem);
return -EFAULT;
}
@@ -576,6 +642,7 @@ int pvfs_bufmap_copy_from_user(
amt_copied += cur_copy_size;
index++;
}
+ up_read(&bufmap_init_sem);
return 0;
}
@@ -601,11 +668,13 @@ int pvfs_bufmap_copy_to_pages(int buffer
gossip_debug(GOSSIP_BUFMAP_DEBUG, "pvfs_bufmap_copy_to_pages: nr_pages %lu,"
"index %d, size %zd\n", nr_segs, buffer_index, size);
+ down_read(&bufmap_init_sem);
if (bufmap_init == 0)
{
gossip_err("pvfs_bufmap_copy_to_pages: not yet "
"initialized.\n");
gossip_err("pvfs2: please confirm that pvfs2-client is running.\n");
+ up_read(&bufmap_init_sem);
return -EIO;
}
@@ -615,12 +684,14 @@ int pvfs_bufmap_copy_to_pages(int buffer
{
gossip_err("pvfs_bufmap_copy_to_pages: count cannot exceed "
"number of pages(%lu)\n", nr_segs);
+ up_read(&bufmap_init_sem);
return -EIO;
}
page = (struct page *) vec[index].iov_base;
if (page == NULL) {
gossip_err("pvfs_bufmap_copy_to_pages: invalid page pointer %d\n",
index);
+ up_read(&bufmap_init_sem);
return -EIO;
}
amt_remaining = (size - amt_copied);
@@ -648,6 +719,7 @@ int pvfs_bufmap_copy_to_pages(int buffer
amt_copied += cur_copy_size;
index++;
}
+ up_read(&bufmap_init_sem);
return 0;
}
@@ -673,11 +745,13 @@ int pvfs_bufmap_copy_from_pages(int buff
gossip_debug(GOSSIP_BUFMAP_DEBUG, "pvfs_bufmap_copy_from_pages: nr_pages %lu "
"index %d, size %zd\n", nr_segs, buffer_index, size);
+ down_read(&bufmap_init_sem);
if (bufmap_init == 0)
{
gossip_err("pvfs_bufmap_copy_from_pages: not yet "
"initialized.\n");
gossip_err("pvfs2: please confirm that pvfs2-client is running.\n");
+ up_read(&bufmap_init_sem);
return -EIO;
}
@@ -686,11 +760,13 @@ int pvfs_bufmap_copy_from_pages(int buff
if (index >= nr_segs) {
gossip_err("pvfs_bufmap_copy_from_pages: count cannot exceed number of"
"pages(%lu)\n", nr_segs);
+ up_read(&bufmap_init_sem);
return -EIO;
}
page = (struct page *) vec[index].iov_base;
if (page == NULL) {
gossip_err("pvfs_bufmap_copy_from_pages: invalid page pointer\n");
+ up_read(&bufmap_init_sem);
return -EIO;
}
amt_remaining = (size - amt_copied);
@@ -711,6 +787,7 @@ int pvfs_bufmap_copy_from_pages(int buff
amt_copied += cur_copy_size;
index++;
}
+ up_read(&bufmap_init_sem);
return 0;
}
@@ -746,10 +823,12 @@ int pvfs_bufmap_copy_iovec_from_user(
gossip_debug(GOSSIP_BUFMAP_DEBUG, "pvfs_bufmap_copy_iovec_from_user: index %d, "
"size %zd\n", buffer_index, size);
+ down_read(&bufmap_init_sem);
if (bufmap_init == 0)
{
gossip_debug(GOSSIP_BUFMAP_DEBUG, "pvfs_bufmap_copy_iovec_from_user: not yet "
"initialized; returning\n");
+ up_read(&bufmap_init_sem);
return -EIO;
}
/*
@@ -760,6 +839,7 @@ int pvfs_bufmap_copy_iovec_from_user(
if (copied_iovec == NULL)
{
gossip_err("pvfs2_bufmap_copy_iovec_from_user: failed allocating memory\n");
+ up_read(&bufmap_init_sem);
return -ENOMEM;
}
memcpy(copied_iovec, iov, nr_segs * sizeof(struct iovec));
@@ -776,6 +856,7 @@ int pvfs_bufmap_copy_iovec_from_user(
gossip_err("pvfs2_bufmap_copy_iovec_from_user: computed total (%zd) is not equal to (%zd)\n",
amt_copied, size);
kfree(copied_iovec);
+ up_read(&bufmap_init_sem);
return -EINVAL;
}
@@ -832,6 +913,7 @@ int pvfs_bufmap_copy_iovec_from_user(
{
gossip_err("Failed to copy data from user space\n");
kfree(copied_iovec);
+ up_read(&bufmap_init_sem);
return -EFAULT;
}
@@ -845,6 +927,7 @@ int pvfs_bufmap_copy_iovec_from_user(
}
}
kfree(copied_iovec);
+ up_read(&bufmap_init_sem);
return 0;
}
@@ -877,10 +960,12 @@ int pvfs_bufmap_copy_iovec_from_kernel(
gossip_debug(GOSSIP_BUFMAP_DEBUG, "pvfs_bufmap_copy_iovec_from_kernel: index %d, "
"size %zd\n", buffer_index, size);
+ down_read(&bufmap_init_sem);
if (bufmap_init == 0)
{
gossip_debug(GOSSIP_BUFMAP_DEBUG, "pvfs_bufmap_copy_iovec_from_kernel: not yet "
"initialized; returning\n");
+ up_read(&bufmap_init_sem);
return -EIO;
}
/*
@@ -891,6 +976,7 @@ int pvfs_bufmap_copy_iovec_from_kernel(
if (copied_iovec == NULL)
{
gossip_err("pvfs2_bufmap_copy_iovec_from_kernel: failed allocating memory\n");
+ up_read(&bufmap_init_sem);
return -ENOMEM;
}
memcpy(copied_iovec, iov, nr_segs * sizeof(struct iovec));
@@ -907,6 +993,7 @@ int pvfs_bufmap_copy_iovec_from_kernel(
gossip_err("pvfs2_bufmap_copy_iovec_from_kernel: computed total (%zd) is not equal to (%zd)\n",
amt_copied, size);
kfree(copied_iovec);
+ up_read(&bufmap_init_sem);
return -EINVAL;
}
@@ -961,6 +1048,7 @@ int pvfs_bufmap_copy_iovec_from_kernel(
}
}
kfree(copied_iovec);
+ up_read(&bufmap_init_sem);
return 0;
}
@@ -991,10 +1079,12 @@ int pvfs_bufmap_copy_to_user_iovec(
gossip_debug(GOSSIP_BUFMAP_DEBUG, "pvfs_bufmap_copy_to_user_iovec: index %d, "
"size %zd\n", buffer_index, size);
+ down_read(&bufmap_init_sem);
if (bufmap_init == 0)
{
gossip_debug(GOSSIP_BUFMAP_DEBUG, "pvfs2_bufmap_copy_to_user_iovec: not yet "
"initialized; returning\n");
+ up_read(&bufmap_init_sem);
return -EIO;
}
/*
@@ -1005,6 +1095,7 @@ int pvfs_bufmap_copy_to_user_iovec(
if (copied_iovec == NULL)
{
gossip_err("pvfs2_bufmap_copy_to_user_iovec: failed allocating memory\n");
+ up_read(&bufmap_init_sem);
return -ENOMEM;
}
memcpy(copied_iovec, iov, nr_segs * sizeof(struct iovec));
@@ -1021,6 +1112,7 @@ int pvfs_bufmap_copy_to_user_iovec(
gossip_err("pvfs2_bufmap_copy_to_user_iovec: computed total (%zd) is less than (%zd)\n",
amt_copied, size);
kfree(copied_iovec);
+ up_read(&bufmap_init_sem);
return -EINVAL;
}
@@ -1076,6 +1168,7 @@ int pvfs_bufmap_copy_to_user_iovec(
{
gossip_err("Failed to copy data to user space\n");
kfree(copied_iovec);
+ up_read(&bufmap_init_sem);
return -EFAULT;
}
@@ -1089,6 +1182,7 @@ int pvfs_bufmap_copy_to_user_iovec(
}
}
kfree(copied_iovec);
+ up_read(&bufmap_init_sem);
return 0;
}
@@ -1117,10 +1211,12 @@ int pvfs_bufmap_copy_to_kernel_iovec(
gossip_debug(GOSSIP_BUFMAP_DEBUG, "pvfs_bufmap_copy_to_kernel_iovec: index %d, "
"size %zd\n", buffer_index, size);
+ down_read(&bufmap_init_sem);
if (bufmap_init == 0)
{
gossip_debug(GOSSIP_BUFMAP_DEBUG, "pvfs2_bufmap_copy_to_kernel_iovec: not yet "
"initialized; returning\n");
+ up_read(&bufmap_init_sem);
return -EIO;
}
/*
@@ -1131,6 +1227,7 @@ int pvfs_bufmap_copy_to_kernel_iovec(
if (copied_iovec == NULL)
{
gossip_err("pvfs2_bufmap_copy_to_kernel_iovec: failed allocating memory\n");
+ up_read(&bufmap_init_sem);
return -ENOMEM;
}
memcpy(copied_iovec, iov, nr_segs * sizeof(struct iovec));
@@ -1147,6 +1244,7 @@ int pvfs_bufmap_copy_to_kernel_iovec(
gossip_err("pvfs2_bufmap_copy_to_kernel_iovec: computed total (%zd) is less than (%zd)\n",
amt_copied, size);
kfree(copied_iovec);
+ up_read(&bufmap_init_sem);
return -EINVAL;
}
@@ -1202,6 +1300,7 @@ int pvfs_bufmap_copy_to_kernel_iovec(
}
}
kfree(copied_iovec);
+ up_read(&bufmap_init_sem);
return 0;
}
@@ -1242,17 +1341,20 @@ size_t pvfs_bufmap_copy_to_user_task(
" PID: %d, to %p, from %p, index %d, "
" size %zd\n", tsk->pid, to, from, buffer_index, size);
+ down_read(&bufmap_init_sem);
if (bufmap_init == 0)
{
gossip_err("pvfs2_bufmap_copy_to_user: not yet "
"initialized.\n");
gossip_err("pvfs2: please confirm that pvfs2-client "
"daemon is running.\n");
+ up_read(&bufmap_init_sem);
return -EIO;
}
mm = get_task_mm(tsk);
if (!mm)
{
+ up_read(&bufmap_init_sem);
return -EIO;
}
/*
@@ -1317,6 +1419,7 @@ size_t pvfs_bufmap_copy_to_user_task(
}
up_read(&mm->mmap_sem);
mmput(mm);
+ up_read(&bufmap_init_sem);
return (amt_copied < size) ? -EFAULT: amt_copied;
}
More information about the Pvfs2-cvs
mailing list