<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <HTML ><HEAD ><TITLE > MOD_INC_USE_COUNT/MOD_DEC_USE_COUNT include/linux/module.h</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" TITLE="Unreliable Guide To Hacking The Linux Kernel" HREF="book1.html"><LINK REL="UP" TITLE="Common Routines" HREF="c141.html"><LINK REL="PREVIOUS" TITLE=" module_exit() include/linux/init.h " HREF="x305.html"><LINK REL="NEXT" TITLE="Wait Queues include/linux/wait.h " HREF="c325.html"></HEAD ><BODY CLASS="SECT1" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >Unreliable Guide To Hacking The Linux Kernel</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="x305.html" ACCESSKEY="P" ><<< Previous</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" >Common Routines</TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="c325.html" ACCESSKEY="N" >Next >>></A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="SECT1" ><H1 CLASS="SECT1" ><A NAME="ROUTINES-MODULE-USE-COUNTERS" ></A ><TT CLASS="FUNCTION" >MOD_INC_USE_COUNT</TT >/<TT CLASS="FUNCTION" >MOD_DEC_USE_COUNT</TT > <TT CLASS="FILENAME" >include/linux/module.h</TT ></H1 ><P > These manipulate the module usage count, to protect against removal (a module also can't be removed if another module uses one of its exported symbols: see below). Every reference to the module from user context should be reflected by this counter (e.g. for every data structure or socket) before the function sleeps. To quote Tim Waugh: </P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" WIDTH="100%" ><TR ><TD ><PRE CLASS="PROGRAMLISTING" >/* THIS IS BAD */ foo_open (...) { stuff.. if (fail) return -EBUSY; sleep.. (might get unloaded here) stuff.. MOD_INC_USE_COUNT; return 0; } /* THIS IS GOOD / foo_open (...) { MOD_INC_USE_COUNT; stuff.. if (fail) { MOD_DEC_USE_COUNT; return -EBUSY; } sleep.. (safe now) stuff.. return 0; } </PRE ></TD ></TR ></TABLE ><P > You can often avoid having to deal with these problems by using the <TT CLASS="STRUCTFIELD" ><I >owner</I ></TT > field of the <SPAN CLASS="STRUCTNAME" >file_operations</SPAN > structure. Set this field as the macro <SPAN CLASS="SYMBOL" >THIS_MODULE</SPAN >. </P ><P > For more complicated module unload locking requirements, you can set the <TT CLASS="STRUCTFIELD" ><I >can_unload</I ></TT > function pointer to your own routine, which should return <SPAN CLASS="RETURNVALUE" >0</SPAN > if the module is unloadable, or <SPAN CLASS="RETURNVALUE" >-EBUSY</SPAN > otherwise. </P ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="x305.html" ACCESSKEY="P" ><<< Previous</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="book1.html" ACCESSKEY="H" >Home</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="c325.html" ACCESSKEY="N" >Next >>></A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><TT CLASS="FUNCTION" >module_exit()</TT > <TT CLASS="FILENAME" >include/linux/init.h</TT ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="c141.html" ACCESSKEY="U" >Up</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >Wait Queues <TT CLASS="FILENAME" >include/linux/wait.h</TT ></TD ></TR ></TABLE ></DIV ></BODY ></HTML >