diff --git a/src/info_storages/file_info_storage.rs b/src/info_storages/file_info_storage.rs
index fad265b4f4420aeeea4286fef41fc153f4035fdb..51f55674cd42aae557f4fefeaaee56ebfbd36171 100644
--- a/src/info_storages/file_info_storage.rs
+++ b/src/info_storages/file_info_storage.rs
@@ -45,12 +45,8 @@ impl InfoStorage for FileInfoStorage {
                 error!("{:?}", err);
                 RustusError::UnableToWrite(err.to_string())
             })?;
-        let data = serde_json::to_string(&file_info).map_err(|err| {
-            error!("{:#?}", err);
-            err
-        })?;
-        copy(&mut data.as_bytes(), &mut file).await?;
-        file.sync_data().await?;
+        copy(&mut file_info.json().await?.as_bytes(), &mut file).await?;
+        tokio::task::spawn(async move { file.sync_data().await });
         Ok(())
     }
 
diff --git a/src/info_storages/models/file_info.rs b/src/info_storages/models/file_info.rs
index bace48bd72d78095b72a280a05396a0e0d2e5c09..52027062fdbd23d5167614793cae8c5b99b21dc5 100644
--- a/src/info_storages/models/file_info.rs
+++ b/src/info_storages/models/file_info.rs
@@ -1,7 +1,10 @@
 use std::collections::HashMap;
 
+use crate::errors::RustusError;
+use crate::RustusResult;
 use chrono::serde::ts_seconds;
 use chrono::{DateTime, Utc};
+use log::error;
 use serde::{Deserialize, Serialize};
 
 /// Information about file.
@@ -88,6 +91,17 @@ impl FileInfo {
         }
     }
 
+    pub async fn json(&self) -> RustusResult<String> {
+        let info_clone = self.clone();
+        let data = tokio::task::spawn_blocking(move || serde_json::to_string(&info_clone))
+            .await
+            .map_err(|err| {
+                error!("{}", err);
+                RustusError::UnableToWrite("Can't serialize info".into())
+            })??;
+        Ok(data)
+    }
+
     #[cfg(test)]
     pub fn new_test() -> Self {
         FileInfo::new(
diff --git a/src/info_storages/redis_info_storage.rs b/src/info_storages/redis_info_storage.rs
index b9e0b3b11b4686f9e454b593f38188ea589f8dfd..5e412a0177e07d8da08a346137ae4a20aa0b4f4b 100644
--- a/src/info_storages/redis_info_storage.rs
+++ b/src/info_storages/redis_info_storage.rs
@@ -30,7 +30,7 @@ impl InfoStorage for RedisStorage {
         let mut conn = self.pool.get().await?;
         redis::cmd("SET")
             .arg(file_info.id.as_str())
-            .arg(serde_json::to_string(file_info)?.as_str())
+            .arg(file_info.json().await?.as_str())
             .query_async::<Connection, String>(&mut conn)
             .await
             .map_err(RustusError::from)?;
diff --git a/src/storages/file_storage.rs b/src/storages/file_storage.rs
index 2653412bab29c66685484ee632194a04e4794356..b2a850b5e86e5b272f89ffda69d596dcb40cc843 100644
--- a/src/storages/file_storage.rs
+++ b/src/storages/file_storage.rs
@@ -4,7 +4,7 @@ use actix_files::NamedFile;
 use async_trait::async_trait;
 use log::error;
 use tokio::fs::{remove_file, DirBuilder, OpenOptions};
-use tokio::io::{copy, BufReader};
+use tokio::io::copy;
 
 use crate::errors::{RustusError, RustusResult};
 use crate::info_storages::FileInfo;
@@ -95,9 +95,10 @@ impl Storage for FileStorage {
                 error!("{:?}", err);
                 RustusError::UnableToWrite(err.to_string())
             })?;
-        let mut reader = BufReader::new(bytes);
-        copy(&mut reader, &mut file).await?;
-        file.sync_data().await?;
+        #[allow(clippy::clone_double_ref)]
+        let mut buffer = bytes.clone();
+        copy(&mut buffer, &mut file).await?;
+        tokio::task::spawn(async move { file.sync_data().await });
         Ok(())
     }