*/
#include <linux/module.h>
-#include <linux/mutex.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/slab.h>
struct dentry *idmap_dentry;
wait_queue_head_t idmap_wq;
struct idmap_msg idmap_im;
- struct mutex idmap_lock; /* Serializes upcalls */
- struct mutex idmap_im_lock; /* Protects the hashtable */
+ struct semaphore idmap_lock; /* Serializes upcalls */
+ struct semaphore idmap_im_lock; /* Protects the hashtable */
struct idmap_hashtable idmap_user_hash;
struct idmap_hashtable idmap_group_hash;
};
if (clp->cl_idmap != NULL)
return;
- if ((idmap = kzalloc(sizeof(*idmap), GFP_KERNEL)) == NULL)
+ if ((idmap = kmalloc(sizeof(*idmap), GFP_KERNEL)) == NULL)
return;
+ memset(idmap, 0, sizeof(*idmap));
+
snprintf(idmap->idmap_path, sizeof(idmap->idmap_path),
"%s/idmap", clp->cl_rpcclient->cl_pathname);
return;
}
- mutex_init(&idmap->idmap_lock);
- mutex_init(&idmap->idmap_im_lock);
+ init_MUTEX(&idmap->idmap_lock);
+ init_MUTEX(&idmap->idmap_im_lock);
init_waitqueue_head(&idmap->idmap_wq);
idmap->idmap_user_hash.h_type = IDMAP_TYPE_USER;
idmap->idmap_group_hash.h_type = IDMAP_TYPE_GROUP;
if (!idmap)
return;
- dput(idmap->idmap_dentry);
- idmap->idmap_dentry = NULL;
rpc_unlink(idmap->idmap_path);
clp->cl_idmap = NULL;
kfree(idmap);
if (namelen >= IDMAP_NAMESZ)
return -EINVAL;
- mutex_lock(&idmap->idmap_lock);
- mutex_lock(&idmap->idmap_im_lock);
+ down(&idmap->idmap_lock);
+ down(&idmap->idmap_im_lock);
he = idmap_lookup_name(h, name, namelen);
if (he != NULL) {
}
set_current_state(TASK_UNINTERRUPTIBLE);
- mutex_unlock(&idmap->idmap_im_lock);
+ up(&idmap->idmap_im_lock);
schedule();
current->state = TASK_RUNNING;
remove_wait_queue(&idmap->idmap_wq, &wq);
- mutex_lock(&idmap->idmap_im_lock);
+ down(&idmap->idmap_im_lock);
if (im->im_status & IDMAP_STATUS_SUCCESS) {
*id = im->im_id;
out:
memset(im, 0, sizeof(*im));
- mutex_unlock(&idmap->idmap_im_lock);
- mutex_unlock(&idmap->idmap_lock);
+ up(&idmap->idmap_im_lock);
+ up(&idmap->idmap_lock);
return (ret);
}
im = &idmap->idmap_im;
- mutex_lock(&idmap->idmap_lock);
- mutex_lock(&idmap->idmap_im_lock);
+ down(&idmap->idmap_lock);
+ down(&idmap->idmap_im_lock);
he = idmap_lookup_id(h, id);
if (he != 0) {
}
set_current_state(TASK_UNINTERRUPTIBLE);
- mutex_unlock(&idmap->idmap_im_lock);
+ up(&idmap->idmap_im_lock);
schedule();
current->state = TASK_RUNNING;
remove_wait_queue(&idmap->idmap_wq, &wq);
- mutex_lock(&idmap->idmap_im_lock);
+ down(&idmap->idmap_im_lock);
if (im->im_status & IDMAP_STATUS_SUCCESS) {
if ((len = strnlen(im->im_name, IDMAP_NAMESZ)) == 0)
out:
memset(im, 0, sizeof(*im));
- mutex_unlock(&idmap->idmap_im_lock);
- mutex_unlock(&idmap->idmap_lock);
+ up(&idmap->idmap_im_lock);
+ up(&idmap->idmap_lock);
return ret;
}
if (copy_from_user(&im_in, src, mlen) != 0)
return (-EFAULT);
- mutex_lock(&idmap->idmap_im_lock);
+ down(&idmap->idmap_im_lock);
ret = mlen;
im->im_status = im_in.im_status;
idmap_update_entry(he, im_in.im_name, namelen_in, im_in.im_id);
ret = mlen;
out:
- mutex_unlock(&idmap->idmap_im_lock);
+ up(&idmap->idmap_im_lock);
return ret;
}
if (msg->errno >= 0)
return;
- mutex_lock(&idmap->idmap_im_lock);
+ down(&idmap->idmap_im_lock);
im->im_status = IDMAP_STATUS_LOOKUPFAIL;
wake_up(&idmap->idmap_wq);
- mutex_unlock(&idmap->idmap_im_lock);
+ up(&idmap->idmap_im_lock);
}
/*