Ticket #1270: bdbuf.c.fix_race_conds.diff

File bdbuf.c.fix_race_conds.diff, 5.4 KB (added by strauman, on Jan 6, 2008 at 4:38:04 AM)

patch to fix mentioned race conditions

Line 
1Index: bdbuf.c
2===================================================================
3RCS file: /usr1/CVS/rtems/cpukit/libblock/src/bdbuf.c,v
4retrieving revision 1.16.2.1
5diff -c -r1.16.2.1 bdbuf.c
6*** bdbuf.c     18 Dec 2006 09:46:59 -0000      1.16.2.1
7--- bdbuf.c     6 Jan 2008 01:17:48 -0000
8***************
9*** 1012,1023 ****
10              Chain_Extract(&bd_buf->link);
11          }
12          bd_buf->use_count++;
13          while (bd_buf->in_progress != 0)
14          {
15-             rtems_interrupt_disable(level);
16              _CORE_mutex_Seize(&bd_buf->transfer_sema, 0, TRUE,
17                                WATCHDOG_NO_TIMEOUT, level);
18          }
19 
20          *ret_buf = bd_buf;
21          return RTEMS_SUCCESSFUL;
22--- 1012,1025 ----
23              Chain_Extract(&bd_buf->link);
24          }
25          bd_buf->use_count++;
26+         rtems_interrupt_disable(level);
27          while (bd_buf->in_progress != 0)
28          {
29              _CORE_mutex_Seize(&bd_buf->transfer_sema, 0, TRUE,
30                                WATCHDOG_NO_TIMEOUT, level);
31+               rtems_interrupt_disable(level);
32          }
33+         rtems_interrupt_enable(level);
34 
35          *ret_buf = bd_buf;
36          return RTEMS_SUCCESSFUL;
37***************
38*** 1157,1174 ****
39    bdbuf_buffer *bd_buf;
40    int i;
41    for (i = 0;i < bd_buf_group->cnt;i++) {
42!     bd_buf = bd_buf_group->bd_bufs[i];
43!
44!     bd_buf->status = status;
45!     bd_buf->error = RTEMS_IO_ERROR;
46      _CORE_mutex_Surrender(&bd_buf->transfer_sema, 0, NULL);
47      _CORE_mutex_Flush(&bd_buf->transfer_sema, NULL,
48                        CORE_MUTEX_STATUS_SUCCESSFUL);
49    }
50  #else
51      bdbuf_buffer *bd_buf = arg;
52!     bd_buf->status = status;
53!     bd_buf->error = RTEMS_IO_ERROR;
54      _CORE_mutex_Surrender(&bd_buf->transfer_sema, 0, NULL);
55      _CORE_mutex_Flush(&bd_buf->transfer_sema, NULL,
56                        CORE_MUTEX_STATUS_SUCCESSFUL);
57--- 1159,1179 ----
58    bdbuf_buffer *bd_buf;
59    int i;
60    for (i = 0;i < bd_buf_group->cnt;i++) {
61!     bd_buf              = bd_buf_group->bd_bufs[i];
62!     bd_buf->status      = status;
63!     bd_buf->error       = RTEMS_IO_ERROR;
64!       bd_buf->actual      = TRUE;
65!       bd_buf->in_progress = FALSE;
66      _CORE_mutex_Surrender(&bd_buf->transfer_sema, 0, NULL);
67      _CORE_mutex_Flush(&bd_buf->transfer_sema, NULL,
68                        CORE_MUTEX_STATUS_SUCCESSFUL);
69    }
70  #else
71      bdbuf_buffer *bd_buf = arg;
72!     bd_buf->status       = status;
73!     bd_buf->error        = RTEMS_IO_ERROR;
74!       bd_buf->actual       = TRUE;
75!       bd_buf->in_progress  = FALSE;
76      _CORE_mutex_Surrender(&bd_buf->transfer_sema, 0, NULL);
77      _CORE_mutex_Flush(&bd_buf->transfer_sema, NULL,
78                        CORE_MUTEX_STATUS_SUCCESSFUL);
79***************
80*** 1237,1243 ****
81 
82      if (!bd_buf->actual)
83      {
84!         bd_buf->in_progress = 1;
85 
86          req.req.req = BLKDEV_REQ_READ;
87          req.req.req_done = bdbuf_read_transfer_done;
88--- 1242,1248 ----
89 
90      if (!bd_buf->actual)
91      {
92!         bd_buf->in_progress = TRUE;
93 
94          req.req.req = BLKDEV_REQ_READ;
95          req.req.req_done = bdbuf_read_transfer_done;
96***************
97*** 1255,1269 ****
98              bd_buf->status = RTEMS_IO_ERROR;
99              bd_buf->error = errno;
100              bd_buf->actual = FALSE;
101          }
102          else
103          {
104              rtems_interrupt_disable(level);
105              _CORE_mutex_Seize(&bd_buf->transfer_sema, 0, TRUE,
106                                WATCHDOG_NO_TIMEOUT, level);
107-             bd_buf->actual = TRUE;
108          }
109-         bd_buf->in_progress = FALSE;
110      }
111      rtems_disk_release(dd);
112 
113--- 1260,1273 ----
114              bd_buf->status = RTEMS_IO_ERROR;
115              bd_buf->error = errno;
116              bd_buf->actual = FALSE;
117+               bd_buf->in_progress = FALSE;
118          }
119          else
120          {
121              rtems_interrupt_disable(level);
122              _CORE_mutex_Seize(&bd_buf->transfer_sema, 0, TRUE,
123                                WATCHDOG_NO_TIMEOUT, level);
124          }
125      }
126      rtems_disk_release(dd);
127 
128***************
129*** 1389,1403 ****
130              bd_buf->status = RTEMS_IO_ERROR;
131              bd_buf->error = errno;
132              bd_buf->actual = FALSE;
133            }
134          else
135            {
136              rtems_interrupt_disable(level);
137              _CORE_mutex_Seize(&bd_buf->transfer_sema, 0, TRUE,
138                                WATCHDOG_NO_TIMEOUT, level);
139-             bd_buf->actual = TRUE;
140            }   
141-         bd_buf->in_progress = FALSE;
142          /* release any pre-read buffers */
143          if (i > 0) {
144            bdbuf_release(bd_buf);
145--- 1393,1406 ----
146              bd_buf->status = RTEMS_IO_ERROR;
147              bd_buf->error = errno;
148              bd_buf->actual = FALSE;
149+                 bd_buf->in_progress = FALSE;
150            }
151          else
152            {
153              rtems_interrupt_disable(level);
154              _CORE_mutex_Seize(&bd_buf->transfer_sema, 0, TRUE,
155                                WATCHDOG_NO_TIMEOUT, level);
156            }   
157          /* release any pre-read buffers */
158          if (i > 0) {
159            bdbuf_release(bd_buf);
160***************
161*** 1769,1778 ****
162            }
163          else
164            {
165              if (bd_buf->in_progress)
166                {
167-                 rtems_interrupt_disable(level);
168                  _CORE_mutex_Seize(&bd_buf->transfer_sema, 0, TRUE, 0, level);
169                }
170            }
171          bd_buf->use_count--;
172--- 1772,1784 ----
173            }
174          else
175            {
176+           rtems_interrupt_disable(level);
177              if (bd_buf->in_progress)
178                {
179                  _CORE_mutex_Seize(&bd_buf->transfer_sema, 0, TRUE, 0, level);
180+               } else
181+               {
182+                 rtems_interrupt_enable(level);
183                }
184            }
185          bd_buf->use_count--;