net: usb: rmnet: Fix bug in handling removal of debugfs files

RmNet supports multiple driver instances. Every driver instance creates
a debugfs entry. Removal of same debugfs entry by every driver instance
during device disconnect causes crash. Fix the crash by making sure that
driver only removes the debugfs entry which was created by it.

Change-Id: I6bcd07f07f3faecffe7f4b908d751c769d830ad1
CRs-Fixed: 356385
Signed-off-by: Hemant Kumar <hemantk@codeaurora.org>
diff --git a/drivers/net/usb/rmnet_usb_data.c b/drivers/net/usb/rmnet_usb_data.c
index d4c2823..3352380 100644
--- a/drivers/net/usb/rmnet_usb_data.c
+++ b/drivers/net/usb/rmnet_usb_data.c
@@ -470,13 +470,12 @@
 	.release = single_release,
 };
 
-static struct dentry *rmnet_usb_data_dbg_root;
 static int rmnet_usb_data_debugfs_init(struct usbnet *unet)
 {
+	struct dentry *rmnet_usb_data_dbg_root;
 	struct dentry *rmnet_usb_data_dentry;
 
 	rmnet_usb_data_dbg_root = debugfs_create_dir(unet->net->name, NULL);
-
 	if (!rmnet_usb_data_dbg_root || IS_ERR(rmnet_usb_data_dbg_root))
 		return -ENODEV;
 
@@ -490,12 +489,17 @@
 		return -ENODEV;
 	}
 
+	unet->data[2] = (unsigned long)rmnet_usb_data_dbg_root;
+
 	return 0;
 }
 
-static void rmnet_usb_data_debugfs_cleanup(void)
+static void rmnet_usb_data_debugfs_cleanup(struct usbnet *unet)
 {
-	debugfs_remove_recursive(rmnet_usb_data_dbg_root);
+	struct dentry *root = (struct dentry *)unet->data[2];
+
+	debugfs_remove_recursive(root);
+	unet->data[2] = 0;
 }
 
 static int rmnet_usb_probe(struct usb_interface *iface,
@@ -570,14 +574,14 @@
 	udev = interface_to_usbdev(intf);
 	device_set_wakeup_enable(&udev->dev, 0);
 
-	rmnet_usb_data_debugfs_cleanup();
-
 	unet = usb_get_intfdata(intf);
 	if (!unet) {
 		dev_err(&udev->dev, "%s:data device not found\n", __func__);
 		return;
 	}
 
+	rmnet_usb_data_debugfs_cleanup(unet);
+
 	dev = (struct rmnet_ctrl_dev *)unet->data[1];
 	if (!dev) {
 		dev_err(&udev->dev, "%s:ctrl device not found\n", __func__);