[S390] monwriter find header logic.
authorMelissa Howland <melissah@us.ibm.com>
Wed, 18 Oct 2006 16:30:49 +0000 (18:30 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 18 Oct 2006 16:30:49 +0000 (18:30 +0200)
Fix logic for finding matching buffers.

Signed-off-by: Melissa Howland <melissah@us.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
drivers/s390/char/monwriter.c

index abd02ed..b9b0fc3 100644 (file)
@@ -73,12 +73,15 @@ static inline struct mon_buf *monwrite_find_hdr(struct mon_private *monpriv,
        struct mon_buf *entry, *next;
 
        list_for_each_entry_safe(entry, next, &monpriv->list, list)
-               if (entry->hdr.applid == monhdr->applid &&
+               if ((entry->hdr.mon_function == monhdr->mon_function ||
+                    monhdr->mon_function == MONWRITE_STOP_INTERVAL) &&
+                   entry->hdr.applid == monhdr->applid &&
                    entry->hdr.record_num == monhdr->record_num &&
                    entry->hdr.version == monhdr->version &&
                    entry->hdr.release == monhdr->release &&
                    entry->hdr.mod_level == monhdr->mod_level)
                        return entry;
+
        return NULL;
 }
 
@@ -92,7 +95,9 @@ static int monwrite_new_hdr(struct mon_private *monpriv)
            monhdr->mon_function > MONWRITE_START_CONFIG ||
            monhdr->hdrlen != sizeof(struct monwrite_hdr))
                return -EINVAL;
-       monbuf = monwrite_find_hdr(monpriv, monhdr);
+       monbuf = NULL;
+       if (monhdr->mon_function != MONWRITE_GEN_EVENT)
+               monbuf = monwrite_find_hdr(monpriv, monhdr);
        if (monbuf) {
                if (monhdr->mon_function == MONWRITE_STOP_INTERVAL) {
                        monhdr->datalen = monbuf->hdr.datalen;
@@ -104,7 +109,7 @@ static int monwrite_new_hdr(struct mon_private *monpriv)
                        kfree(monbuf);
                        monbuf = NULL;
                }
-       } else {
+       } else if (monhdr->mon_function != MONWRITE_STOP_INTERVAL) {
                if (mon_buf_count >= mon_max_bufs)
                        return -ENOSPC;
                monbuf = kzalloc(sizeof(struct mon_buf), GFP_KERNEL);
@@ -118,7 +123,8 @@ static int monwrite_new_hdr(struct mon_private *monpriv)
                }
                monbuf->hdr = *monhdr;
                list_add_tail(&monbuf->list, &monpriv->list);
-               mon_buf_count++;
+               if (monhdr->mon_function != MONWRITE_GEN_EVENT)
+                       mon_buf_count++;
        }
        monpriv->current_buf = monbuf;
        return 0;