Staging: b3dfg: Drop NULL test on list_entry result
list_entry, which is an alias for container_of, cannot return NULL, as there is no way to add a NULL value to a doubly linked list. A simplified version of the semantic match that findds this problem is as follows: (http://www.emn.fr/x-info/coccinelle/) // <smpl> @r@ expression x,E; statement S1,S2; position p,p1; @@ *x = list_entry@p(...) ... when != x = E *if@p1 (x == NULL) S1 else S2 // </smpl> Signed-off-by: Julia Lawall <julia@diku.dk> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
f2eb519774
commit
980fd895e6
@@ -632,18 +632,15 @@ static void transfer_complete(struct b3dfg_dev *fgdev)
|
|||||||
fgdev->cur_dma_frame_addr = 0;
|
fgdev->cur_dma_frame_addr = 0;
|
||||||
|
|
||||||
buf = list_entry(fgdev->buffer_queue.next, struct b3dfg_buffer, list);
|
buf = list_entry(fgdev->buffer_queue.next, struct b3dfg_buffer, list);
|
||||||
if (buf) {
|
|
||||||
dev_dbg(dev, "handle frame completion\n");
|
|
||||||
if (fgdev->cur_dma_frame_idx == B3DFG_FRAMES_PER_BUFFER - 1) {
|
|
||||||
|
|
||||||
/* last frame of that triplet completed */
|
dev_dbg(dev, "handle frame completion\n");
|
||||||
dev_dbg(dev, "triplet completed\n");
|
if (fgdev->cur_dma_frame_idx == B3DFG_FRAMES_PER_BUFFER - 1) {
|
||||||
buf->state = B3DFG_BUFFER_POPULATED;
|
|
||||||
list_del_init(&buf->list);
|
/* last frame of that triplet completed */
|
||||||
wake_up_interruptible(&fgdev->buffer_waitqueue);
|
dev_dbg(dev, "triplet completed\n");
|
||||||
}
|
buf->state = B3DFG_BUFFER_POPULATED;
|
||||||
} else {
|
list_del_init(&buf->list);
|
||||||
dev_err(dev, "got frame but no buffer!\n");
|
wake_up_interruptible(&fgdev->buffer_waitqueue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -663,19 +660,15 @@ static bool setup_next_frame_transfer(struct b3dfg_dev *fgdev, int idx)
|
|||||||
dev_dbg(dev, "program DMA transfer for next frame: %d\n", idx);
|
dev_dbg(dev, "program DMA transfer for next frame: %d\n", idx);
|
||||||
|
|
||||||
buf = list_entry(fgdev->buffer_queue.next, struct b3dfg_buffer, list);
|
buf = list_entry(fgdev->buffer_queue.next, struct b3dfg_buffer, list);
|
||||||
if (buf) {
|
if (idx == fgdev->cur_dma_frame_idx + 2) {
|
||||||
if (idx == fgdev->cur_dma_frame_idx + 2) {
|
if (setup_frame_transfer(fgdev, buf, idx - 1))
|
||||||
if (setup_frame_transfer(fgdev, buf, idx - 1))
|
dev_err(dev, "unable to map DMA buffer\n");
|
||||||
dev_err(dev, "unable to map DMA buffer\n");
|
need_ack = 0;
|
||||||
need_ack = 0;
|
|
||||||
} else {
|
|
||||||
dev_err(dev, "frame mismatch, got %d, expected %d\n",
|
|
||||||
idx, fgdev->cur_dma_frame_idx + 2);
|
|
||||||
|
|
||||||
/* FIXME: handle dropped triplets here */
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
dev_err(dev, "cannot setup DMA, no buffer\n");
|
dev_err(dev, "frame mismatch, got %d, expected %d\n",
|
||||||
|
idx, fgdev->cur_dma_frame_idx + 2);
|
||||||
|
|
||||||
|
/* FIXME: handle dropped triplets here */
|
||||||
}
|
}
|
||||||
|
|
||||||
return need_ack;
|
return need_ack;
|
||||||
|
Reference in New Issue
Block a user