Re: [PATCH] Add MOUNT_STATUS ioctl to cdrom device

Samphan Raruenrom
2003-08-26T06:52:31Z

Christoph Hellwig wrote:
>>+ case CDROM_MOUNT_STATUS: {
>>+ struct super_block *sb = get_super(dev);
>>+ if (sb == NULL) return -EINVAL;
>>+ down_read(&current->namespace->sem);
>>+ struct vfsmount *mnt = NULL;
>>+ struct list_head *p;
>>+ list_for_each(p, &current->namespace->list) {
>>+ struct vfsmount *m = list_entry(p, struct vfsmount, mnt_list);
>>+ if (sb == m->mnt_sb) {
>>+ mnt = m; break;
>>+ }
>>+ }
>>+ up_read(&current->namespace->sem);
>>+ drop_super(sb);
>>+ int mstat = 0; /* 0 not mounted, 1 umount ok, 2 umount EBUSY */
>>+ if (mnt) mstat = 1 + (atomic_read(&mnt->mnt_count) > 1);
>>+ cdinfo(CD_DO_IOCTL, "mount status(%s) = %d\n", mnt->mnt_devname, mstat);
>>+ return mstat;
> WTF? This is not only a layering violation but also totally racy.

I'm sorry for issueing this layering violation. I read a guideline that
it's easier to submit a patch to add device driver ioctl than inventing
something new. It really doesn't belong here.
Could you guide me where else can I place this functionality?

(my random idea)
- fcntl(open("/dev/cdrom", F_MNTSTAT)
- umount2("/dev/cdrom", MS_TEST) // not actually perform
- new system call! e.g. mntstat(open("/dev/cdrom"))

--
Samphan Raruenrom,
The Open Source Project,
National Electronics and Computer Technology Center,
National Science and Technology Development Agency,
Thailand.