Hi, this patch fixes usbfs.  You can't use a single mount_count for 2
different mounts.



--- usb-2.5/drivers/usb/core/inode.c    Fri Oct 11 16:52:49 2002
+++ linux/drivers/usb/core/inode.c      Fri Oct 11 15:54:47 2002
@@ -45,7 +45,8 @@
 static struct vfsmount *usbdevfs_mount;
 static struct vfsmount *usbfs_mount;
 static spinlock_t mount_lock = SPIN_LOCK_UNLOCKED;
-static int mount_count;        /* = 0 */
+static int usbdevfs_mount_count;       /* = 0 */
+static int usbfs_mount_count;  /* = 0 */

 static struct dentry *devices_usbdevfs_dentry;
 static struct dentry *devices_usbfs_dentry;
@@ -507,14 +508,14 @@
 };

 /* --------------------------------------------------------------------- */
-static int get_mount (struct file_system_type *fs_type, struct vfsmount **mount)
+static int get_mount (struct file_system_type *fs_type, struct vfsmount **mount, int 
+*mount_count)
 {
        struct vfsmount *mnt;

        spin_lock (&mount_lock);
        if (*mount) {
                mntget(*mount);
-               ++mount_count;
+               ++(*mount_count);
                spin_unlock (&mount_lock);
                goto go_ahead;
        }
@@ -528,33 +529,33 @@
        spin_lock (&mount_lock);
        if (!*mount) {
                *mount = mnt;
-               ++mount_count;
+               ++(*mount_count);
                spin_unlock (&mount_lock);
                goto go_ahead;
        }
        mntget(*mount);
-       ++mount_count;
+       ++(*mount_count);
        spin_unlock (&mount_lock);
        mntput(mnt);

 go_ahead:
-       dbg("mount_count = %d", mount_count);
+       dbg("mount_count = %d", *mount_count);
        return 0;
 }

-static void put_mount (struct vfsmount **mount)
+static void put_mount (struct vfsmount **mount, int *mount_count)
 {
        struct vfsmount *mnt;

        spin_lock (&mount_lock);
        mnt = *mount;
-       --mount_count;
-       if (!mount_count)
+       --(*mount_count);
+       if (!(*mount_count))
                *mount = NULL;

        spin_unlock (&mount_lock);
        mntput(mnt);
-       dbg("mount_count = %d", mount_count);
+       dbg("mount_count = %d", *mount_count);
 }

 static int create_special_files (void)
@@ -563,13 +564,13 @@
        int retval = 0;

        /* create the devices special file */
-       retval = get_mount (&usbdevice_fs_type, &usbdevfs_mount);
+       retval = get_mount (&usbdevice_fs_type, &usbdevfs_mount, 
+&usbdevfs_mount_count);
        if (retval) {
                err ("Unable to get usbdevfs mount");
                goto exit;
        }

-       retval = get_mount (&usb_fs_type, &usbfs_mount);
+       retval = get_mount (&usb_fs_type, &usbfs_mount, &usbfs_mount_count);
        if (retval) {
                err ("Unable to get usbfs mount");
                goto error_clean_usbdevfs_mount;
@@ -604,10 +605,10 @@
        devices_usbfs_dentry = NULL;

 error_clean_mounts:
-       put_mount (&usbfs_mount);
+       put_mount (&usbfs_mount, &usbfs_mount_count);

 error_clean_usbdevfs_mount:
-       put_mount (&usbdevfs_mount);
+       put_mount (&usbdevfs_mount, &usbdevfs_mount_count);

 exit:
        return retval;
@@ -621,8 +622,8 @@
                fs_remove_file (devices_usbfs_dentry);
        devices_usbdevfs_dentry = NULL;
        devices_usbfs_dentry = NULL;
-       put_mount (&usbdevfs_mount);
-       put_mount (&usbfs_mount);
+       put_mount (&usbdevfs_mount, &usbdevfs_mount_count);
+       put_mount (&usbfs_mount, &usbfs_mount_count);
 }

 void usbfs_update_special (void)




-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to