anchor.diff:      ?PROVIDER_OK_RESP(#scheduled_transfer{transfer_id = TransferId}).
   
   
  --spec assert_not_a_trash_dir_replication(undefined | od_provider:id(), file_ctx:ctx()) -> ok.
  -assert_not_a_trash_dir_replication(undefined, _) ->
  +%% @private
  +-spec assert_possible_if_replication(undefined | od_provider:id(), file_ctx:ctx()) ->
  +    file_ctx:ctx().
  +assert_possible_if_replication(undefined, FileCtx0) ->
       % if ReplicatingProvider is undefined the transfer is a eviction
  -    % eviction is allowed on trash directory
  -    ok;
  -assert_not_a_trash_dir_replication(_ReplicatingProviderId, FileCtx0) ->
  -    file_ctx:assert_not_trash_dir_const(FileCtx0).
  +    FileCtx0;
  +assert_possible_if_replication(ReplicatingProviderId, FileCtx0) ->
  +    file_ctx:assert_not_trash_dir_const(FileCtx0),
  +    file_ctx:assert_not_readonly_target_storage_const(FileCtx0, ReplicatingProviderId),
  +    file_ctx:assert_smaller_than_provider_support_size(FileCtx0, ReplicatingProviderId).
  
positive.code:     Callback
  ) ->
      data_constraints:assert_not_readonly_mode(UserCtx),
  
      SpaceDirCtx1 = fslogic_authz:ensure_authorized(
          UserCtx, SpaceDirCtx0,
          [?TRAVERSE_ANCESTORS]
      ),
      schedule_transfer_insecure(
          UserCtx, SpaceDirCtx1,
          ReplicatingProviderId, EvictingProviderId,
          ViewName, QueryViewParams,
          Callback
  
negative.code:     ReplicatingProviderId, EvictingProviderId,
      Callback
  ) ->
      data_constraints:assert_not_readonly_mode(UserCtx),
      FileCtx1 = assert_possible_if_replication(ReplicatingProviderId, FileCtx0),
  
      FileCtx2 = fslogic_authz:ensure_authorized(
          UserCtx, FileCtx1, [?TRAVERSE_ANCESTORS]
      ),
      schedule_transfer_insecure(
          UserCtx, FileCtx2,
          ReplicatingProviderId, EvictingProviderId,
          undefined, [],
          Callback
  