1. 11 Oct, 2017 1 commit
    • Mauro Carvalho Chehab's avatar
      media: dvb_frontend: only use kref after initialized · ead66600
      Mauro Carvalho Chehab authored
      As reported by Laurent, when a DVB frontend need to register
      two drivers (e. g. a tuner and a demod), if the second driver
      fails to register (for example because it was not compiled),
      the error handling logic frees the frontend by calling
      dvb_frontend_detach(). That used to work fine, but changeset
      1f862a68 ("[media] dvb_frontend: move kref to struct dvb_frontend")
      added a kref at struct dvb_frontend. So, now, instead of just
      freeing the data, the error handling do a kref_put().
      
      That works fine only after dvb_register_frontend() succeeds.
      
      While it would be possible to add a helper function that
      would be initializing earlier the kref, that would require
      changing every single DVB frontend on non-trivial ways, and
      would make frontends different than other drivers.
      
      So, instead of doing that, let's focus on the real issue:
      only call kref_put() after kref_init(). That's easy to
      check, as, when the dvb frontend is successfuly registered,
      it will allocate its own private struct. So, if such
      struct is allocated, it means that it is safe to use
      kref_put(). If not, then nobody is using yet the frontend,
      and it is safe to just deallocate it.
      
      Fixes: 1f862a68 ("[media] dvb_frontend: move kref to struct dvb_frontend")
      Reported-by: default avatarLaurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
      Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
      ead66600
  2. 23 Sep, 2017 7 commits
  3. 05 Sep, 2017 32 commits