Dear John and everyone, I do not know the thread group means what in FreeBSD5.0. Could you give me some information? Now, I mask the code about thread group operations. When I want to get the RAIDFrame information(exist in the disk block). I can call raidread_component_label(), as the following: int raidread_component_label(dev, b_vp, clabel) udev_t dev; struct vnode *b_vp; RF_ComponentLabel_t *clabel; { struct buf *bp; int error; /* XXX should probably ensure that we don't try to do this if someone has changed rf_protected_sectors. */ if (b_vp == NULL) { /* For whatever reason, this component is not valid. Don't try to read a component label from it. */ return(EINVAL); } /* get a block of the appropriate size... */ bp = geteblk((int)RF_COMPONENT_INFO_SIZE); bp->b_dev = udev2dev(dev, 0); /* get our ducks in a row for the read */ bp->b_blkno = RF_COMPONENT_INFO_OFFSET / DEV_BSIZE; bp->b_bcount = RF_COMPONENT_INFO_SIZE; /*oyk add here to support FreeBSD5.0*/ bp->b_flags |= BIO_READ; bp->b_resid = RF_COMPONENT_INFO_SIZE / DEV_BSIZE; DEV_STRATEGY(bp, 0); error = bufwait(bp); bp->b_flags |= B_INVAL | B_AGE; bp->b_ioflags &= ~BIO_ERROR; if (!error) { memcpy(clabel, bp->b_data, sizeof(RF_ComponentLabel_t)); } brelse(bp); return(error); } Now, when I excute the 'error = bufwait(bp);', the system will be crash. the error information is also thread status SSLEEP. I do know what will cause the thread status change to SSLEEP. The function in FreeBSD4.x as following: int raidread_component_label(dev, b_vp, clabel) udev_t dev; struct vnode *b_vp; RF_ComponentLabel_t *clabel; { struct buf *bp; int error; /* XXX should probably ensure that we don't try to do this if someone has changed rf_protected_sectors. */ if (b_vp == NULL) { /* For whatever reason, this component is not valid. Don't try to read a component label from it. */ return(EINVAL); } /* get a block of the appropriate size... */ bp = geteblk((int)RF_COMPONENT_INFO_SIZE); bp->b_dev = udev2dev(dev, 0); /* get our ducks in a row for the read */ bp->b_blkno = RF_COMPONENT_INFO_OFFSET / DEV_BSIZE; bp->b_bcount = RF_COMPONENT_INFO_SIZE; bp->b_flags |= B_READ; bp->b_resid = RF_COMPONENT_INFO_SIZE / DEV_BSIZE; BUF_STRATEGY(bp, 0); error = biowait(bp); if (!error) { memcpy(clabel, bp->b_data, sizeof(RF_ComponentLabel_t)); } brelse(bp); return(error); } I transfer it to FreeBSD5.0 according vinum example. Best Regards Ouyang Kai 从网站得到更多信息。MSN Explorer 免费下载:http://explorer.msn.com/lccn |
I do not know the thread group means what in FreeBSD5.0. Could you give me some information? Now, I mask the code about thread group operations. When I want to get the RAIDFrame information(exist in the disk block). I can call raidread_component_label(), as the following: int raidread_component_label(dev, b_vp, clabel) udev_t dev; struct vnode *b_vp; RF_ComponentLabel_t *clabel; { struct buf *bp; int error; /* XXX should probably ensure that we don't try to do this if someone has changed rf_protected_sectors. */ if (b_vp == NULL) { /* For whatever reason, this component is not valid. Don't try to read a component label from it. */ return(EINVAL); }
/* get a block of the appropriate size... */ bp = geteblk((int)RF_COMPONENT_INFO_SIZE); bp->b_dev = udev2dev(dev, 0); /* get our ducks in a row for the read */ bp->b_blkno = RF_COMPONENT_INFO_OFFSET / DEV_BSIZE; bp->b_bcount = RF_COMPONENT_INFO_SIZE; /*oyk add here to support FreeBSD5.0*/ bp->b_flags |= BIO_READ; bp->b_resid = RF_COMPONENT_INFO_SIZE / DEV_BSIZE; DEV_STRATEGY(bp, 0); error = bufwait(bp); bp->b_flags |= B_INVAL | B_AGE; bp->b_ioflags &= ~BIO_ERROR; if (!error) { memcpy(clabel, bp->b_data, sizeof(RF_ComponentLabel_t)); } brelse(bp); return(error); } Now, when I excute the 'error = bufwait(bp);', the system will be crash. the error information is also thread status SSLEEP. I do know what will cause the thread status change to SSLEEP. The function in FreeBSD4.x as following: int raidread_component_label(dev, b_vp, clabel) udev_t dev; struct vnode *b_vp; RF_ComponentLabel_t *clabel; { struct buf *bp; int error; /* XXX should probably ensure that we don't try to do this if someone has changed rf_protected_sectors. */ if (b_vp == NULL) { /* For whatever reason, this component is not valid. Don't try to read a component label from it. */ return(EINVAL); } /* get a block of the appropriate size... */ bp = geteblk((int)RF_COMPONENT_INFO_SIZE); bp->b_dev = udev2dev(dev, 0); /* get our ducks in a row for the read */ bp->b_blkno = RF_COMPONENT_INFO_OFFSET / DEV_BSIZE; bp->b_bcount = RF_COMPONENT_INFO_SIZE; bp->b_flags |= B_READ; bp->b_resid = RF_COMPONENT_INFO_SIZE / DEV_BSIZE; BUF_STRATEGY(bp, 0); error = biowait(bp); if (!error) { memcpy(clabel, bp->b_data, sizeof(RF_ComponentLabel_t)); } brelse(bp); return(error); } I transfer it to FreeBSD5.0 according vinum example.