diff --git a/Network/Sendfile/Linux.hsc b/Network/Sendfile/Linux.hsc
--- a/Network/Sendfile/Linux.hsc
+++ b/Network/Sendfile/Linux.hsc
@@ -88,25 +88,22 @@
 
 sendloop :: Fd -> Fd -> Ptr COff -> CSize -> IO () -> IO ()
 sendloop dst src offp len hook = do
+    -- Multicore IO manager use edge-trigger mode.
+    -- So, calling threadWaitWrite only when errnor is eAGAIN.
     bytes <- c_sendfile dst src offp len
     case bytes of
         -1 -> do
             errno <- getErrno
-            if errno == eAGAIN then
-                loop len
+            if errno == eAGAIN then do
+                threadWaitWrite dst
+                sendloop dst src offp len hook
               else
                 throwErrno "Network.SendFile.Linux.sendloop"
         0  -> return () -- the file is truncated
-        _  -> loop (len - fromIntegral bytes)
-  where
-    loop 0    = return ()
-    loop left = do
-        hook
-        -- Parallel IO manager use edge-trigger mode.
-        -- So, calling threadWaitWrite only when errnor is eAGAIN.
-        errno <- getErrno
-        when (errno == eAGAIN) $ threadWaitWrite dst
-        sendloop dst src offp left hook
+        _  -> do
+            hook
+            let left = len - fromIntegral bytes
+            when (left /= 0) $ sendloop dst src offp left hook
 
 -- Dst Src in order. take care
 foreign import ccall unsafe "sendfile"
diff --git a/simple-sendfile.cabal b/simple-sendfile.cabal
--- a/simple-sendfile.cabal
+++ b/simple-sendfile.cabal
@@ -1,5 +1,5 @@
 Name:                   simple-sendfile
-Version:                0.2.11
+Version:                0.2.12
 Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
 Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>
 License:                BSD3
@@ -12,6 +12,10 @@
 Cabal-Version:          >= 1.10
 Build-Type:             Simple
 
+Flag allow-bsd
+  Description:          Allow use of BSD sendfile (disable on GNU/kFreeBSD)
+  Default:              True
+
 Library
   Default-Language:     Haskell2010
   GHC-Options:          -Wall
@@ -21,7 +25,7 @@
                       , network
                       , bytestring
   -- NetBSD and OpenBSD don't have sendfile
-  if os(freebsd)
+  if os(freebsd) && flag(allow-bsd)
     CPP-Options:        -DOS_BSD
     Other-Modules:      Network.Sendfile.BSD
                         Network.Sendfile.IOVec
