<div><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt">libxfs_putbuf() is called with bp = NULL, resulting in pagefault in libpthread.</span></font></div>
<div><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt"></span></font> </div>
<div><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt">Function da_read_buf() allocate array of xfs_buf_t *</span></font></div>
<p><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt"> <strong> xfs_buf_t **bplist;</strong></span></font></p>
<p><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt"><strong> bplist = calloc(nex, sizeof(*bplist));</strong></span></font></p>
<p><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt">Read and fill it using </span></font></p>
<p><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt"><strong>for (i = 0; i < nex; i++) {<br> bplist[i] = libxfs_readbuf()</strong></span></font></p>
<p><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt"><strong> if (!bplist[i]){<br> goto failed;<br> } </strong></span></font></p>
<p><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt"><strong>}</strong></span></font></p>
<p><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt"><strong>failed:<br> for (i = 0; i < nex; i++)<br> libxfs_putbuf(bplist[i]);</strong></span></font></p>
<p><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt">Now assume nex = 10,</span></font></p>
<p><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt">1. Will create bplist for 10 array elements.</span></font></p>
<p><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt">3. Reading from disk 0,1, 2, 3</span></font></p>
<p><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt">4. When reading from disk 4, USB is removed</span></font></p>
<p><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt">5. libxfs_readbuf() will at fail, pblist[4] = NULL, goto failed.</span></font></p>
<p><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt">6. Since only 4 buffers were read successfully, so only 4 are in lock state.</span></font></p>
<p><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt">7. Error handling will unlock buffer from 1-10</span></font></p>
<p><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt">8. Buffer 0-3 were read successfully, hence will have valid pdlist[i]</span></font></p>
<p><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt">9. Access pblist[4] == NULL, therefore unlocking will set bp == NULL in libxfs_putbuf(bp);</span></font></p>
<div><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt">10. Page fault in libpthread</span></font></div>
<div><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt"></span></font> </div>
<div> </div>
<div><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt">Solution patch attached with mail</span></font></div>
<div><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt"></span></font> </div>
<div><font face="Bookman Old Style"><span style="FONT-FAMILY: Arial; FONT-SIZE: 9pt"></span></font> </div>