<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 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
        )