mirror of
https://github.com/freebsd/freebsd-src.git
synced 2024-12-04 12:28:58 +00:00
First set of changes to eliminate the ad-hoc device buffer queues,
replacing them with TAILQ's as appropriate. The SCSI code is the first to be changed -- until the changes are complete, both b_act and b_actf will be in the buf structure. b_actf will eventually be removed.
This commit is contained in:
parent
fb9ca17e1e
commit
68a2196fad
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=12408
@ -14,7 +14,7 @@
|
||||
*
|
||||
* Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
|
||||
*
|
||||
* $Id: cd.c,v 1.42 1995/10/21 23:13:06 phk Exp $
|
||||
* $Id: cd.c,v 1.43 1995/11/15 03:27:14 asami Exp $
|
||||
*/
|
||||
|
||||
#define SPLCD splbio
|
||||
@ -83,7 +83,7 @@ struct scsi_data {
|
||||
#define CDOPEN 0x01
|
||||
u_int32 openparts; /* one bit for each open partition */
|
||||
u_int32 xfer_block_wait;
|
||||
struct buf buf_queue;
|
||||
struct buf_queue_head buf_queue;
|
||||
int dkunit;
|
||||
};
|
||||
|
||||
@ -180,6 +180,7 @@ cdattach(struct scsi_link *sc_link)
|
||||
unit = sc_link->dev_unit;
|
||||
dp = &(cd->params);
|
||||
|
||||
TAILQ_INIT(&cd->buf_queue);
|
||||
if (sc_link->opennings > CDOUTSTANDING)
|
||||
sc_link->opennings = CDOUTSTANDING;
|
||||
/*
|
||||
@ -359,7 +360,6 @@ cd_close(dev_t dev, int flag, int fmt, struct proc *p,
|
||||
void
|
||||
cd_strategy(struct buf *bp, struct scsi_link *sc_link)
|
||||
{
|
||||
struct buf *dp;
|
||||
u_int32 opri;
|
||||
u_int32 unit = CDUNIT((bp->b_dev));
|
||||
struct scsi_data *cd = sc_link->sd;
|
||||
@ -396,7 +396,6 @@ cd_strategy(struct buf *bp, struct scsi_link *sc_link)
|
||||
bp->b_resid = 0;
|
||||
}
|
||||
opri = SPLCD();
|
||||
dp = &cd->buf_queue;
|
||||
|
||||
/*
|
||||
* Use a bounce buffer if necessary
|
||||
@ -409,7 +408,7 @@ cd_strategy(struct buf *bp, struct scsi_link *sc_link)
|
||||
/*
|
||||
* Place it in the queue of disk activities for this disk
|
||||
*/
|
||||
disksort(dp, bp);
|
||||
TAILQ_INSERT_TAIL(&cd->buf_queue, bp, b_act);
|
||||
|
||||
/*
|
||||
* Tell the device to get going on the transfer if it's
|
||||
@ -453,7 +452,6 @@ cdstart(unit, flags)
|
||||
u_int32 flags;
|
||||
{
|
||||
register struct buf *bp = 0;
|
||||
register struct buf *dp;
|
||||
struct scsi_rw_big cmd;
|
||||
u_int32 blkno, nblk;
|
||||
struct partition *p;
|
||||
@ -471,12 +469,13 @@ cdstart(unit, flags)
|
||||
if (sc_link->flags & SDEV_WAITING) { /* is room, but a special waits */
|
||||
return; /* give the special that's waiting a chance to run */
|
||||
}
|
||||
dp = &cd->buf_queue;
|
||||
if ((bp = dp->b_actf) != NULL) { /* yes, an assign */
|
||||
dp->b_actf = bp->b_actf;
|
||||
} else {
|
||||
|
||||
bp = cd->buf_queue.tqh_first;
|
||||
if (bp == NULL) { /* yes, an assign */
|
||||
return;
|
||||
}
|
||||
TAILQ_REMOVE( &cd->buf_queue, bp, b_act);
|
||||
|
||||
/*
|
||||
* Should reject all queued entries if SDEV_MEDIA_LOADED is not true.
|
||||
*/
|
||||
|
@ -28,7 +28,7 @@
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
||||
* THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $Id: od.c,v 1.7 1995/07/04 15:12:53 shun Exp $
|
||||
* $Id: od.c,v 1.1 1995/10/31 17:25:58 joerg Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -93,7 +93,7 @@ struct scsi_data {
|
||||
u_int32 disksize; /* total number sectors */
|
||||
} params;
|
||||
struct diskslices *dk_slices; /* virtual drives */
|
||||
struct buf buf_queue;
|
||||
struct buf_queue_head buf_queue;
|
||||
int dkunit; /* disk stats unit number */
|
||||
};
|
||||
|
||||
@ -191,6 +191,8 @@ odattach(struct scsi_link *sc_link)
|
||||
|
||||
if (sc_link->opennings > ODOUTSTANDING)
|
||||
sc_link->opennings = ODOUTSTANDING;
|
||||
|
||||
TAILQ_INIT(&od->buf_queue);
|
||||
/*
|
||||
* Use the subdriver to request information regarding
|
||||
* the drive. We cannot use interrupts yet, so the
|
||||
@ -381,7 +383,6 @@ od_close(dev, fflag, fmt, p, sc_link)
|
||||
void
|
||||
od_strategy(struct buf *bp, struct scsi_link *sc_link)
|
||||
{
|
||||
struct buf *dp;
|
||||
u_int32 opri;
|
||||
struct scsi_data *od;
|
||||
u_int32 unit;
|
||||
@ -412,7 +413,6 @@ od_strategy(struct buf *bp, struct scsi_link *sc_link)
|
||||
goto done; /* XXX check b_resid */
|
||||
|
||||
opri = SPLOD();
|
||||
dp = &od->buf_queue;
|
||||
|
||||
/*
|
||||
* Use a bounce buffer if necessary
|
||||
@ -425,7 +425,7 @@ od_strategy(struct buf *bp, struct scsi_link *sc_link)
|
||||
/*
|
||||
* Place it in the queue of disk activities for this disk
|
||||
*/
|
||||
disksort(dp, bp);
|
||||
TAILQ_INSERT_TAIL(&od->buf_queue, bp, b_act);
|
||||
|
||||
/*
|
||||
* Tell the device to get going on the transfer if it's
|
||||
@ -479,7 +479,6 @@ odstart(u_int32 unit, u_int32 flags)
|
||||
register struct scsi_link *sc_link = SCSI_LINK(&od_switch, unit);
|
||||
register struct scsi_data *od = sc_link->sd;
|
||||
struct buf *bp = 0;
|
||||
struct buf *dp;
|
||||
struct scsi_rw_big cmd;
|
||||
u_int32 blkno, nblk;
|
||||
|
||||
@ -500,11 +499,11 @@ odstart(u_int32 unit, u_int32 flags)
|
||||
/*
|
||||
* See if there is a buf with work for us to do..
|
||||
*/
|
||||
dp = &od->buf_queue;
|
||||
if ((bp = dp->b_actf) == NULL) { /* yes, an assign */
|
||||
bp = od->buf_queue.tqh_first;
|
||||
if (bp == NULL) { /* yes, an assign */
|
||||
return;
|
||||
}
|
||||
dp->b_actf = bp->b_actf;
|
||||
TAILQ_REMOVE( &od->buf_queue, bp, b_act);
|
||||
|
||||
/*
|
||||
* If the device has become invalid, abort all the
|
||||
|
@ -37,7 +37,7 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: pt.c,v 1.4 1995/05/03 18:09:09 dufault Exp $
|
||||
* $Id: pt.c,v 1.5 1995/05/30 08:13:23 rgrimes Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -54,7 +54,7 @@
|
||||
#include <scsi/scsiconf.h>
|
||||
|
||||
struct scsi_data {
|
||||
struct buf *buf_queue; /* the queue of pending IO operations */
|
||||
struct buf_queue_head buf_queue;
|
||||
};
|
||||
|
||||
void ptstart(u_int32 unit, u_int32 flags);
|
||||
@ -131,10 +131,12 @@ ptstart(unit, flags)
|
||||
wakeup((caddr_t)sc_link);
|
||||
return;
|
||||
}
|
||||
if ((bp = pt->buf_queue) == NULL) {
|
||||
return; /* no work to bother with */
|
||||
|
||||
bp = pt->buf_queue.tqh_first;
|
||||
if (bp == NULL) { /* yes, an assign */
|
||||
return;
|
||||
}
|
||||
pt->buf_queue = bp->b_actf;
|
||||
TAILQ_REMOVE( &pt->buf_queue, bp, b_act);
|
||||
|
||||
/*
|
||||
* Fill out the scsi command
|
||||
@ -196,12 +198,7 @@ pt_strategy(struct buf *bp, struct scsi_link *sc_link)
|
||||
* at the end (a bit silly because we only have one user..
|
||||
* (but it could fork() ))
|
||||
*/
|
||||
dp = &(pt->buf_queue);
|
||||
while (*dp) {
|
||||
dp = &((*dp)->b_actf);
|
||||
}
|
||||
*dp = bp;
|
||||
bp->b_actf = NULL;
|
||||
TAILQ_INSERT_TAIL( &pt->buf_queue, bp, b_act);
|
||||
|
||||
/*
|
||||
* Tell the device to get going on the transfer if it's
|
||||
|
@ -37,7 +37,7 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: sctarg.c,v 1.3 1995/05/30 08:13:49 rgrimes Exp $
|
||||
* $Id: sctarg.c,v 1.4 1995/07/13 16:08:57 bde Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -56,7 +56,7 @@
|
||||
#define OPEN 0x01
|
||||
|
||||
struct scsi_data {
|
||||
struct buf *buf_queue; /* the queue of pending IO operations */
|
||||
struct buf_queue_head buf_queue;
|
||||
int flags; /* Already open */
|
||||
};
|
||||
|
||||
@ -189,10 +189,12 @@ sctargstart(unit, unused_flags)
|
||||
wakeup((caddr_t)sc_link);
|
||||
return;
|
||||
}
|
||||
if ((bp = sctarg->buf_queue) == NULL) {
|
||||
return; /* no work to bother with */
|
||||
|
||||
bp = sctarg->buf_queue.tqh_first;
|
||||
if (bp == NULL) { /* yes, an assign */
|
||||
return;
|
||||
}
|
||||
sctarg->buf_queue = bp->b_actf;
|
||||
TAILQ_REMOVE( &pt->buf_queue, bp, b_act);
|
||||
|
||||
/*
|
||||
* Fill out the scsi command
|
||||
@ -253,12 +255,7 @@ sctarg_strategy(struct buf *bp, struct scsi_link *sc_link)
|
||||
/*
|
||||
* Place it at the end of the queue of activities for this device.
|
||||
*/
|
||||
dp = &(sctarg->buf_queue);
|
||||
while (*dp) {
|
||||
dp = &((*dp)->b_actf);
|
||||
}
|
||||
*dp = bp;
|
||||
bp->b_actf = NULL;
|
||||
TAILQ_INSERT_TAIL( &sctarg->buf_queue, bp, b_act);
|
||||
|
||||
/*
|
||||
* Tell the device to get going on the transfer if it's
|
||||
|
@ -14,7 +14,7 @@
|
||||
*
|
||||
* Ported to run under 386BSD by Julian Elischer (julian@dialix.oz.au) Sept 1992
|
||||
*
|
||||
* $Id: sd.c,v 1.68 1995/10/21 23:13:09 phk Exp $
|
||||
* $Id: sd.c,v 1.69 1995/11/06 08:19:24 davidg Exp $
|
||||
*/
|
||||
|
||||
#define SPLSD splbio
|
||||
@ -74,7 +74,7 @@ struct scsi_data {
|
||||
u_int32 disksize; /* total number sectors */
|
||||
} params;
|
||||
struct diskslices *dk_slices; /* virtual drives */
|
||||
struct buf buf_queue;
|
||||
struct buf_queue_head buf_queue;
|
||||
int dkunit; /* disk stats unit number */
|
||||
};
|
||||
|
||||
@ -172,6 +172,8 @@ sdattach(struct scsi_link *sc_link)
|
||||
|
||||
if (sc_link->opennings > SDOUTSTANDING)
|
||||
sc_link->opennings = SDOUTSTANDING;
|
||||
|
||||
TAILQ_INIT(&sd->buf_queue);
|
||||
/*
|
||||
* Use the subdriver to request information regarding
|
||||
* the drive. We cannot use interrupts yet, so the
|
||||
@ -357,7 +359,6 @@ sd_close(dev, fflag, fmt, p, sc_link)
|
||||
void
|
||||
sd_strategy(struct buf *bp, struct scsi_link *sc_link)
|
||||
{
|
||||
struct buf *dp;
|
||||
u_int32 opri;
|
||||
struct scsi_data *sd;
|
||||
u_int32 unit;
|
||||
@ -392,8 +393,6 @@ sd_strategy(struct buf *bp, struct scsi_link *sc_link)
|
||||
goto done; /* XXX check b_resid */
|
||||
|
||||
opri = SPLSD();
|
||||
dp = &sd->buf_queue;
|
||||
|
||||
/*
|
||||
* Use a bounce buffer if necessary
|
||||
*/
|
||||
@ -405,7 +404,7 @@ sd_strategy(struct buf *bp, struct scsi_link *sc_link)
|
||||
/*
|
||||
* Place it in the queue of disk activities for this disk
|
||||
*/
|
||||
disksort(dp, bp);
|
||||
TAILQ_INSERT_TAIL(&sd->buf_queue, bp, b_act);
|
||||
|
||||
/*
|
||||
* Tell the device to get going on the transfer if it's
|
||||
@ -459,7 +458,6 @@ sdstart(u_int32 unit, u_int32 flags)
|
||||
register struct scsi_link *sc_link = SCSI_LINK(&sd_switch, unit);
|
||||
register struct scsi_data *sd = sc_link->sd;
|
||||
struct buf *bp = 0;
|
||||
struct buf *dp;
|
||||
struct scsi_rw_big cmd;
|
||||
u_int32 blkno, nblk;
|
||||
|
||||
@ -480,12 +478,12 @@ sdstart(u_int32 unit, u_int32 flags)
|
||||
/*
|
||||
* See if there is a buf with work for us to do..
|
||||
*/
|
||||
dp = &sd->buf_queue;
|
||||
if ((bp = dp->b_actf) == NULL) { /* yes, an assign */
|
||||
bp = sd->buf_queue.tqh_first;
|
||||
if (bp == NULL) { /* yes, an assign */
|
||||
return;
|
||||
}
|
||||
dp->b_actf = bp->b_actf;
|
||||
bp->b_actf = NULL;
|
||||
TAILQ_REMOVE( &sd->buf_queue, bp, b_act);
|
||||
|
||||
|
||||
/*
|
||||
* If the device has become invalid, abort all the
|
||||
|
@ -12,7 +12,7 @@
|
||||
* on the understanding that TFS is not responsible for the correct
|
||||
* functioning of this software in any circumstances.
|
||||
*
|
||||
* $Id: st.c,v 1.41 1995/10/21 23:13:10 phk Exp $
|
||||
* $Id: st.c,v 1.42 1995/11/04 13:25:23 bde Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -218,7 +218,7 @@ struct scsi_data {
|
||||
* additional sense data needed
|
||||
* for mode sense/select.
|
||||
*/
|
||||
struct buf *buf_queue; /* the queue of pending IO operations */
|
||||
struct buf_queue_head buf_queue;
|
||||
struct scsi_xfer scsi_xfer; /* scsi xfer struct for this drive */
|
||||
u_int32 xfer_block_wait; /* is a process waiting? */
|
||||
};
|
||||
@ -328,6 +328,7 @@ stattach(struct scsi_link *sc_link)
|
||||
|
||||
unit = sc_link->dev_unit;
|
||||
|
||||
TAILQ_INIT(&st->buf_queue);
|
||||
/*
|
||||
* Check if the drive is a known criminal and take
|
||||
* Any steps needed to bring it into line
|
||||
@ -362,7 +363,6 @@ stattach(struct scsi_link *sc_link)
|
||||
/*
|
||||
* Set up the buf queue for this device
|
||||
*/
|
||||
st->buf_queue = 0;
|
||||
st->flags |= ST_INITIALIZED;
|
||||
st_registerdev(unit);
|
||||
|
||||
@ -899,7 +899,6 @@ done:
|
||||
void
|
||||
st_strategy(struct buf *bp, struct scsi_link *sc_link)
|
||||
{
|
||||
struct buf **dp;
|
||||
unsigned char unit; /* XXX Everywhere else unit is "u_int32". Please int? */
|
||||
u_int32 opri;
|
||||
struct scsi_data *st;
|
||||
@ -962,12 +961,7 @@ st_strategy(struct buf *bp, struct scsi_link *sc_link)
|
||||
* at the end (a bit silly because we only have on user..
|
||||
* (but it could fork() ))
|
||||
*/
|
||||
dp = &(st->buf_queue);
|
||||
while (*dp) {
|
||||
dp = &((*dp)->b_actf);
|
||||
}
|
||||
*dp = bp;
|
||||
bp->b_actf = NULL;
|
||||
TAILQ_INSERT_TAIL(&st->buf_queue, bp, b_act);
|
||||
|
||||
/*
|
||||
* Tell the device to get going on the transfer if it's
|
||||
@ -1025,10 +1019,12 @@ ststart(unit, flags)
|
||||
wakeup((caddr_t)sc_link);
|
||||
return;
|
||||
}
|
||||
if ((bp = st->buf_queue) == NULL) {
|
||||
return; /* no work to bother with */
|
||||
|
||||
bp = st->buf_queue.tqh_first;
|
||||
if (bp == NULL) { /* yes, an assign */
|
||||
return;
|
||||
}
|
||||
st->buf_queue = bp->b_actf;
|
||||
TAILQ_REMOVE( &st->buf_queue, bp, b_act);
|
||||
|
||||
/*
|
||||
* if the device has been unmounted by the user
|
||||
|
@ -37,7 +37,7 @@
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: worm.c,v 1.8 1995/10/09 15:15:01 joerg Exp $
|
||||
* $Id: worm.c,v 1.9 1995/10/21 23:13:11 phk Exp $
|
||||
*/
|
||||
|
||||
/* XXX This is PRELIMINARY.
|
||||
@ -60,8 +60,7 @@
|
||||
#include <scsi/scsi_disk.h>
|
||||
|
||||
struct scsi_data {
|
||||
struct buf *buf_queue; /* the queue of pending IO operations */
|
||||
|
||||
struct buf_queue_head buf_queue;
|
||||
u_int32 n_blks; /* Number of blocks (0 for bogus) */
|
||||
u_int32 blk_size; /* Size of each blocks */
|
||||
};
|
||||
@ -131,6 +130,8 @@ wormattach(struct scsi_link *sc_link)
|
||||
{
|
||||
struct scsi_data *worm = sc_link->sd;
|
||||
|
||||
TAILQ_INIT(&worm->buf_queue);
|
||||
|
||||
printf("- UNTESTED ");
|
||||
|
||||
if (worm_size(sc_link, SCSI_NOSLEEP | SCSI_NOMASK) == 0)
|
||||
@ -204,10 +205,12 @@ wormstart(unit, flags)
|
||||
wakeup(sc_link);
|
||||
return;
|
||||
}
|
||||
if ((bp = worm->buf_queue) == NULL) {
|
||||
return; /* no work to bother with */
|
||||
|
||||
bp = worm->buf_queue.tqh_first;
|
||||
if (bp == NULL) { /* yes, an assign */
|
||||
return;
|
||||
}
|
||||
worm->buf_queue = bp->b_actf;
|
||||
TAILQ_REMOVE( &worm->buf_queue, bp, b_act);
|
||||
|
||||
/*
|
||||
* Fill out the scsi command
|
||||
@ -289,12 +292,7 @@ worm_strategy(struct buf *bp, struct scsi_link *sc_link)
|
||||
* Place it in the queue of activities for this device
|
||||
* at the end.
|
||||
*/
|
||||
dp = &(worm->buf_queue);
|
||||
while (*dp) {
|
||||
dp = &((*dp)->b_actf);
|
||||
}
|
||||
*dp = bp;
|
||||
bp->b_actf = NULL;
|
||||
TAILQ_INSERT_TAIL(&worm->buf_queue, bp, b_act);
|
||||
|
||||
wormstart(unit, 0);
|
||||
|
||||
|
@ -36,7 +36,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)buf.h 8.7 (Berkeley) 1/21/94
|
||||
* $Id: buf.h,v 1.21 1995/08/24 12:57:17 davidg Exp $
|
||||
* $Id: buf.h,v 1.22 1995/11/19 19:54:31 dyson Exp $
|
||||
*/
|
||||
|
||||
#ifndef _SYS_BUF_H_
|
||||
@ -57,6 +57,8 @@ struct iodone_chain {
|
||||
} ic_args[5];
|
||||
};
|
||||
|
||||
typedef TAILQ_HEAD(buf_queue_head, buf) buf_queue_head, *buf_queue_head_t;
|
||||
|
||||
/*
|
||||
* The buffer header describes an I/O operation in the kernel.
|
||||
*/
|
||||
@ -64,7 +66,8 @@ struct buf {
|
||||
LIST_ENTRY(buf) b_hash; /* Hash chain. */
|
||||
LIST_ENTRY(buf) b_vnbufs; /* Buffer's associated vnode. */
|
||||
TAILQ_ENTRY(buf) b_freelist; /* Free list position if not active. */
|
||||
struct buf *b_actf, **b_actb; /* Device driver queue when active. */
|
||||
struct buf *b_actf, **b_actb; /* Device driver queue when active. *depricated* XXX */
|
||||
TAILQ_ENTRY(buf) b_act; /* Device driver queue when active. *new* */
|
||||
struct proc *b_proc; /* Associated proc; NULL if kernel. */
|
||||
volatile long b_flags; /* B_* flags. */
|
||||
int b_qindex; /* buffer queue index */
|
||||
|
@ -36,7 +36,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)buf.h 8.7 (Berkeley) 1/21/94
|
||||
* $Id: buf.h,v 1.21 1995/08/24 12:57:17 davidg Exp $
|
||||
* $Id: buf.h,v 1.22 1995/11/19 19:54:31 dyson Exp $
|
||||
*/
|
||||
|
||||
#ifndef _SYS_BUF_H_
|
||||
@ -57,6 +57,8 @@ struct iodone_chain {
|
||||
} ic_args[5];
|
||||
};
|
||||
|
||||
typedef TAILQ_HEAD(buf_queue_head, buf) buf_queue_head, *buf_queue_head_t;
|
||||
|
||||
/*
|
||||
* The buffer header describes an I/O operation in the kernel.
|
||||
*/
|
||||
@ -64,7 +66,8 @@ struct buf {
|
||||
LIST_ENTRY(buf) b_hash; /* Hash chain. */
|
||||
LIST_ENTRY(buf) b_vnbufs; /* Buffer's associated vnode. */
|
||||
TAILQ_ENTRY(buf) b_freelist; /* Free list position if not active. */
|
||||
struct buf *b_actf, **b_actb; /* Device driver queue when active. */
|
||||
struct buf *b_actf, **b_actb; /* Device driver queue when active. *depricated* XXX */
|
||||
TAILQ_ENTRY(buf) b_act; /* Device driver queue when active. *new* */
|
||||
struct proc *b_proc; /* Associated proc; NULL if kernel. */
|
||||
volatile long b_flags; /* B_* flags. */
|
||||
int b_qindex; /* buffer queue index */
|
||||
|
Loading…
Reference in New Issue
Block a user