It seems that both, backend and frontend work correctly. The backend does not receive the fast-diff feature flag if it wasn't set on the frontend. Nevertheless, the image is create with the fast-diff feature enabled.
user@ceph-1 /ceph (wip-pna-fix-rbd-image-fast-diff*) $ nc localhost 55555
> /ceph/src/pybind/mgr/dashboard/controllers/rbd.py(246)_create()
-> feature_bitmask = format_features(features)
(Pdb) ll
> /ceph/src/pybind/mgr/dashboard/controllers/rbd.py(37)_rbd_call()
-> func(ioctx, *args, **kwargs)
> /ceph/src/pybind/mgr/dashboard/controllers/rbd.py(246)_create()
-> feature_bitmask = format_features(features)
241 if obj_size and obj_size > 0:
242 l_order = int(round(math.log(float(obj_size), 2)))
243
244 import rpdb; debugger = rpdb.Rpdb(port=55555); debugger.set_trace()
245 # Set features
246 -> feature_bitmask = format_features(features)
247
248 rbd_inst.create(ioctx, name, size, order=l_order, old_format=False,
249 features=feature_bitmask, stripe_unit=stripe_unit,
250 stripe_count=stripe_count, data_pool=data_pool)
251 RbdConfiguration(pool_ioctx=ioctx, image_name=name).set_configuration(configuration)
(Pdb) rbd
<module 'rbd' from '/ceph/build/lib/cython_modules/lib.3/rbd.cpython-37m-x86_64-linux-gnu.so'>
(Pdb) features
['deep-flatten', 'layering', 'exclusive-lock', 'object-map']
(Pdb) n
> /ceph/src/pybind/mgr/dashboard/controllers/rbd.py(248)_create()
-> rbd_inst.create(ioctx, name, size, order=l_order, old_format=False,
(Pdb) feature_bitmask
45
(Pdb) c
user@ceph-1 /ceph (wip-pna-fix-rbd-image-fast-diff*) $