diff --git a/src/lua/fio.lua b/src/lua/fio.lua
index eda5be18abb4667b66aca35f721c58555823bcf7..b0b6d3a7280cd23a4f1f54ae75067a679d702793 100644
--- a/src/lua/fio.lua
+++ b/src/lua/fio.lua
@@ -1,6 +1,12 @@
 -- fio.lua (internal file)
 
 local fio = require('fio')
+local ffi = require('ffi')
+
+ffi.cdef[[
+    int umask(int mask);
+]]
+
 local internal = fio.internal
 fio.internal = nil
 
@@ -198,4 +204,18 @@ fio.basename = function(path, suffix)
     return path
 end
 
+fio.umask = function(umask)
+
+    if umask == nil then
+        local old = ffi.C.umask(0)
+        ffi.C.umask(old)
+        return old
+    end
+
+    umask = tonumber(umask)
+
+    return ffi.C.umask(tonumber(umask))
+
+end
+
 return fio
diff --git a/test/box/fio.result b/test/box/fio.result
index 3618943e97f6a6c1aec9d9093f5d8e19f00b34a9..1485c63ad1689a6263814b9a4919af3b1314692a 100644
--- a/test/box/fio.result
+++ b/test/box/fio.result
@@ -4,6 +4,15 @@ fio = require 'fio'
 errno = require 'errno'
 ---
 ...
+-- umask
+type(fio.umask(0))
+---
+- number
+...
+fio.umask()
+---
+- 0
+...
 -- pathjoin
 fio.pathjoin('abc', 'cde')
 ---
diff --git a/test/box/fio.test.lua b/test/box/fio.test.lua
index ed510103951e86cd72d3c97316b6934b60f35813..c97c15965a5d0f12d9d25e1c279a69bb2e5c0d54 100644
--- a/test/box/fio.test.lua
+++ b/test/box/fio.test.lua
@@ -1,6 +1,11 @@
 fio = require 'fio'
 errno = require 'errno'
 
+-- umask
+
+type(fio.umask(0))
+fio.umask()
+
 -- pathjoin
 fio.pathjoin('abc', 'cde')
 fio.pathjoin('/', 'abc')