xfs_buf_t **bplist;
bplist = calloc(nex, sizeof(*bplist));
Read and fill it using
for (i = 0; i < nex; i++) {
bplist[i] = libxfs_readbuf()
if (!bplist[i]){
goto failed;
}
}
failed:
for (i = 0; i < nex; i++)
libxfs_putbuf(bplist[i]);
Now assume nex = 10,
1. Will create bplist for 10 array elements.
3. Reading from disk 0,1, 2, 3
4. When reading from disk 4, USB is removed
5. libxfs_readbuf() will at fail, pblist[4] = NULL, goto failed.
6. Since only 4 buffers were read successfully, so only 4 are in lock state.
7. Error handling will unlock buffer from 1-10
8. Buffer 0-3 were read successfully, hence will have valid pdlist[i]
9. Access pblist[4] == NULL, therefore unlocking will set bp == NULL in libxfs_putbuf(bp);
Attachment:
xfs_repair_da_read_buf_failed_unlock_fix.patch
Description: Binary data
_______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs