}                                                      \
 } while (0)
 
+static inline int obd_check_dev(struct obd_device *obd)
+{
+       if (!obd) {
+               CERROR("NULL device\n");
+               return -ENODEV;
+       }
+       return 0;
+}
+
 /* ensure obd_setup and !obd_stopping */
 #define OBD_CHECK_DEV_ACTIVE(obd)                             \
 do {                                                       \
        int rc;
        DECLARE_LU_VARS(ldt, d);
 
-       OBD_CHECK_DEV(obd);
+       rc = obd_check_dev(obd);
+       if (rc)
+               return rc;
        ldt = obd->obd_type->typ_lu;
        d = obd->obd_lu_dev;
        if (ldt != NULL && d != NULL) {
        int rc;
        DECLARE_LU_VARS(ldt, d);
 
-       OBD_CHECK_DEV(obd);
+       rc = obd_check_dev(obd);
+       if (rc)
+               return rc;
 
        ldt = obd->obd_type->typ_lu;
        d = obd->obd_lu_dev;
        int rc;
        DECLARE_LU_VARS(ldt, d);
 
-       OBD_CHECK_DEV(obd);
+       rc = obd_check_dev(obd);
+       if (rc)
+               return rc;
 
        obd->obd_process_conf = 1;
        ldt = obd->obd_type->typ_lu;
 {
        int rc;
 
-       OBD_CHECK_DEV(obd);
+       rc = obd_check_dev(obd);
+       if (rc)
+               return rc;
 
        /* the check for async_recov is a complete hack - I'm hereby
           overloading the meaning to also mean "this was called from
 static inline int obd_register_observer(struct obd_device *obd,
                                        struct obd_device *observer)
 {
-       OBD_CHECK_DEV(obd);
+       int rc;
+
+       rc = obd_check_dev(obd);
+       if (rc)
+               return rc;
        down_write(&obd->obd_observer_link_sem);
        if (obd->obd_observer && observer) {
                up_write(&obd->obd_observer_link_sem);