]> err.no Git - linux-2.6/blobdiff - drivers/usb/core/inode.c
Merge branches 'release', 'asus', 'sony-laptop' and 'thinkpad' into release
[linux-2.6] / drivers / usb / core / inode.c
index b5d6a79af0be3473b94e23dd73c6340e7db650ee..83a373e9cc3624c66f09bac2c5383221e0eef8d2 100644 (file)
 #include <linux/usb.h>
 #include <linux/namei.h>
 #include <linux/usbdevice_fs.h>
-#include <linux/smp_lock.h>
 #include <linux/parser.h>
 #include <linux/notifier.h>
+#include <linux/seq_file.h>
 #include <asm/byteorder.h>
 #include "usb.h"
 #include "hcd.h"
 
+#define USBFS_DEFAULT_DEVMODE (S_IWUSR | S_IRUGO)
+#define USBFS_DEFAULT_BUSMODE (S_IXUGO | S_IRUGO)
+#define USBFS_DEFAULT_LISTMODE S_IRUGO
+
 static struct super_operations usbfs_ops;
 static const struct file_operations default_file_operations;
 static struct vfsmount *usbfs_mount;
@@ -58,9 +62,33 @@ static uid_t listuid;        /* = 0 */
 static gid_t devgid;   /* = 0 */
 static gid_t busgid;   /* = 0 */
 static gid_t listgid;  /* = 0 */
-static umode_t devmode = S_IWUSR | S_IRUGO;
-static umode_t busmode = S_IXUGO | S_IRUGO;
-static umode_t listmode = S_IRUGO;
+static umode_t devmode = USBFS_DEFAULT_DEVMODE;
+static umode_t busmode = USBFS_DEFAULT_BUSMODE;
+static umode_t listmode = USBFS_DEFAULT_LISTMODE;
+
+static int usbfs_show_options(struct seq_file *seq, struct vfsmount *mnt)
+{
+       if (devuid != 0)
+               seq_printf(seq, ",devuid=%u", devuid);
+       if (devgid != 0)
+               seq_printf(seq, ",devgid=%u", devgid);
+       if (devmode != USBFS_DEFAULT_DEVMODE)
+               seq_printf(seq, ",devmode=%o", devmode);
+       if (busuid != 0)
+               seq_printf(seq, ",busuid=%u", busuid);
+       if (busgid != 0)
+               seq_printf(seq, ",busgid=%u", busgid);
+       if (busmode != USBFS_DEFAULT_BUSMODE)
+               seq_printf(seq, ",busmode=%o", busmode);
+       if (listuid != 0)
+               seq_printf(seq, ",listuid=%u", listuid);
+       if (listgid != 0)
+               seq_printf(seq, ",listgid=%u", listgid);
+       if (listmode != USBFS_DEFAULT_LISTMODE)
+               seq_printf(seq, ",listmode=%o", listmode);
+
+       return 0;
+}
 
 enum {
        Opt_devuid, Opt_devgid, Opt_devmode,
@@ -94,9 +122,9 @@ static int parse_options(struct super_block *s, char *data)
        devgid = 0;
        busgid = 0;
        listgid = 0;
-       devmode = S_IWUSR | S_IRUGO;
-       busmode = S_IXUGO | S_IRUGO;
-       listmode = S_IRUGO;
+       devmode = USBFS_DEFAULT_DEVMODE;
+       busmode = USBFS_DEFAULT_BUSMODE;
+       listmode = USBFS_DEFAULT_LISTMODE;
 
        while ((p = strsep(&data, ",")) != NULL) {
                substring_t args[MAX_OPT_ARGS];
@@ -379,7 +407,7 @@ static loff_t default_file_lseek (struct file *file, loff_t offset, int orig)
 {
        loff_t retval = -EINVAL;
 
-       mutex_lock(&file->f_dentry->d_inode->i_mutex);
+       mutex_lock(&file->f_path.dentry->d_inode->i_mutex);
        switch(orig) {
        case 0:
                if (offset > 0) {
@@ -396,7 +424,7 @@ static loff_t default_file_lseek (struct file *file, loff_t offset, int orig)
        default:
                break;
        }
-       mutex_unlock(&file->f_dentry->d_inode->i_mutex);
+       mutex_unlock(&file->f_path.dentry->d_inode->i_mutex);
        return retval;
 }
 
@@ -419,6 +447,7 @@ static struct super_operations usbfs_ops = {
        .statfs =       simple_statfs,
        .drop_inode =   generic_delete_inode,
        .remount_fs =   remount,
+       .show_options = usbfs_show_options,
 };
 
 static int usbfs_fill_super(struct super_block *sb, void *data, int silent)
@@ -662,7 +691,7 @@ static void usbfs_add_device(struct usb_device *dev)
        sprintf (name, "%03d", dev->devnum);
        dev->usbfs_dentry = fs_create_file (name, devmode | S_IFREG,
                                            dev->bus->usbfs_dentry, dev,
-                                           &usbfs_device_file_operations,
+                                           &usbdev_file_operations,
                                            devuid, devgid);
        if (dev->usbfs_dentry == NULL) {
                err ("error creating usbfs device entry");