On Wed, Sep 28, 2011 at 11:11 AM, Michael Blizek < michi1@michaelblizek.twilightparadox.com> wrote:
Hi!
On 21:41 Tue 27 Sep , Venkatram Tummala wrote:
On Tue, Sep 27, 2011 at 9:19 PM, rohan puri <rohan.puri15@gmail.com> wrote: ...
in device_open() ->
if(var) return -EBUSY var++
&
in device_release() ->
var--
I think this should do the job.
This will prevent other processes to open the file until a process releases it. This is not what i need. Only the threads in a process shouldn't be able to open the file if it is already opened in the process. Other processes should be able to open it.
You could create something like this:
DEFINE_MUTEX(pidlist_lock); LIST_HEAD(pidlist);
struct pidlist_node{ struct list_head lh; pid_t pid; }
static struct pidlist_node *get_pin(void) { struct list_head *curr = pidlist.next; while (curr != pidlist) { struct struct pidlist_node *pin = container_of(curr, struct pidlist_node, lh); if (pin->pid == current->pid) {
Instead of pid check, AFAIK here tgid comparison should be done. Threads in a single process may have different pid but same tgid and we want to restrict access to only one thread in a single process. Right?
return pin; } } return 0; }
int open(void) { struct pidlist_node *pin;
mutex_lock(&pidlist_lock);
pin = get_pin(); if (pin != 0) { mutex_unlock(&pidlist_lock); return -EBUSY; }
pin = kmalloc(sizeof(struct pidlist_node), GFP_KERNEL); if (pin == 0) { mutex_unlock(&pidlist_lock); return -ENOMEM; }
pin->pid = current->pid; list_add(&(pin->lh), &pidlist);
mutex_unlock(&pidlist_lock); }
int close(void) { struct pidlist_node *pin;
mutex_lock(&pidlist_lock);
pin = get_pin(); if (pin != 0) { list_del(&(pin->lh)); kfree(pin); }
mutex_unlock(&pidlist_lock); }
-Michi -- programing a layer 3+4 network protocol for mesh networks see http://michaelblizek.twilightparadox.com