Prevent a process from opening a file more than once
rohan puri
rohan.puri15 at gmail.com
Wed Sep 28 10:00:46 EDT 2011
On Wed, Sep 28, 2011 at 11:11 AM, Michael Blizek <
michi1 at 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 at 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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20110928/c4c207a9/attachment.html
More information about the Kernelnewbies
mailing list