Sophie

Sophie

distrib > Mandriva > 9.0 > i586 > by-pkgid > 98e91bc877e03cf3582cd163550eb7e3 > files > 589

kernel-doc-html-2.4.19-16mdk.i586.rpm

<!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"
>&#60;&#60;&#60; 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 &#62;&#62;&#62;</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"
>&#60;&#60;&#60; 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 &#62;&#62;&#62;</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
>