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