diff --git a/src/lua/fio.lua b/src/lua/fio.lua
index 321ae8b2d591add4bbea92e629631e2414428a91..cb224f3d0fb366ffbd8dcc0f5251e02481e478d2 100644
--- a/src/lua/fio.lua
+++ b/src/lua/fio.lua
@@ -4,6 +4,7 @@ local fio = require('fio')
 local ffi = require('ffi')
 local buffer = require('buffer')
 local fiber = require('fiber')
+local errno = require('errno')
 
 ffi.cdef[[
     int umask(int mask);
@@ -360,12 +361,16 @@ fio.mktree = function(path, mode)
     local current_dir = "/"
     for i, dir in ipairs(dirs) do
         current_dir = fio.pathjoin(current_dir, dir)
-        if not fio.stat(current_dir) then
+        local stat = fio.stat(current_dir)
+        if stat == nil then
             local st, err = fio.mkdir(current_dir, mode)
             if err ~= nil  then
                 return false, string.format("Error creating directory %s: %s",
                     current_dir, tostring(err))
             end
+        elseif not stat:is_dir() then
+            return false, string.format("Error creating directory %s: %s",
+                current_dir, errno.strerror(errno.EEXIST))
         end
     end
     return true
diff --git a/test/app/fio.result b/test/app/fio.result
index 34f58d6bc8f2be77eeb075d71f3d47e8032d51a6..f83c43f4403320d3b56b17f11a3c3d7368400096 100644
--- a/test/app/fio.result
+++ b/test/app/fio.result
@@ -1443,3 +1443,16 @@ test_run:cmd("clear filter")
 ---
 - true
 ...
+--
+-- gh-4439: mktree error handling fix - creation of existing file/directory
+--
+fio.mktree('/dev/null')
+---
+- false
+- 'Error creating directory /dev/null: File exists'
+...
+fio.mktree('/dev/null/dir')
+---
+- false
+- 'Error creating directory /dev/null: File exists'
+...
diff --git a/test/app/fio.test.lua b/test/app/fio.test.lua
index be735e4f338390f3460869650e19ac7b470c7040..56c957d8a00b25111f9426638e63b8f347bfbfba 100644
--- a/test/app/fio.test.lua
+++ b/test/app/fio.test.lua
@@ -468,3 +468,9 @@ fio.rmtree(1)
 fio.copytree(nil, nil)
 fio.copytree(nil, nil)
 test_run:cmd("clear filter")
+
+--
+-- gh-4439: mktree error handling fix - creation of existing file/directory
+--
+fio.mktree('/dev/null')
+fio.mktree('/dev/null/dir')