Re: namei() in sys_open() breaking umount?

From: Andreas Dilger (adilger@turbolinux.com)
Date: Fri Sep 29 2000 - 13:04:01 EST


Stefan writes:
> After modifying sys_open() by prepending a namei(filename),
> all devices mounted while the modified sys_open is in place,
> report an EBUSY when trying to umount them. Doesn't matter if sys_open
> has been restored to the original before umount.
>
> asmlinkage int my_sys_open(const char *filename, int flags, int mode)
> {
> struct dentry *d_entry=NULL;
>
> lock_kernel();
> d_entry=namei(filename);
> unlock_kernel();
> if (IS_ERR(d_entry))
> return orig_sys_open(filename, flags, mode);
>
> if (d_entry->d_inode)
- printk("<1> device=%d\n",MAJOR(d_entry->d_inode->i_dev));
+ printk(KERN_INFO "device=%s\n", kdevname(dentry->d_inode->i_dev));
>
+ dput(d_entry);
> return orig_sys_open(filename, flags, mode);
> }

> I would be very grateful if someone could point out to me where the
> problem is - and tell me how to solve it :-)

When you have a dentry reference, you need to free it via dput(), so that
the kernel knows the file is no longer in use. This is the same with
iget() and iput() - you always need to free your inode references.

Cheers, Andreas

-- 
Andreas Dilger  \ "If a man ate a pound of pasta and a pound of antipasto,
                 \  would they cancel out, leaving him still hungry?"
http://www-mddsp.enel.ucalgary.ca/People/adilger/               -- Dogbert
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sat Sep 30 2000 - 21:00:25 EST