make sure we never oops because the hardware lock pointer in the sigdata
authorMichel Daenzer <michel@daenzer.net>
Sat, 21 Sep 2002 23:18:54 +0000 (23:18 +0000)
committerMichel Daenzer <michel@daenzer.net>
Sat, 21 Sep 2002 23:18:54 +0000 (23:18 +0000)
    structure is out of date

linux-core/drm_bufs.c
linux-core/drm_drv.c
linux-core/drm_lock.c
linux/drm_bufs.h
linux/drm_drv.h
linux/drm_lock.h

index 3ff3527..9ce7cff 100644 (file)
@@ -137,6 +137,7 @@ int DRM(addmap)( struct inode *inode, struct file *filp,
                }
                map->offset = (unsigned long)map->handle;
                if ( map->flags & _DRM_CONTAINS_LOCK ) {
+                       dev->sigdata.lock =
                        dev->lock.hw_lock = map->handle; /* Pointer to lock */
                }
                break;
index 81bd789..7e2cfd8 100644 (file)
@@ -306,7 +306,7 @@ static int DRM(setup)( drm_device_t *dev )
        dev->map_count = 0;
 
        dev->vmalist = NULL;
-       dev->lock.hw_lock = NULL;
+       dev->sigdata.lock = dev->lock.hw_lock = NULL;
        init_waitqueue_head( &dev->lock.lock_queue );
        dev->queue_count = 0;
        dev->queue_reserved = 0;
@@ -491,7 +491,7 @@ static int DRM(takedown)( drm_device_t *dev )
        DRM(dma_takedown)( dev );
 #endif
        if ( dev->lock.hw_lock ) {
-               dev->lock.hw_lock = NULL; /* SHM removed */
+               dev->sigdata.lock = dev->lock.hw_lock = NULL; /* SHM removed */
                dev->lock.pid = 0;
                wake_up_interruptible( &dev->lock.lock_queue );
        }
index c10cfe2..c887d1f 100644 (file)
@@ -237,7 +237,7 @@ int DRM(notifier)(void *priv)
 
 
                                /* Allow signal delivery if lock isn't held */
-       if (!_DRM_LOCK_IS_HELD(s->lock->lock)
+       if (!s->lock || !_DRM_LOCK_IS_HELD(s->lock->lock)
            || _DRM_LOCKING_CONTEXT(s->lock->lock) != s->context) return 1;
 
                                /* Otherwise, set flag to force call to
index 3ff3527..9ce7cff 100644 (file)
@@ -137,6 +137,7 @@ int DRM(addmap)( struct inode *inode, struct file *filp,
                }
                map->offset = (unsigned long)map->handle;
                if ( map->flags & _DRM_CONTAINS_LOCK ) {
+                       dev->sigdata.lock =
                        dev->lock.hw_lock = map->handle; /* Pointer to lock */
                }
                break;
index 81bd789..7e2cfd8 100644 (file)
@@ -306,7 +306,7 @@ static int DRM(setup)( drm_device_t *dev )
        dev->map_count = 0;
 
        dev->vmalist = NULL;
-       dev->lock.hw_lock = NULL;
+       dev->sigdata.lock = dev->lock.hw_lock = NULL;
        init_waitqueue_head( &dev->lock.lock_queue );
        dev->queue_count = 0;
        dev->queue_reserved = 0;
@@ -491,7 +491,7 @@ static int DRM(takedown)( drm_device_t *dev )
        DRM(dma_takedown)( dev );
 #endif
        if ( dev->lock.hw_lock ) {
-               dev->lock.hw_lock = NULL; /* SHM removed */
+               dev->sigdata.lock = dev->lock.hw_lock = NULL; /* SHM removed */
                dev->lock.pid = 0;
                wake_up_interruptible( &dev->lock.lock_queue );
        }
index c10cfe2..c887d1f 100644 (file)
@@ -237,7 +237,7 @@ int DRM(notifier)(void *priv)
 
 
                                /* Allow signal delivery if lock isn't held */
-       if (!_DRM_LOCK_IS_HELD(s->lock->lock)
+       if (!s->lock || !_DRM_LOCK_IS_HELD(s->lock->lock)
            || _DRM_LOCKING_CONTEXT(s->lock->lock) != s->context) return 1;
 
                                /* Otherwise, set flag to force call to