uint m_bm_maxlevels[2]; /* XFS_BM_MAXLEVELS */
uint m_in_maxlevels; /* XFS_IN_MAXLEVELS */
struct xfs_perag *m_perag; /* per-ag accounting info */
- mrlock_t m_peraglock; /* lock for m_perag (pointer) */
+ struct rw_semaphore m_peraglock; /* lock for m_perag (pointer) */
sema_t m_growlock; /* growfs mutex */
int m_fixedfsid[2]; /* unchanged for life of FS */
uint m_dmevmask; /* DMI events for this FS */
#define XFS_MOUNT_NOALIGN 0 /* ignored in userspace */
#define XFS_MOUNT_32BITINODES 0x1 /* enforce in userspace */
#define XFS_ILOCK_EXCL 0
+#define down_read(a) ((void) 0)
+#define up_read(a) ((void) 0)
#define mrlock(a,b,c) ((void) 0)
#define mraccunlock(a) ((void) 0)
#define mrunlock(a) ((void) 0)
* These three force us into a single a.g.
*/
args->agno = XFS_FSB_TO_AGNO(mp, args->fsbno);
- mrlock(&mp->m_peraglock, MR_ACCESS, PINOD);
+ down_read(&mp->m_peraglock);
args->pag = &mp->m_perag[args->agno];
minleft = args->minleft;
args->minleft = 0;
goto error0;
}
if (!args->agbp) {
- mrunlock(&mp->m_peraglock);
+ up_read(&mp->m_peraglock);
TRACE_ALLOC("noagbp", args);
break;
}
args->agbno = XFS_FSB_TO_AGBNO(mp, args->fsbno);
if ((error = xfs_alloc_ag_vextent(args)))
goto error0;
- mrunlock(&mp->m_peraglock);
+ up_read(&mp->m_peraglock);
break;
case XFS_ALLOCTYPE_START_BNO:
/*
* Loop over allocation groups twice; first time with
* trylock set, second time without.
*/
- mrlock(&mp->m_peraglock, MR_ACCESS, PINOD);
+ down_read(&mp->m_peraglock);
for (;;) {
args->pag = &mp->m_perag[args->agno];
if ((error = xfs_alloc_fix_freelist(args, flags))) {
}
}
}
- mrunlock(&mp->m_peraglock);
+ up_read(&mp->m_peraglock);
if (bump_rotor || (type == XFS_ALLOCTYPE_ANY_AG))
mp->m_agfrotor = (args->agno + 1) % mp->m_sb.sb_agcount;
break;
}
return 0;
error0:
- mrunlock(&mp->m_peraglock);
+ up_read(&mp->m_peraglock);
return error;
}
args.agbno = XFS_FSB_TO_AGBNO(args.mp, bno);
args.alignment = 1;
args.minlen = args.minleft = args.minalignslop = 0;
- mrlock(&args.mp->m_peraglock, MR_ACCESS, PINOD);
+ down_read(&args.mp->m_peraglock);
args.pag = &args.mp->m_perag[args.agno];
if ((error = xfs_alloc_fix_freelist(&args, 0)))
goto error0;
error = xfs_free_ag_extent(tp, args.agbp, args.agno, args.agbno,
len, 0);
error0:
- mrunlock(&args.mp->m_peraglock);
+ up_read(&args.mp->m_peraglock);
return error;
}
*/
startag = ag = XFS_FSB_TO_AGNO(mp, args.fsbno);
notinit = 0;
- mrlock(&mp->m_peraglock, MR_ACCESS, PINOD);
+ down_read(&mp->m_peraglock);
while (blen < ap->alen) {
pag = &mp->m_perag[ag];
if (!pag->pagf_init &&
(error = xfs_alloc_pagf_init(mp, args.tp,
ag, XFS_ALLOC_FLAG_TRYLOCK))) {
- mrunlock(&mp->m_peraglock);
+ up_read(&mp->m_peraglock);
return error;
}
/*
if (ag == startag)
break;
}
- mrunlock(&mp->m_peraglock);
+ up_read(&mp->m_peraglock);
/*
* Since the above loop did a BUF_TRYLOCK, it is
* possible that there is space for this request.
}
INT_MOD(agi->agi_count, ARCH_CONVERT, newlen);
INT_MOD(agi->agi_freecount, ARCH_CONVERT, newlen);
- mraccess(&args.mp->m_peraglock);
+ down_read(&args.mp->m_peraglock);
args.mp->m_perag[INT_GET(agi->agi_seqno, ARCH_CONVERT)].pagi_freecount += newlen;
- mraccunlock(&args.mp->m_peraglock);
+ up_read(&args.mp->m_peraglock);
INT_SET(agi->agi_newino, ARCH_CONVERT, newino);
/*
* Insert records describing the new inode chunk into the btree.
*/
agno = pagno;
flags = XFS_ALLOC_FLAG_TRYLOCK;
- mraccess(&mp->m_peraglock);
+ down_read(&mp->m_peraglock);
for (;;) {
pag = &mp->m_perag[agno];
if (!pag->pagi_init) {
agbp = NULL;
goto nextag;
}
- mraccunlock(&mp->m_peraglock);
+ up_read(&mp->m_peraglock);
return agbp;
}
}
* down.
*/
if (XFS_FORCED_SHUTDOWN(mp)) {
- mraccunlock(&mp->m_peraglock);
+ up_read(&mp->m_peraglock);
return (xfs_buf_t *)0;
}
agno++;
agno = 0;
if (agno == pagno) {
if (flags == 0) {
- mraccunlock(&mp->m_peraglock);
+ up_read(&mp->m_peraglock);
return (xfs_buf_t *)0;
}
flags = 0;
*inop = NULLFSINO;
return noroom ? ENOSPC : 0;
}
- mraccess(&mp->m_peraglock);
+ down_read(&mp->m_peraglock);
if (mp->m_perag[tagno].pagi_inodeok == 0) {
- mraccunlock(&mp->m_peraglock);
+ up_read(&mp->m_peraglock);
goto nextag;
}
error = xfs_ialloc_read_agi(mp, tp, tagno, &agbp);
- mraccunlock(&mp->m_peraglock);
+ up_read(&mp->m_peraglock);
if (error)
goto nextag;
agi = XFS_BUF_TO_AGI(agbp);
goto error0;
INT_MOD(agi->agi_freecount, ARCH_CONVERT, -1);
xfs_ialloc_log_agi(tp, agbp, XFS_AGI_FREECOUNT);
- mraccess(&mp->m_peraglock);
+ down_read(&mp->m_peraglock);
mp->m_perag[tagno].pagi_freecount--;
- mraccunlock(&mp->m_peraglock);
+ up_read(&mp->m_peraglock);
#ifdef DEBUG
if (cur->bc_nlevels == 1) {
int freecount = 0;
offset_agbno = agbno & mp->m_inoalign_mask;
chunk_agbno = agbno - offset_agbno;
} else {
- mraccess(&mp->m_peraglock);
+ down_read(&mp->m_peraglock);
error = xfs_ialloc_read_agi(mp, tp, agno, &agbp);
- mraccunlock(&mp->m_peraglock);
+ up_read(&mp->m_peraglock);
if (error) {
#ifdef DEBUG
xfs_fs_cmn_err(CE_ALERT, mp, "xfs_dilocate: "
for (j = 0; j < bcount; j++) {
cycle = GET_CYCLE(buf, ARCH_CONVERT);
if (cycle == stop_on_cycle_no) {
- *new_blk = i;
+ *new_blk = i+j;
goto out;
}