+ return surf_resource_properties(surf_cpu_resource_priv(ws));
+}
+
+static storage_t find_storage_on_mount_list(void *workstation,const char* storage)
+{
+ storage_t st = NULL;
+ s_mount_t mnt;
+ unsigned int cursor;
+ workstation_CLM03_t ws = (workstation_CLM03_t) surf_workstation_resource_priv(workstation);
+ xbt_dynar_t storage_list = ws->storage;
+
+ XBT_DEBUG("Search for storage name '%s' on '%s'",storage,ws->generic_resource.name);
+ xbt_dynar_foreach(storage_list,cursor,mnt)
+ {
+ XBT_DEBUG("See '%s'",mnt.name);
+ if(!strcmp(storage,mnt.name)){
+ st = mnt.id;
+ break;
+ }
+ }
+ if(!st) xbt_die("Can't find mount '%s' for '%s'",storage,ws->generic_resource.name);
+ return st;
+}
+
+static surf_action_t ws_action_open(void *workstation, const char* mount,
+ const char* path)
+{
+ storage_t st = find_storage_on_mount_list(workstation, mount);
+ XBT_DEBUG("OPEN on disk '%s'",st->generic_resource.name);
+ surf_model_t model = st->generic_resource.model;
+ return model->extension.storage.open(st, mount, path);
+}
+
+static surf_action_t ws_action_close(void *workstation, surf_file_t fd)
+{
+ storage_t st = find_storage_on_mount_list(workstation, fd->storage);
+ XBT_DEBUG("CLOSE on disk '%s'",st->generic_resource.name);
+ surf_model_t model = st->generic_resource.model;
+ return model->extension.storage.close(st, fd);
+}
+
+static surf_action_t ws_action_read(void *workstation, void* ptr, size_t size,
+ surf_file_t fd)
+{
+ storage_t st = find_storage_on_mount_list(workstation, fd->storage);
+ XBT_DEBUG("READ on disk '%s'",st->generic_resource.name);
+ surf_model_t model = st->generic_resource.model;
+ return model->extension.storage.read(st, ptr, size, fd);
+}
+
+static surf_action_t ws_action_write(void *workstation, const void* ptr,
+ size_t size, surf_file_t fd)
+{
+ storage_t st = find_storage_on_mount_list(workstation, fd->storage);
+ XBT_DEBUG("WRITE on disk '%s'",st->generic_resource.name);
+ surf_model_t model = st->generic_resource.model;
+ return model->extension.storage.write(st, ptr, size, fd);
+}
+
+static int ws_file_unlink(void *workstation, surf_file_t fd)
+{
+ if (!fd){
+ XBT_WARN("No such file descriptor. Impossible to unlink");
+ return 0;
+ } else {
+// XBT_INFO("%s %zu", fd->storage, fd->size);
+ storage_t st = find_storage_on_mount_list(workstation, fd->storage);
+ xbt_dict_t content_dict = (st)->content;
+ /* Check if the file is on this storage */
+ if (!xbt_dict_get_or_null(content_dict, fd->name)){
+ XBT_WARN("File %s is not on disk %s. Impossible to unlink", fd->name,
+ st->generic_resource.name);
+ return 0;
+ } else {
+ XBT_DEBUG("UNLINK on disk '%s'",st->generic_resource.name);
+ st->used_size -= fd->size;
+
+ // Remove the file from storage
+ xbt_dict_remove(content_dict,fd->name);
+
+ free(fd->name);
+ free(fd->storage);
+ xbt_free(fd);
+ return 1;
+ }
+ }
+}
+
+static surf_action_t ws_action_ls(void *workstation, const char* mount,
+ const char *path)
+{
+ XBT_DEBUG("LS on mount '%s' and file '%s'",mount, path);
+ storage_t st = find_storage_on_mount_list(workstation, mount);
+ surf_model_t model = st->generic_resource.model;
+ return model->extension.storage.ls(st, path);
+}
+
+static size_t ws_file_get_size(void *workstation, surf_file_t fd)
+{
+ return fd->size;