--- smartd.initd.in
+++ smartd.initd.in
@@ -137,7 +137,7 @@
 # SuSE
 elif [ -f /etc/SuSE-release ] ; then
     test -x $SMARTD_BIN || exit 5
-    
+
     # Existence of config file is optional
     SMARTD_CONFIG=/etc/smartd.conf
 
@@ -147,48 +147,61 @@
    # Shell functions sourced from /etc/rc.status:
    #      rc_check         check and set local and overall rc status
    #      rc_status        check and set local and overall rc status
-   #      rc_status -v     ditto but be verbose in local rc status
-   #      rc_status -v -r  ditto and clear the local rc status
+   #      rc_status -v     be verbose in local rc status and clear it afterwards
+   #      rc_status -v -r  ditto and clear both the local and overall rc status
+   #      rc_status -s     display "skipped" and exit with status 3
+   #      rc_status -u     display "unused" and exit with status 3
    #      rc_failed        set local and overall rc status to failed
-   #      rc_reset         clear local rc status (overall remains)
+   #      rc_failed <num>  set local and overall rc status to <num>
+   #      rc_reset         clear both the local and overall rc status
    #      rc_exit          exit appropriate to overall rc status
+   #      rc_active        checks whether a service is activated by symlinks
     . /etc/rc.status
-    
-   # First reset status of this service
+
+   # Reset status of this service
     rc_reset
-    
+
    # Return values acc. to LSB for all commands but status:
-   # 0 - success
-   # 1 - misc error
-   # 2 - invalid or excess args
-   # 3 - unimplemented feature (e.g. reload)
-   # 4 - insufficient privilege
-   # 5 - program not installed
-   # 6 - program not configured
+   # 0       - success
+   # 1       - generic or unspecified error
+   # 2       - invalid or excess argument(s)
+   # 3       - unimplemented feature (e.g. "reload")
+   # 4       - user had insufficient privileges
+   # 5       - program is not installed
+   # 6       - program is not configured
+   # 7       - program is not running
+   # 8--199  - reserved (8--99 LSB, 100--149 distrib, 150--199 appl)
    #
    # Note that starting an already running service, stopping
    # or restarting a not-running service as well as the restart
-   # with force-reload (in case signalling is not supported) are
+   # with force-reload (in case signaling is not supported) are
    # considered a success.
+
     case "$1" in
 	start)
 	    echo -n "Starting smartd "
-            ## Start daemon with startproc(8). If this fails
-            ## the echo return value is set appropriate.
-	    
-            # startproc should return 0, even if service is
-            # already running to match LSB spec.
-            startproc $SMARTD_BIN $smartd_opts
-	    
-            # Remember status and be verbose
-            rc_status -v
+	    ## Start daemon with startproc(8). If this fails
+	    ## the return value is set appropriately by startproc.
+
+	    # We don't use startproc - we need to check for return code 17.
+	    if ! /sbin/checkproc $SMARTD_BIN ; then
+		$SMARTD_BIN $smartd_opts
+		# Remember status and be verbose
+		if test $? -ne 17 ; then
+		    rc_status -v
+		else
+		    rc_status -u
+		fi
+	    else
+		rc_reset
+		rc_status -v
+	    fi
 	    ;;
 	stop)
 	    echo -n "Shutting down smartd "
-            killproc -TERM $SMARTD_BIN
-	    
-            # Remember status and be verbose
-            rc_status -v
+	    /sbin/killproc -TERM $SMARTD_BIN
+	    # Remember status and be verbose
+	    rc_status -v
 	    ;;
     try-restart|condrestart)
 	    ## Do a restart only if the service was active before.
@@ -199,51 +212,60 @@
 	    fi
 	    $0 status
 	    if test $? = 0; then
-		    $0 restart 
-	    else 
+		    $0 restart
+	    else
 		    rc_reset	# Not running is not a failure.
 	    fi
 	    # Remember status and be quiet
 	    rc_status
 	    ;;
-    restart | force-reload)
+    restart)
 	    $0 stop
 	    $0 start
+	    # Remember status and be quiet
+	    rc_status
+	    ;;
+    force-reload|reload)
+	    echo -n "Reload service smartd "
+	    /sbin/killproc -HUP $SMARTD_BIN
+	    rc_status -v
 	    ;;
-    reload)
-	## Like force-reload, but if daemon does not support
-	## signaling, do nothing (!)
-	    rc_failed 3
+    rescan)
+	    ## Rescan devices to be monitored (smartd specific function)
+	    echo -n "Rescanning devices for service smartd "
+	    /sbin/killproc -USR1 $SMARTD_BIN
 	    rc_status -v
 	    ;;
     status)
-            echo -n "Checking for service smartd "
-            ## Check status with checkproc(8), if process is running
-            ## checkproc will return with exit status 0.
-	    
-            # Status has a slightly different for the status command:
-            # 0 - service running
-            # 1 - service dead, but /var/run/  pid  file exists
-            # 2 - service dead, but /var/lock/ lock file exists
-            # 3 - service not running
-	    
-            # NOTE: checkproc returns LSB compliant status values.
-            checkproc $SMARTD_BIN
-            rc_status -v
-            ;;
-        probe)
+	    echo -n "Checking for service smartd "
+	    ## Check status with checkproc(8), if process is running
+	    ## checkproc will return with exit status 0.
+
+	    # Return value is slightly different for the status command:
+	    # 0 - service up and running
+	    # 1 - service dead, but /var/run/  pid  file exists
+	    # 2 - service dead, but /var/lock/ lock file exists
+	    # 3 - service not running (unused)
+	    # 4 - service status unknown :-(
+	    # 5--199 reserved (5--99 LSB, 100--149 distro, 150--199 appl.)
+
+	    # NOTE: checkproc returns LSB compliant status values.
+	    /sbin/checkproc $SMARTD_BIN
+	    rc_status -v
+	    ;;
+    probe)
 	    ## Optional: Probe for the necessity of a reload, print out the
 	    ## argument to this init script which is required for a reload.
 	    ## Note: probe is not (yet) part of LSB (as of 1.2)
+	    ## Note: probe is not (yet) part of LSB (as of 1.9)
 
 	    test $SMARTD_CONFIG -nt /var/run/smartd.pid && echo reload
 	    ;;
-	*)
-	    echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|probe}"
+    *)
+	    echo "Usage: $0 {start|stop|status|try-restart|restart|force-reload|reload|rescan|probe}"
 	    exit 1
 	    ;;
     esac
-    
     rc_exit
 
 # Debian case
