From: Michael Hunold <hunold@convergence.de>

unfortunately it's possible to remove a DVB adapter module even if a DVB
network device has been set up using this adapter.

The attached patch fixes this problem.


---

 25-akpm/drivers/media/dvb/dvb-core/dvb_net.c |   17 +++++++++++++++--
 1 files changed, 15 insertions(+), 2 deletions(-)

diff -puN drivers/media/dvb/dvb-core/dvb_net.c~dvbfix-adapter-module-removal-bug drivers/media/dvb/dvb-core/dvb_net.c
--- 25/drivers/media/dvb/dvb-core/dvb_net.c~dvbfix-adapter-module-removal-bug	Thu Apr 29 15:49:26 2004
+++ 25-akpm/drivers/media/dvb/dvb-core/dvb_net.c	Thu Apr 29 15:49:26 2004
@@ -1095,9 +1095,15 @@ static int dvb_net_do_ioctl(struct inode
 		
 		if (!capable(CAP_SYS_ADMIN))
 			return -EPERM;
+
+		if (!try_module_get(dvbdev->adapter->module))
+			return -EPERM;
+
 		result=dvb_net_add_if(dvbnet, dvbnetif->pid, dvbnetif->feedtype);
-		if (result<0)
+		if (result<0) {
+			module_put(dvbdev->adapter->module);
 			return result;
+		}
 		dvbnetif->if_num=result;
 		break;
 	}
@@ -1120,6 +1126,7 @@ static int dvb_net_do_ioctl(struct inode
 	case NET_REMOVE_IF:
 		if (!capable(CAP_SYS_ADMIN))
 			return -EPERM;
+		module_put(dvbdev->adapter->module);
 		return dvb_net_remove_if(dvbnet, (int) (long) parg);
 
 	/* binary compatiblity cruft */
@@ -1130,9 +1137,15 @@ static int dvb_net_do_ioctl(struct inode
 
 		if (!capable(CAP_SYS_ADMIN))
 			return -EPERM;
+
+		if (!try_module_get(dvbdev->adapter->module))
+			return -EPERM;
+
 		result=dvb_net_add_if(dvbnet, dvbnetif->pid, DVB_NET_FEEDTYPE_MPE);
-		if (result<0)
+		if (result<0) {
+			module_put(dvbdev->adapter->module);
 			return result;
+		}
 		dvbnetif->if_num=result;
 		break;
 	}

_