public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] Add MOUNT_STATUS ioctl to cdrom device
@ 2003-08-25 18:22 Samphan Raruenrom
  2003-08-25 18:50 ` Christoph Hellwig
  2003-08-25 20:03 ` viro
  0 siblings, 2 replies; 15+ messages in thread
From: Samphan Raruenrom @ 2003-08-25 18:22 UTC (permalink / raw)
  To: Jens Axboe; +Cc: linux-kernel, Linux TLE Team, Marcelo Tosatti

Hi,

This patch add a new ioctl MOUNT_STATUS to the 2.4 kernel's cdrom
device. It'll be used as an API to query the mount status of a
cdrom :-

CDROM_MOUNT_STATUS
Return :-
0 = not mount.
1 = mounted, but not in-use. It is ok to umount.
2 = busy. Umount will result in getting EBUSY.
<0 = error.

This same functionality can be done in user-space, like the way
'fuser' do, but doing so in kernel-space is simpler and faster.
The ioctl can (will) be used by automount daemon to query the
device to see if it is in use or not and lock/unlock the drive
as needed. This will make the cdrom "eject" button work as it
should be (as auto-umount button). Novice GUI users usually wonder
why they can't eject cds even when the discs are not in use.

An experimental implementation has been done and working on my machine.
I'm completely new to kernel hacking so please make comments about
this patch and whether it's justified or plain stupid to add another
ioctl for this feature cause I really have no idea.



diff -dur linux-2.4.22-pre10.orig/drivers/cdrom/cdrom.c linux-2.4.22-pre10/drivers/cdrom/cdrom.c
--- linux-2.4.22-pre10.orig/drivers/cdrom/cdrom.c	2002-11-29 06:53:12.000000000 +0700
+++ linux-2.4.22-pre10/drivers/cdrom/cdrom.c	2003-08-26 00:10:22.000000000 +0700
@@ -264,6 +264,8 @@
  #include <linux/sysctl.h>
  #include <linux/proc_fs.h>
  #include <linux/init.h>
+#include <linux/namespace.h>
+#include <linux/mount.h>

  #include <asm/fcntl.h>
  #include <asm/segment.h>
@@ -1622,6 +1624,26 @@
  		return cdo->lock_door(cdi, arg);
  		}

+	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;
+		}
+	
  	case CDROM_DEBUG: {
  		if (!capable(CAP_SYS_ADMIN))
  			return -EACCES;
diff -dur linux-2.4.22-pre10.orig/include/linux/cdrom.h linux-2.4.22-pre10/include/linux/cdrom.h
--- linux-2.4.22-pre10.orig/include/linux/cdrom.h	2003-08-05 02:59:58.000000000 +0700
+++ linux-2.4.22-pre10/include/linux/cdrom.h	2003-08-13 21:41:27.000000000 +0700
@@ -127,6 +127,7 @@
  #define CDROM_LOCKDOOR		0x5329  /* lock or unlock door */
  #define CDROM_DEBUG		0x5330	/* Turn debug messages on/off */
  #define CDROM_GET_CAPABILITY	0x5331	/* get capabilities */
+#define CDROM_MOUNT_STATUS	0x5332	/* is it mounted? can umount? */

  /* Note that scsi/scsi_ioctl.h also uses 0x5382 - 0x5386.
   * Future CDROM ioctls should be kept below 0x537F


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




^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2003-08-26 15:45 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-08-25 18:22 [PATCH] Add MOUNT_STATUS ioctl to cdrom device Samphan Raruenrom
2003-08-25 18:50 ` Christoph Hellwig
2003-08-26  6:50   ` Samphan Raruenrom
2003-08-26  7:32     ` Christoph Hellwig
2003-08-26  9:09       ` Samphan Raruenrom
2003-08-26  9:56         ` Christoph Hellwig
2003-08-26  9:58           ` Jens Axboe
2003-08-26 11:30             ` [Rdi1] " Samphan Raruenrom
2003-08-26 11:36               ` Jens Axboe
2003-08-26 12:44                 ` Samphan Raruenrom
2003-08-26 14:16                   ` Jens Axboe
2003-08-26 13:58               ` Christoph Hellwig
2003-08-26 15:32                 ` Samphan Raruenrom
2003-08-26 15:45                   ` Jens Axboe
2003-08-25 20:03 ` viro

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox