def _create_dir_path(self, file_hash, path=None, hash_list=None):
        """
        Create proper filesystem paths for given `file_hash`.

        Args:
            file_hash (str): Hash of the file for which the path should be
                      created.
            path (str, default None): Recursion argument, don't set this.
            hash_list (list, default None): Recursion argument, don't set this.

        Returns:
            str: Created path.
        """
        # first, non-recursive call - parse `file_hash`
        if hash_list is None:
            hash_list = list(file_hash)

        if not hash_list:
            raise IOError("Directory structure is too full!")

        # first, non-recursive call - look for subpath of `self.path`
        if not path:
            path = os.path.join(
                self.path,
                hash_list.pop(0)
            )

        # if the path not yet exists, create it and work on it
        if not os.path.exists(path):
            os.mkdir(path)
            return self._create_dir_path(
                file_hash=file_hash,
                path=path,
                hash_list=hash_list
            )

        files = os.listdir(path)

        # file is already in storage
        if file_hash in files:
            return path

        # if the directory is not yet full, use it
        if len(files) < self.dir_limit:
            return path

        # in full directories create new sub-directories
        return self._create_dir_path(
            file_hash=file_hash,
            path=os.path.join(path, hash_list.pop(0)),
            hash_list=hash_list
        )
Create proper filesystem paths for given `file_hash`.

        Args:
            file_hash (str): Hash of the file for which the path should be
                      created.
            path (str, default None): Recursion argument, don't set this.
            hash_list (list, default None): Recursion argument, don't set this.

        Returns:
            str: Created path.