struct bttv_fh *fh  = f;
        struct bttv *btv = fh->btv;
 
-       pr_info("%d: ========  START STATUS CARD #%d  ========\n",
-               btv->c.nr, btv->c.nr);
        bttv_call_all(btv, core, log_status);
-       pr_info("%d: ========  END STATUS CARD   #%d  ========\n",
-               btv->c.nr, btv->c.nr);
        return 0;
 }
 
 
        struct v4l2_audio audin;
        int i;
 
-       CX18_INFO("=================  START STATUS CARD #%d  "
-                 "=================\n", cx->instance);
        CX18_INFO("Version: %s  Card: %s\n", CX18_VERSION, cx->card_name);
        if (cx->hw_flags & CX18_HW_TVEEPROM) {
                struct tveeprom tv;
        CX18_INFO("Read MPEG/VBI: %lld/%lld bytes\n",
                        (long long)cx->mpg_data_received,
                        (long long)cx->vbi_data_inserted);
-       CX18_INFO("==================  END STATUS CARD #%d  "
-                 "==================\n", cx->instance);
        return 0;
 }
 
 
        struct v4l2_audio audin;
        int i;
 
-       IVTV_INFO("=================  START STATUS CARD #%d  =================\n",
-                      itv->instance);
        IVTV_INFO("Version: %s Card: %s\n", IVTV_VERSION, itv->card_name);
        if (itv->hw_flags & IVTV_HW_TVEEPROM) {
                struct tveeprom tv;
        IVTV_INFO("Read MPG/VBI: %lld/%lld bytes\n",
                        (long long)itv->mpg_data_received,
                        (long long)itv->vbi_data_inserted);
-       IVTV_INFO("==================  END STATUS CARD #%d  ==================\n",
-                       itv->instance);
-
        return 0;
 }
 
 
        return ret;
 }
 
-static int pwc_log_status(struct file *file, void *priv)
-{
-       struct pwc_device *pdev = video_drvdata(file);
-
-       v4l2_ctrl_handler_log_status(&pdev->ctrl_handler, PWC_NAME);
-       return 0;
-}
-
 const struct v4l2_ioctl_ops pwc_ioctl_ops = {
        .vidioc_querycap                    = pwc_querycap,
        .vidioc_enum_input                  = pwc_enum_input,
        .vidioc_dqbuf                       = pwc_dqbuf,
        .vidioc_streamon                    = pwc_streamon,
        .vidioc_streamoff                   = pwc_streamoff,
-       .vidioc_log_status                  = pwc_log_status,
+       .vidioc_log_status                  = v4l2_ctrl_log_status,
        .vidioc_enum_framesizes             = pwc_enum_framesizes,
        .vidioc_enum_frameintervals         = pwc_enum_frameintervals,
        .vidioc_g_parm                      = pwc_g_parm,
 
        return 0;
 }
 
-static int vidioc_log_status(struct file *file, void *priv)
-{
-       return 0;
-}
-
 static int fill_queryctrl(struct saa7164_encoder_params *params,
        struct v4l2_queryctrl *c)
 {
        .vidioc_g_ext_ctrls      = vidioc_g_ext_ctrls,
        .vidioc_s_ext_ctrls      = vidioc_s_ext_ctrls,
        .vidioc_try_ext_ctrls    = vidioc_try_ext_ctrls,
-       .vidioc_log_status       = vidioc_log_status,
        .vidioc_queryctrl        = vidioc_queryctrl,
        .vidioc_g_chip_ident     = saa7164_g_chip_ident,
 #ifdef CONFIG_VIDEO_ADV_DEBUG
 
        return 0;
 }
 
-static int vidioc_log_status(struct file *file, void *priv)
-{
-       return 0;
-}
-
 static int fill_queryctrl(struct saa7164_vbi_params *params,
        struct v4l2_queryctrl *c)
 {
        .vidioc_g_ext_ctrls      = vidioc_g_ext_ctrls,
        .vidioc_s_ext_ctrls      = vidioc_s_ext_ctrls,
        .vidioc_try_ext_ctrls    = vidioc_try_ext_ctrls,
-       .vidioc_log_status       = vidioc_log_status,
        .vidioc_queryctrl        = vidioc_queryctrl,
 #if 0
        .vidioc_g_chip_ident     = saa7164_g_chip_ident,
 
        v4l2_ctrl_unlock(ctrl);
 }
 EXPORT_SYMBOL(v4l2_ctrl_del_event);
+
+int v4l2_ctrl_log_status(struct file *file, void *fh)
+{
+       struct video_device *vfd = video_devdata(file);
+       struct v4l2_fh *vfh = file->private_data;
+
+       if (test_bit(V4L2_FL_USES_V4L2_FH, &vfd->flags) && vfd->v4l2_dev)
+               v4l2_ctrl_handler_log_status(vfh->ctrl_handler,
+                       vfd->v4l2_dev->name);
+       return 0;
+}
+EXPORT_SYMBOL(v4l2_ctrl_log_status);
 
        {
                if (!ops->vidioc_log_status)
                        break;
+               if (vfd->v4l2_dev)
+                       pr_info("%s: =================  START STATUS  =================\n",
+                               vfd->v4l2_dev->name);
                ret = ops->vidioc_log_status(file, fh);
+               if (vfd->v4l2_dev)
+                       pr_info("%s: ==================  END STATUS  ==================\n",
+                               vfd->v4l2_dev->name);
                break;
        }
 #ifdef CONFIG_VIDEO_ADV_DEBUG
 
        return vb2_streamoff(&dev->vb_vidq, i);
 }
 
-static int vidioc_log_status(struct file *file, void *priv)
-{
-       struct vivi_dev *dev = video_drvdata(file);
-
-       v4l2_ctrl_handler_log_status(&dev->ctrl_handler, dev->v4l2_dev.name);
-       return 0;
-}
-
 static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id *i)
 {
        return 0;
        .vidioc_s_input       = vidioc_s_input,
        .vidioc_streamon      = vidioc_streamon,
        .vidioc_streamoff     = vidioc_streamoff,
-       .vidioc_log_status    = vidioc_log_status,
+       .vidioc_log_status    = v4l2_ctrl_log_status,
        .vidioc_subscribe_event = vidioc_subscribe_event,
        .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
 };
 
 void v4l2_ctrl_del_event(struct v4l2_ctrl *ctrl,
                struct v4l2_subscribed_event *sev);
 
+/* Can be used as a vidioc_log_status function that just dumps all controls
+   associated with the filehandle. */
+int v4l2_ctrl_log_status(struct file *file, void *fh);
+
 /* Helpers for ioctl_ops. If hdl == NULL then they will all return -EINVAL. */
 int v4l2_queryctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_queryctrl *qc);
 int v4l2_querymenu(struct v4l2_ctrl_handler *hdl, struct v4l2_querymenu *qm);