Merge branch 'xfs-misc-fixes-3.17-1' into for-next
This commit is contained in:
commit
4d7eece2c0
|
@ -1,6 +1,7 @@
|
|||
config XFS_FS
|
||||
tristate "XFS filesystem support"
|
||||
depends on BLOCK
|
||||
depends on (64BIT || LBDAF)
|
||||
select EXPORTFS
|
||||
select LIBCRC32C
|
||||
help
|
||||
|
|
|
@ -392,7 +392,7 @@ xfs_bmap_check_leaf_extents(
|
|||
pp = XFS_BMAP_BROOT_PTR_ADDR(mp, block, 1, ifp->if_broot_bytes);
|
||||
bno = be64_to_cpu(*pp);
|
||||
|
||||
ASSERT(bno != NULLDFSBNO);
|
||||
ASSERT(bno != NULLFSBLOCK);
|
||||
ASSERT(XFS_FSB_TO_AGNO(mp, bno) < mp->m_sb.sb_agcount);
|
||||
ASSERT(XFS_FSB_TO_AGBNO(mp, bno) < mp->m_sb.sb_agblocks);
|
||||
|
||||
|
@ -1299,7 +1299,7 @@ xfs_bmap_read_extents(
|
|||
ASSERT(level > 0);
|
||||
pp = XFS_BMAP_BROOT_PTR_ADDR(mp, block, 1, ifp->if_broot_bytes);
|
||||
bno = be64_to_cpu(*pp);
|
||||
ASSERT(bno != NULLDFSBNO);
|
||||
ASSERT(bno != NULLFSBLOCK);
|
||||
ASSERT(XFS_FSB_TO_AGNO(mp, bno) < mp->m_sb.sb_agcount);
|
||||
ASSERT(XFS_FSB_TO_AGBNO(mp, bno) < mp->m_sb.sb_agblocks);
|
||||
/*
|
||||
|
@ -1429,11 +1429,7 @@ xfs_bmap_search_multi_extents(
|
|||
gotp->br_startoff = 0xffa5a5a5a5a5a5a5LL;
|
||||
gotp->br_blockcount = 0xa55a5a5a5a5a5a5aLL;
|
||||
gotp->br_state = XFS_EXT_INVALID;
|
||||
#if XFS_BIG_BLKNOS
|
||||
gotp->br_startblock = 0xffffa5a5a5a5a5a5LL;
|
||||
#else
|
||||
gotp->br_startblock = 0xffffa5a5;
|
||||
#endif
|
||||
prevp->br_startoff = NULLFILEOFF;
|
||||
|
||||
ep = xfs_iext_bno_to_ext(ifp, bno, &lastx);
|
||||
|
|
|
@ -111,23 +111,8 @@ __xfs_bmbt_get_all(
|
|||
ext_flag = (int)(l0 >> (64 - BMBT_EXNTFLAG_BITLEN));
|
||||
s->br_startoff = ((xfs_fileoff_t)l0 &
|
||||
xfs_mask64lo(64 - BMBT_EXNTFLAG_BITLEN)) >> 9;
|
||||
#if XFS_BIG_BLKNOS
|
||||
s->br_startblock = (((xfs_fsblock_t)l0 & xfs_mask64lo(9)) << 43) |
|
||||
(((xfs_fsblock_t)l1) >> 21);
|
||||
#else
|
||||
#ifdef DEBUG
|
||||
{
|
||||
xfs_dfsbno_t b;
|
||||
|
||||
b = (((xfs_dfsbno_t)l0 & xfs_mask64lo(9)) << 43) |
|
||||
(((xfs_dfsbno_t)l1) >> 21);
|
||||
ASSERT((b >> 32) == 0 || isnulldstartblock(b));
|
||||
s->br_startblock = (xfs_fsblock_t)b;
|
||||
}
|
||||
#else /* !DEBUG */
|
||||
s->br_startblock = (xfs_fsblock_t)(((xfs_dfsbno_t)l1) >> 21);
|
||||
#endif /* DEBUG */
|
||||
#endif /* XFS_BIG_BLKNOS */
|
||||
s->br_blockcount = (xfs_filblks_t)(l1 & xfs_mask64lo(21));
|
||||
/* This is xfs_extent_state() in-line */
|
||||
if (ext_flag) {
|
||||
|
@ -163,21 +148,8 @@ xfs_fsblock_t
|
|||
xfs_bmbt_get_startblock(
|
||||
xfs_bmbt_rec_host_t *r)
|
||||
{
|
||||
#if XFS_BIG_BLKNOS
|
||||
return (((xfs_fsblock_t)r->l0 & xfs_mask64lo(9)) << 43) |
|
||||
(((xfs_fsblock_t)r->l1) >> 21);
|
||||
#else
|
||||
#ifdef DEBUG
|
||||
xfs_dfsbno_t b;
|
||||
|
||||
b = (((xfs_dfsbno_t)r->l0 & xfs_mask64lo(9)) << 43) |
|
||||
(((xfs_dfsbno_t)r->l1) >> 21);
|
||||
ASSERT((b >> 32) == 0 || isnulldstartblock(b));
|
||||
return (xfs_fsblock_t)b;
|
||||
#else /* !DEBUG */
|
||||
return (xfs_fsblock_t)(((xfs_dfsbno_t)r->l1) >> 21);
|
||||
#endif /* DEBUG */
|
||||
#endif /* XFS_BIG_BLKNOS */
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -241,7 +213,6 @@ xfs_bmbt_set_allf(
|
|||
ASSERT((startoff & xfs_mask64hi(64-BMBT_STARTOFF_BITLEN)) == 0);
|
||||
ASSERT((blockcount & xfs_mask64hi(64-BMBT_BLOCKCOUNT_BITLEN)) == 0);
|
||||
|
||||
#if XFS_BIG_BLKNOS
|
||||
ASSERT((startblock & xfs_mask64hi(64-BMBT_STARTBLOCK_BITLEN)) == 0);
|
||||
|
||||
r->l0 = ((xfs_bmbt_rec_base_t)extent_flag << 63) |
|
||||
|
@ -250,23 +221,6 @@ xfs_bmbt_set_allf(
|
|||
r->l1 = ((xfs_bmbt_rec_base_t)startblock << 21) |
|
||||
((xfs_bmbt_rec_base_t)blockcount &
|
||||
(xfs_bmbt_rec_base_t)xfs_mask64lo(21));
|
||||
#else /* !XFS_BIG_BLKNOS */
|
||||
if (isnullstartblock(startblock)) {
|
||||
r->l0 = ((xfs_bmbt_rec_base_t)extent_flag << 63) |
|
||||
((xfs_bmbt_rec_base_t)startoff << 9) |
|
||||
(xfs_bmbt_rec_base_t)xfs_mask64lo(9);
|
||||
r->l1 = xfs_mask64hi(11) |
|
||||
((xfs_bmbt_rec_base_t)startblock << 21) |
|
||||
((xfs_bmbt_rec_base_t)blockcount &
|
||||
(xfs_bmbt_rec_base_t)xfs_mask64lo(21));
|
||||
} else {
|
||||
r->l0 = ((xfs_bmbt_rec_base_t)extent_flag << 63) |
|
||||
((xfs_bmbt_rec_base_t)startoff << 9);
|
||||
r->l1 = ((xfs_bmbt_rec_base_t)startblock << 21) |
|
||||
((xfs_bmbt_rec_base_t)blockcount &
|
||||
(xfs_bmbt_rec_base_t)xfs_mask64lo(21));
|
||||
}
|
||||
#endif /* XFS_BIG_BLKNOS */
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -298,8 +252,6 @@ xfs_bmbt_disk_set_allf(
|
|||
ASSERT(state == XFS_EXT_NORM || state == XFS_EXT_UNWRITTEN);
|
||||
ASSERT((startoff & xfs_mask64hi(64-BMBT_STARTOFF_BITLEN)) == 0);
|
||||
ASSERT((blockcount & xfs_mask64hi(64-BMBT_BLOCKCOUNT_BITLEN)) == 0);
|
||||
|
||||
#if XFS_BIG_BLKNOS
|
||||
ASSERT((startblock & xfs_mask64hi(64-BMBT_STARTBLOCK_BITLEN)) == 0);
|
||||
|
||||
r->l0 = cpu_to_be64(
|
||||
|
@ -310,26 +262,6 @@ xfs_bmbt_disk_set_allf(
|
|||
((xfs_bmbt_rec_base_t)startblock << 21) |
|
||||
((xfs_bmbt_rec_base_t)blockcount &
|
||||
(xfs_bmbt_rec_base_t)xfs_mask64lo(21)));
|
||||
#else /* !XFS_BIG_BLKNOS */
|
||||
if (isnullstartblock(startblock)) {
|
||||
r->l0 = cpu_to_be64(
|
||||
((xfs_bmbt_rec_base_t)extent_flag << 63) |
|
||||
((xfs_bmbt_rec_base_t)startoff << 9) |
|
||||
(xfs_bmbt_rec_base_t)xfs_mask64lo(9));
|
||||
r->l1 = cpu_to_be64(xfs_mask64hi(11) |
|
||||
((xfs_bmbt_rec_base_t)startblock << 21) |
|
||||
((xfs_bmbt_rec_base_t)blockcount &
|
||||
(xfs_bmbt_rec_base_t)xfs_mask64lo(21)));
|
||||
} else {
|
||||
r->l0 = cpu_to_be64(
|
||||
((xfs_bmbt_rec_base_t)extent_flag << 63) |
|
||||
((xfs_bmbt_rec_base_t)startoff << 9));
|
||||
r->l1 = cpu_to_be64(
|
||||
((xfs_bmbt_rec_base_t)startblock << 21) |
|
||||
((xfs_bmbt_rec_base_t)blockcount &
|
||||
(xfs_bmbt_rec_base_t)xfs_mask64lo(21)));
|
||||
}
|
||||
#endif /* XFS_BIG_BLKNOS */
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -365,24 +297,11 @@ xfs_bmbt_set_startblock(
|
|||
xfs_bmbt_rec_host_t *r,
|
||||
xfs_fsblock_t v)
|
||||
{
|
||||
#if XFS_BIG_BLKNOS
|
||||
ASSERT((v & xfs_mask64hi(12)) == 0);
|
||||
r->l0 = (r->l0 & (xfs_bmbt_rec_base_t)xfs_mask64hi(55)) |
|
||||
(xfs_bmbt_rec_base_t)(v >> 43);
|
||||
r->l1 = (r->l1 & (xfs_bmbt_rec_base_t)xfs_mask64lo(21)) |
|
||||
(xfs_bmbt_rec_base_t)(v << 21);
|
||||
#else /* !XFS_BIG_BLKNOS */
|
||||
if (isnullstartblock(v)) {
|
||||
r->l0 |= (xfs_bmbt_rec_base_t)xfs_mask64lo(9);
|
||||
r->l1 = (xfs_bmbt_rec_base_t)xfs_mask64hi(11) |
|
||||
((xfs_bmbt_rec_base_t)v << 21) |
|
||||
(r->l1 & (xfs_bmbt_rec_base_t)xfs_mask64lo(21));
|
||||
} else {
|
||||
r->l0 &= ~(xfs_bmbt_rec_base_t)xfs_mask64lo(9);
|
||||
r->l1 = ((xfs_bmbt_rec_base_t)v << 21) |
|
||||
(r->l1 & (xfs_bmbt_rec_base_t)xfs_mask64lo(21));
|
||||
}
|
||||
#endif /* XFS_BIG_BLKNOS */
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -438,8 +357,8 @@ xfs_bmbt_to_bmdr(
|
|||
cpu_to_be64(XFS_BUF_DADDR_NULL));
|
||||
} else
|
||||
ASSERT(rblock->bb_magic == cpu_to_be32(XFS_BMAP_MAGIC));
|
||||
ASSERT(rblock->bb_u.l.bb_leftsib == cpu_to_be64(NULLDFSBNO));
|
||||
ASSERT(rblock->bb_u.l.bb_rightsib == cpu_to_be64(NULLDFSBNO));
|
||||
ASSERT(rblock->bb_u.l.bb_leftsib == cpu_to_be64(NULLFSBLOCK));
|
||||
ASSERT(rblock->bb_u.l.bb_rightsib == cpu_to_be64(NULLFSBLOCK));
|
||||
ASSERT(rblock->bb_level != 0);
|
||||
dblock->bb_level = rblock->bb_level;
|
||||
dblock->bb_numrecs = rblock->bb_numrecs;
|
||||
|
@ -763,11 +682,11 @@ xfs_bmbt_verify(
|
|||
|
||||
/* sibling pointer verification */
|
||||
if (!block->bb_u.l.bb_leftsib ||
|
||||
(block->bb_u.l.bb_leftsib != cpu_to_be64(NULLDFSBNO) &&
|
||||
(block->bb_u.l.bb_leftsib != cpu_to_be64(NULLFSBLOCK) &&
|
||||
!XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_u.l.bb_leftsib))))
|
||||
return false;
|
||||
if (!block->bb_u.l.bb_rightsib ||
|
||||
(block->bb_u.l.bb_rightsib != cpu_to_be64(NULLDFSBNO) &&
|
||||
(block->bb_u.l.bb_rightsib != cpu_to_be64(NULLFSBLOCK) &&
|
||||
!XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_u.l.bb_rightsib))))
|
||||
return false;
|
||||
|
||||
|
|
|
@ -78,11 +78,11 @@ xfs_btree_check_lblock(
|
|||
be16_to_cpu(block->bb_numrecs) <=
|
||||
cur->bc_ops->get_maxrecs(cur, level) &&
|
||||
block->bb_u.l.bb_leftsib &&
|
||||
(block->bb_u.l.bb_leftsib == cpu_to_be64(NULLDFSBNO) ||
|
||||
(block->bb_u.l.bb_leftsib == cpu_to_be64(NULLFSBLOCK) ||
|
||||
XFS_FSB_SANITY_CHECK(mp,
|
||||
be64_to_cpu(block->bb_u.l.bb_leftsib))) &&
|
||||
block->bb_u.l.bb_rightsib &&
|
||||
(block->bb_u.l.bb_rightsib == cpu_to_be64(NULLDFSBNO) ||
|
||||
(block->bb_u.l.bb_rightsib == cpu_to_be64(NULLFSBLOCK) ||
|
||||
XFS_FSB_SANITY_CHECK(mp,
|
||||
be64_to_cpu(block->bb_u.l.bb_rightsib)));
|
||||
|
||||
|
@ -167,12 +167,12 @@ xfs_btree_check_block(
|
|||
int /* error (0 or EFSCORRUPTED) */
|
||||
xfs_btree_check_lptr(
|
||||
struct xfs_btree_cur *cur, /* btree cursor */
|
||||
xfs_dfsbno_t bno, /* btree block disk address */
|
||||
xfs_fsblock_t bno, /* btree block disk address */
|
||||
int level) /* btree block level */
|
||||
{
|
||||
XFS_WANT_CORRUPTED_RETURN(
|
||||
level > 0 &&
|
||||
bno != NULLDFSBNO &&
|
||||
bno != NULLFSBLOCK &&
|
||||
XFS_FSB_SANITY_CHECK(cur->bc_mp, bno));
|
||||
return 0;
|
||||
}
|
||||
|
@ -595,7 +595,7 @@ xfs_btree_islastblock(
|
|||
block = xfs_btree_get_block(cur, level, &bp);
|
||||
xfs_btree_check_block(cur, block, level, bp);
|
||||
if (cur->bc_flags & XFS_BTREE_LONG_PTRS)
|
||||
return block->bb_u.l.bb_rightsib == cpu_to_be64(NULLDFSBNO);
|
||||
return block->bb_u.l.bb_rightsib == cpu_to_be64(NULLFSBLOCK);
|
||||
else
|
||||
return block->bb_u.s.bb_rightsib == cpu_to_be32(NULLAGBLOCK);
|
||||
}
|
||||
|
@ -771,16 +771,16 @@ xfs_btree_readahead_lblock(
|
|||
struct xfs_btree_block *block)
|
||||
{
|
||||
int rval = 0;
|
||||
xfs_dfsbno_t left = be64_to_cpu(block->bb_u.l.bb_leftsib);
|
||||
xfs_dfsbno_t right = be64_to_cpu(block->bb_u.l.bb_rightsib);
|
||||
xfs_fsblock_t left = be64_to_cpu(block->bb_u.l.bb_leftsib);
|
||||
xfs_fsblock_t right = be64_to_cpu(block->bb_u.l.bb_rightsib);
|
||||
|
||||
if ((lr & XFS_BTCUR_LEFTRA) && left != NULLDFSBNO) {
|
||||
if ((lr & XFS_BTCUR_LEFTRA) && left != NULLFSBLOCK) {
|
||||
xfs_btree_reada_bufl(cur->bc_mp, left, 1,
|
||||
cur->bc_ops->buf_ops);
|
||||
rval++;
|
||||
}
|
||||
|
||||
if ((lr & XFS_BTCUR_RIGHTRA) && right != NULLDFSBNO) {
|
||||
if ((lr & XFS_BTCUR_RIGHTRA) && right != NULLFSBLOCK) {
|
||||
xfs_btree_reada_bufl(cur->bc_mp, right, 1,
|
||||
cur->bc_ops->buf_ops);
|
||||
rval++;
|
||||
|
@ -852,7 +852,7 @@ xfs_btree_ptr_to_daddr(
|
|||
union xfs_btree_ptr *ptr)
|
||||
{
|
||||
if (cur->bc_flags & XFS_BTREE_LONG_PTRS) {
|
||||
ASSERT(ptr->l != cpu_to_be64(NULLDFSBNO));
|
||||
ASSERT(ptr->l != cpu_to_be64(NULLFSBLOCK));
|
||||
|
||||
return XFS_FSB_TO_DADDR(cur->bc_mp, be64_to_cpu(ptr->l));
|
||||
} else {
|
||||
|
@ -900,9 +900,9 @@ xfs_btree_setbuf(
|
|||
|
||||
b = XFS_BUF_TO_BLOCK(bp);
|
||||
if (cur->bc_flags & XFS_BTREE_LONG_PTRS) {
|
||||
if (b->bb_u.l.bb_leftsib == cpu_to_be64(NULLDFSBNO))
|
||||
if (b->bb_u.l.bb_leftsib == cpu_to_be64(NULLFSBLOCK))
|
||||
cur->bc_ra[lev] |= XFS_BTCUR_LEFTRA;
|
||||
if (b->bb_u.l.bb_rightsib == cpu_to_be64(NULLDFSBNO))
|
||||
if (b->bb_u.l.bb_rightsib == cpu_to_be64(NULLFSBLOCK))
|
||||
cur->bc_ra[lev] |= XFS_BTCUR_RIGHTRA;
|
||||
} else {
|
||||
if (b->bb_u.s.bb_leftsib == cpu_to_be32(NULLAGBLOCK))
|
||||
|
@ -918,7 +918,7 @@ xfs_btree_ptr_is_null(
|
|||
union xfs_btree_ptr *ptr)
|
||||
{
|
||||
if (cur->bc_flags & XFS_BTREE_LONG_PTRS)
|
||||
return ptr->l == cpu_to_be64(NULLDFSBNO);
|
||||
return ptr->l == cpu_to_be64(NULLFSBLOCK);
|
||||
else
|
||||
return ptr->s == cpu_to_be32(NULLAGBLOCK);
|
||||
}
|
||||
|
@ -929,7 +929,7 @@ xfs_btree_set_ptr_null(
|
|||
union xfs_btree_ptr *ptr)
|
||||
{
|
||||
if (cur->bc_flags & XFS_BTREE_LONG_PTRS)
|
||||
ptr->l = cpu_to_be64(NULLDFSBNO);
|
||||
ptr->l = cpu_to_be64(NULLFSBLOCK);
|
||||
else
|
||||
ptr->s = cpu_to_be32(NULLAGBLOCK);
|
||||
}
|
||||
|
@ -997,8 +997,8 @@ xfs_btree_init_block_int(
|
|||
buf->bb_numrecs = cpu_to_be16(numrecs);
|
||||
|
||||
if (flags & XFS_BTREE_LONG_PTRS) {
|
||||
buf->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO);
|
||||
buf->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO);
|
||||
buf->bb_u.l.bb_leftsib = cpu_to_be64(NULLFSBLOCK);
|
||||
buf->bb_u.l.bb_rightsib = cpu_to_be64(NULLFSBLOCK);
|
||||
if (flags & XFS_BTREE_CRC_BLOCKS) {
|
||||
buf->bb_u.l.bb_blkno = cpu_to_be64(blkno);
|
||||
buf->bb_u.l.bb_owner = cpu_to_be64(owner);
|
||||
|
|
|
@ -258,7 +258,7 @@ xfs_btree_check_block(
|
|||
int /* error (0 or EFSCORRUPTED) */
|
||||
xfs_btree_check_lptr(
|
||||
struct xfs_btree_cur *cur, /* btree cursor */
|
||||
xfs_dfsbno_t ptr, /* btree block disk address */
|
||||
xfs_fsblock_t ptr, /* btree block disk address */
|
||||
int level); /* btree block level */
|
||||
|
||||
/*
|
||||
|
|
|
@ -2004,7 +2004,7 @@ xfs_da_grow_inode_int(
|
|||
struct xfs_trans *tp = args->trans;
|
||||
struct xfs_inode *dp = args->dp;
|
||||
int w = args->whichfork;
|
||||
xfs_drfsbno_t nblks = dp->i_d.di_nblocks;
|
||||
xfs_rfsblock_t nblks = dp->i_d.di_nblocks;
|
||||
struct xfs_bmbt_irec map, *mapp;
|
||||
int nmap, error, got, i, mapi;
|
||||
|
||||
|
|
|
@ -51,10 +51,9 @@ static void xfs_dir2_sf_check(xfs_da_args_t *args);
|
|||
#else
|
||||
#define xfs_dir2_sf_check(args)
|
||||
#endif /* DEBUG */
|
||||
#if XFS_BIG_INUMS
|
||||
|
||||
static void xfs_dir2_sf_toino4(xfs_da_args_t *args);
|
||||
static void xfs_dir2_sf_toino8(xfs_da_args_t *args);
|
||||
#endif /* XFS_BIG_INUMS */
|
||||
|
||||
/*
|
||||
* Given a block directory (dp/block), calculate its size as a shortform (sf)
|
||||
|
@ -117,10 +116,10 @@ xfs_dir2_block_sfsize(
|
|||
isdotdot =
|
||||
dep->namelen == 2 &&
|
||||
dep->name[0] == '.' && dep->name[1] == '.';
|
||||
#if XFS_BIG_INUMS
|
||||
|
||||
if (!isdot)
|
||||
i8count += be64_to_cpu(dep->inumber) > XFS_DIR2_MAX_SHORT_INUM;
|
||||
#endif
|
||||
|
||||
/* take into account the file type field */
|
||||
if (!isdot && !isdotdot) {
|
||||
count++;
|
||||
|
@ -318,7 +317,7 @@ xfs_dir2_sf_addname(
|
|||
*/
|
||||
incr_isize = dp->d_ops->sf_entsize(sfp, args->namelen);
|
||||
objchange = 0;
|
||||
#if XFS_BIG_INUMS
|
||||
|
||||
/*
|
||||
* Do we have to change to 8 byte inodes?
|
||||
*/
|
||||
|
@ -332,7 +331,7 @@ xfs_dir2_sf_addname(
|
|||
(uint)sizeof(xfs_dir2_ino4_t));
|
||||
objchange = 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
new_isize = (int)dp->i_d.di_size + incr_isize;
|
||||
/*
|
||||
* Won't fit as shortform any more (due to size),
|
||||
|
@ -370,10 +369,8 @@ xfs_dir2_sf_addname(
|
|||
*/
|
||||
else {
|
||||
ASSERT(pick == 2);
|
||||
#if XFS_BIG_INUMS
|
||||
if (objchange)
|
||||
xfs_dir2_sf_toino8(args);
|
||||
#endif
|
||||
xfs_dir2_sf_addname_hard(args, objchange, new_isize);
|
||||
}
|
||||
xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_DDATA);
|
||||
|
@ -425,10 +422,8 @@ xfs_dir2_sf_addname_easy(
|
|||
* Update the header and inode.
|
||||
*/
|
||||
sfp->count++;
|
||||
#if XFS_BIG_INUMS
|
||||
if (args->inumber > XFS_DIR2_MAX_SHORT_INUM)
|
||||
sfp->i8count++;
|
||||
#endif
|
||||
dp->i_d.di_size = new_isize;
|
||||
xfs_dir2_sf_check(args);
|
||||
}
|
||||
|
@ -516,10 +511,8 @@ xfs_dir2_sf_addname_hard(
|
|||
dp->d_ops->sf_put_ino(sfp, sfep, args->inumber);
|
||||
dp->d_ops->sf_put_ftype(sfep, args->filetype);
|
||||
sfp->count++;
|
||||
#if XFS_BIG_INUMS
|
||||
if (args->inumber > XFS_DIR2_MAX_SHORT_INUM && !objchange)
|
||||
sfp->i8count++;
|
||||
#endif
|
||||
/*
|
||||
* If there's more left to copy, do that.
|
||||
*/
|
||||
|
@ -593,13 +586,8 @@ xfs_dir2_sf_addname_pick(
|
|||
/*
|
||||
* If changing the inode number size, do it the hard way.
|
||||
*/
|
||||
#if XFS_BIG_INUMS
|
||||
if (objchange) {
|
||||
if (objchange)
|
||||
return 2;
|
||||
}
|
||||
#else
|
||||
ASSERT(objchange == 0);
|
||||
#endif
|
||||
/*
|
||||
* If it won't fit at the end then do it the hard way (use the hole).
|
||||
*/
|
||||
|
@ -650,7 +638,6 @@ xfs_dir2_sf_check(
|
|||
ASSERT(dp->d_ops->sf_get_ftype(sfep) < XFS_DIR3_FT_MAX);
|
||||
}
|
||||
ASSERT(i8count == sfp->i8count);
|
||||
ASSERT(XFS_BIG_INUMS || i8count == 0);
|
||||
ASSERT((char *)sfep - (char *)sfp == dp->i_d.di_size);
|
||||
ASSERT(offset +
|
||||
(sfp->count + 2) * (uint)sizeof(xfs_dir2_leaf_entry_t) +
|
||||
|
@ -870,7 +857,6 @@ xfs_dir2_sf_removename(
|
|||
*/
|
||||
xfs_idata_realloc(dp, newsize - oldsize, XFS_DATA_FORK);
|
||||
sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
|
||||
#if XFS_BIG_INUMS
|
||||
/*
|
||||
* Are we changing inode number size?
|
||||
*/
|
||||
|
@ -880,7 +866,6 @@ xfs_dir2_sf_removename(
|
|||
else
|
||||
sfp->i8count--;
|
||||
}
|
||||
#endif
|
||||
xfs_dir2_sf_check(args);
|
||||
xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_DDATA);
|
||||
return 0;
|
||||
|
@ -895,12 +880,8 @@ xfs_dir2_sf_replace(
|
|||
{
|
||||
xfs_inode_t *dp; /* incore directory inode */
|
||||
int i; /* entry index */
|
||||
#if XFS_BIG_INUMS || defined(DEBUG)
|
||||
xfs_ino_t ino=0; /* entry old inode number */
|
||||
#endif
|
||||
#if XFS_BIG_INUMS
|
||||
int i8elevated; /* sf_toino8 set i8count=1 */
|
||||
#endif
|
||||
xfs_dir2_sf_entry_t *sfep; /* shortform directory entry */
|
||||
xfs_dir2_sf_hdr_t *sfp; /* shortform structure */
|
||||
|
||||
|
@ -920,7 +901,7 @@ xfs_dir2_sf_replace(
|
|||
ASSERT(dp->i_df.if_u1.if_data != NULL);
|
||||
sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
|
||||
ASSERT(dp->i_d.di_size >= xfs_dir2_sf_hdr_size(sfp->i8count));
|
||||
#if XFS_BIG_INUMS
|
||||
|
||||
/*
|
||||
* New inode number is large, and need to convert to 8-byte inodes.
|
||||
*/
|
||||
|
@ -951,17 +932,15 @@ xfs_dir2_sf_replace(
|
|||
sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
|
||||
} else
|
||||
i8elevated = 0;
|
||||
#endif
|
||||
|
||||
ASSERT(args->namelen != 1 || args->name[0] != '.');
|
||||
/*
|
||||
* Replace ..'s entry.
|
||||
*/
|
||||
if (args->namelen == 2 &&
|
||||
args->name[0] == '.' && args->name[1] == '.') {
|
||||
#if XFS_BIG_INUMS || defined(DEBUG)
|
||||
ino = dp->d_ops->sf_get_parent_ino(sfp);
|
||||
ASSERT(args->inumber != ino);
|
||||
#endif
|
||||
dp->d_ops->sf_put_parent_ino(sfp, args->inumber);
|
||||
}
|
||||
/*
|
||||
|
@ -972,10 +951,8 @@ xfs_dir2_sf_replace(
|
|||
i++, sfep = dp->d_ops->sf_nextentry(sfp, sfep)) {
|
||||
if (xfs_da_compname(args, sfep->name, sfep->namelen) ==
|
||||
XFS_CMP_EXACT) {
|
||||
#if XFS_BIG_INUMS || defined(DEBUG)
|
||||
ino = dp->d_ops->sf_get_ino(sfp, sfep);
|
||||
ASSERT(args->inumber != ino);
|
||||
#endif
|
||||
dp->d_ops->sf_put_ino(sfp, sfep, args->inumber);
|
||||
dp->d_ops->sf_put_ftype(sfep, args->filetype);
|
||||
break;
|
||||
|
@ -986,14 +963,11 @@ xfs_dir2_sf_replace(
|
|||
*/
|
||||
if (i == sfp->count) {
|
||||
ASSERT(args->op_flags & XFS_DA_OP_OKNOENT);
|
||||
#if XFS_BIG_INUMS
|
||||
if (i8elevated)
|
||||
xfs_dir2_sf_toino4(args);
|
||||
#endif
|
||||
return -ENOENT;
|
||||
}
|
||||
}
|
||||
#if XFS_BIG_INUMS
|
||||
/*
|
||||
* See if the old number was large, the new number is small.
|
||||
*/
|
||||
|
@ -1020,13 +994,11 @@ xfs_dir2_sf_replace(
|
|||
if (!i8elevated)
|
||||
sfp->i8count++;
|
||||
}
|
||||
#endif
|
||||
xfs_dir2_sf_check(args);
|
||||
xfs_trans_log_inode(args->trans, dp, XFS_ILOG_DDATA);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if XFS_BIG_INUMS
|
||||
/*
|
||||
* Convert from 8-byte inode numbers to 4-byte inode numbers.
|
||||
* The last 8-byte inode number is gone, but the count is still 1.
|
||||
|
@ -1181,4 +1153,3 @@ xfs_dir2_sf_toino8(
|
|||
dp->i_d.di_size = newsize;
|
||||
xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_DDATA);
|
||||
}
|
||||
#endif /* XFS_BIG_INUMS */
|
||||
|
|
|
@ -68,11 +68,7 @@ struct xfs_ifork;
|
|||
#define XFS_RTLOBIT(w) xfs_lowbit32(w)
|
||||
#define XFS_RTHIBIT(w) xfs_highbit32(w)
|
||||
|
||||
#if XFS_BIG_BLKNOS
|
||||
#define XFS_RTBLOCKLOG(b) xfs_highbit64(b)
|
||||
#else
|
||||
#define XFS_RTBLOCKLOG(b) xfs_highbit32(b)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Dquot and dquot block format definitions
|
||||
|
@ -304,23 +300,15 @@ typedef struct xfs_bmbt_rec_host {
|
|||
* Values and macros for delayed-allocation startblock fields.
|
||||
*/
|
||||
#define STARTBLOCKVALBITS 17
|
||||
#define STARTBLOCKMASKBITS (15 + XFS_BIG_BLKNOS * 20)
|
||||
#define DSTARTBLOCKMASKBITS (15 + 20)
|
||||
#define STARTBLOCKMASKBITS (15 + 20)
|
||||
#define STARTBLOCKMASK \
|
||||
(((((xfs_fsblock_t)1) << STARTBLOCKMASKBITS) - 1) << STARTBLOCKVALBITS)
|
||||
#define DSTARTBLOCKMASK \
|
||||
(((((xfs_dfsbno_t)1) << DSTARTBLOCKMASKBITS) - 1) << STARTBLOCKVALBITS)
|
||||
|
||||
static inline int isnullstartblock(xfs_fsblock_t x)
|
||||
{
|
||||
return ((x) & STARTBLOCKMASK) == STARTBLOCKMASK;
|
||||
}
|
||||
|
||||
static inline int isnulldstartblock(xfs_dfsbno_t x)
|
||||
{
|
||||
return ((x) & DSTARTBLOCKMASK) == DSTARTBLOCKMASK;
|
||||
}
|
||||
|
||||
static inline xfs_fsblock_t nullstartblock(int k)
|
||||
{
|
||||
ASSERT(k < (1 << STARTBLOCKVALBITS));
|
||||
|
|
|
@ -528,7 +528,7 @@ xfs_iroot_realloc(
|
|||
ifp->if_broot_bytes = (int)new_size;
|
||||
ASSERT(XFS_BMAP_BMDR_SPACE(ifp->if_broot) <=
|
||||
XFS_IFORK_SIZE(ip, whichfork));
|
||||
memmove(np, op, cur_max * (uint)sizeof(xfs_dfsbno_t));
|
||||
memmove(np, op, cur_max * (uint)sizeof(xfs_fsblock_t));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -575,7 +575,7 @@ xfs_iroot_realloc(
|
|||
ifp->if_broot_bytes);
|
||||
np = (char *)XFS_BMAP_BROOT_PTR_ADDR(mp, new_broot, 1,
|
||||
(int)new_size);
|
||||
memcpy(np, op, new_max * (uint)sizeof(xfs_dfsbno_t));
|
||||
memcpy(np, op, new_max * (uint)sizeof(xfs_fsblock_t));
|
||||
}
|
||||
kmem_free(ifp->if_broot);
|
||||
ifp->if_broot = new_broot;
|
||||
|
|
|
@ -54,11 +54,7 @@ struct xfs_mount;
|
|||
#define XFS_OFFBNO_TO_AGINO(mp,b,o) \
|
||||
((xfs_agino_t)(((b) << XFS_INO_OFFSET_BITS(mp)) | (o)))
|
||||
|
||||
#if XFS_BIG_INUMS
|
||||
#define XFS_MAXINUMBER ((xfs_ino_t)((1ULL << 56) - 1ULL))
|
||||
#else
|
||||
#define XFS_MAXINUMBER ((xfs_ino_t)((1ULL << 32) - 1ULL))
|
||||
#endif
|
||||
#define XFS_MAXINUMBER_32 ((xfs_ino_t)((1ULL << 32) - 1ULL))
|
||||
|
||||
#endif /* __XFS_INUM_H__ */
|
||||
|
|
|
@ -380,7 +380,7 @@ typedef struct xfs_icdinode {
|
|||
xfs_ictimestamp_t di_mtime; /* time last modified */
|
||||
xfs_ictimestamp_t di_ctime; /* time created/inode modified */
|
||||
xfs_fsize_t di_size; /* number of bytes in file */
|
||||
xfs_drfsbno_t di_nblocks; /* # of direct & btree blocks used */
|
||||
xfs_rfsblock_t di_nblocks; /* # of direct & btree blocks used */
|
||||
xfs_extlen_t di_extsize; /* basic/minimum extent size for file */
|
||||
xfs_extnum_t di_nextents; /* number of extents in data fork */
|
||||
xfs_aextnum_t di_anextents; /* number of extents in attribute fork*/
|
||||
|
@ -516,7 +516,7 @@ xfs_blft_from_flags(struct xfs_buf_log_format *blf)
|
|||
* EFI/EFD log format definitions
|
||||
*/
|
||||
typedef struct xfs_extent {
|
||||
xfs_dfsbno_t ext_start;
|
||||
xfs_fsblock_t ext_start;
|
||||
xfs_extlen_t ext_len;
|
||||
} xfs_extent_t;
|
||||
|
||||
|
|
|
@ -98,8 +98,6 @@ typedef __uint16_t xfs_qwarncnt_t;
|
|||
#define XFS_IS_QUOTA_ON(mp) ((mp)->m_qflags & (XFS_UQUOTA_ACTIVE | \
|
||||
XFS_GQUOTA_ACTIVE | \
|
||||
XFS_PQUOTA_ACTIVE))
|
||||
#define XFS_IS_OQUOTA_ON(mp) ((mp)->m_qflags & (XFS_GQUOTA_ACTIVE | \
|
||||
XFS_PQUOTA_ACTIVE))
|
||||
#define XFS_IS_UQUOTA_ON(mp) ((mp)->m_qflags & XFS_UQUOTA_ACTIVE)
|
||||
#define XFS_IS_GQUOTA_ON(mp) ((mp)->m_qflags & XFS_GQUOTA_ACTIVE)
|
||||
#define XFS_IS_PQUOTA_ON(mp) ((mp)->m_qflags & XFS_PQUOTA_ACTIVE)
|
||||
|
|
|
@ -87,11 +87,11 @@ struct xfs_trans;
|
|||
typedef struct xfs_sb {
|
||||
__uint32_t sb_magicnum; /* magic number == XFS_SB_MAGIC */
|
||||
__uint32_t sb_blocksize; /* logical block size, bytes */
|
||||
xfs_drfsbno_t sb_dblocks; /* number of data blocks */
|
||||
xfs_drfsbno_t sb_rblocks; /* number of realtime blocks */
|
||||
xfs_drtbno_t sb_rextents; /* number of realtime extents */
|
||||
xfs_rfsblock_t sb_dblocks; /* number of data blocks */
|
||||
xfs_rfsblock_t sb_rblocks; /* number of realtime blocks */
|
||||
xfs_rtblock_t sb_rextents; /* number of realtime extents */
|
||||
uuid_t sb_uuid; /* file system unique id */
|
||||
xfs_dfsbno_t sb_logstart; /* starting block of log if internal */
|
||||
xfs_fsblock_t sb_logstart; /* starting block of log if internal */
|
||||
xfs_ino_t sb_rootino; /* root inode number */
|
||||
xfs_ino_t sb_rbmino; /* bitmap inode for realtime extents */
|
||||
xfs_ino_t sb_rsumino; /* summary inode for rt bitmap */
|
||||
|
|
|
@ -425,7 +425,7 @@ xfs_bmap_count_blocks(
|
|||
ASSERT(level > 0);
|
||||
pp = XFS_BMAP_BROOT_PTR_ADDR(mp, block, 1, ifp->if_broot_bytes);
|
||||
bno = be64_to_cpu(*pp);
|
||||
ASSERT(bno != NULLDFSBNO);
|
||||
ASSERT(bno != NULLFSBLOCK);
|
||||
ASSERT(XFS_FSB_TO_AGNO(mp, bno) < mp->m_sb.sb_agcount);
|
||||
ASSERT(XFS_FSB_TO_AGBNO(mp, bno) < mp->m_sb.sb_agblocks);
|
||||
|
||||
|
|
|
@ -255,8 +255,8 @@ typedef struct xfs_fsop_resblks {
|
|||
((2 * 1024 * 1024 * 1024ULL) - XFS_MIN_LOG_BYTES)
|
||||
|
||||
/* Used for sanity checks on superblock */
|
||||
#define XFS_MAX_DBLOCKS(s) ((xfs_drfsbno_t)(s)->sb_agcount * (s)->sb_agblocks)
|
||||
#define XFS_MIN_DBLOCKS(s) ((xfs_drfsbno_t)((s)->sb_agcount - 1) * \
|
||||
#define XFS_MAX_DBLOCKS(s) ((xfs_rfsblock_t)(s)->sb_agcount * (s)->sb_agblocks)
|
||||
#define XFS_MIN_DBLOCKS(s) ((xfs_rfsblock_t)((s)->sb_agcount - 1) * \
|
||||
(s)->sb_agblocks + XFS_MIN_AG_BLOCKS)
|
||||
|
||||
/*
|
||||
|
|
|
@ -20,18 +20,6 @@
|
|||
|
||||
#include <linux/types.h>
|
||||
|
||||
/*
|
||||
* XFS_BIG_BLKNOS needs block layer disk addresses to be 64 bits.
|
||||
* XFS_BIG_INUMS requires XFS_BIG_BLKNOS to be set.
|
||||
*/
|
||||
#if defined(CONFIG_LBDAF) || (BITS_PER_LONG == 64)
|
||||
# define XFS_BIG_BLKNOS 1
|
||||
# define XFS_BIG_INUMS 1
|
||||
#else
|
||||
# define XFS_BIG_BLKNOS 0
|
||||
# define XFS_BIG_INUMS 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Kernel specific type declarations for XFS
|
||||
*/
|
||||
|
|
|
@ -78,8 +78,6 @@ xlog_cil_init_post_recovery(
|
|||
{
|
||||
log->l_cilp->xc_ctx->ticket = xlog_cil_ticket_alloc(log);
|
||||
log->l_cilp->xc_ctx->sequence = 1;
|
||||
log->l_cilp->xc_ctx->commit_lsn = xlog_assign_lsn(log->l_curr_cycle,
|
||||
log->l_curr_block);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -176,13 +176,9 @@ xfs_sb_validate_fsb_count(
|
|||
ASSERT(PAGE_SHIFT >= sbp->sb_blocklog);
|
||||
ASSERT(sbp->sb_blocklog >= BBSHIFT);
|
||||
|
||||
#if XFS_BIG_BLKNOS /* Limited by ULONG_MAX of page cache index */
|
||||
/* Limited by ULONG_MAX of page cache index */
|
||||
if (nblocks >> (PAGE_CACHE_SHIFT - sbp->sb_blocklog) > ULONG_MAX)
|
||||
return -EFBIG;
|
||||
#else /* Limited by UINT_MAX of sectors */
|
||||
if (nblocks << (sbp->sb_blocklog - BBSHIFT) > UINT_MAX)
|
||||
return -EFBIG;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -253,9 +249,9 @@ xfs_initialize_perag(
|
|||
mp->m_flags &= ~XFS_MOUNT_32BITINODES;
|
||||
|
||||
if (mp->m_flags & XFS_MOUNT_32BITINODES)
|
||||
index = xfs_set_inode32(mp);
|
||||
index = xfs_set_inode32(mp, agcount);
|
||||
else
|
||||
index = xfs_set_inode64(mp);
|
||||
index = xfs_set_inode64(mp, agcount);
|
||||
|
||||
if (maxagi)
|
||||
*maxagi = index;
|
||||
|
|
189
fs/xfs/xfs_qm.c
189
fs/xfs/xfs_qm.c
|
@ -221,100 +221,6 @@ xfs_qm_unmount(
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* This is called from xfs_mountfs to start quotas and initialize all
|
||||
* necessary data structures like quotainfo. This is also responsible for
|
||||
* running a quotacheck as necessary. We are guaranteed that the superblock
|
||||
* is consistently read in at this point.
|
||||
*
|
||||
* If we fail here, the mount will continue with quota turned off. We don't
|
||||
* need to inidicate success or failure at all.
|
||||
*/
|
||||
void
|
||||
xfs_qm_mount_quotas(
|
||||
xfs_mount_t *mp)
|
||||
{
|
||||
int error = 0;
|
||||
uint sbf;
|
||||
|
||||
/*
|
||||
* If quotas on realtime volumes is not supported, we disable
|
||||
* quotas immediately.
|
||||
*/
|
||||
if (mp->m_sb.sb_rextents) {
|
||||
xfs_notice(mp, "Cannot turn on quotas for realtime filesystem");
|
||||
mp->m_qflags = 0;
|
||||
goto write_changes;
|
||||
}
|
||||
|
||||
ASSERT(XFS_IS_QUOTA_RUNNING(mp));
|
||||
|
||||
/*
|
||||
* Allocate the quotainfo structure inside the mount struct, and
|
||||
* create quotainode(s), and change/rev superblock if necessary.
|
||||
*/
|
||||
error = xfs_qm_init_quotainfo(mp);
|
||||
if (error) {
|
||||
/*
|
||||
* We must turn off quotas.
|
||||
*/
|
||||
ASSERT(mp->m_quotainfo == NULL);
|
||||
mp->m_qflags = 0;
|
||||
goto write_changes;
|
||||
}
|
||||
/*
|
||||
* If any of the quotas are not consistent, do a quotacheck.
|
||||
*/
|
||||
if (XFS_QM_NEED_QUOTACHECK(mp)) {
|
||||
error = xfs_qm_quotacheck(mp);
|
||||
if (error) {
|
||||
/* Quotacheck failed and disabled quotas. */
|
||||
return;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* If one type of quotas is off, then it will lose its
|
||||
* quotachecked status, since we won't be doing accounting for
|
||||
* that type anymore.
|
||||
*/
|
||||
if (!XFS_IS_UQUOTA_ON(mp))
|
||||
mp->m_qflags &= ~XFS_UQUOTA_CHKD;
|
||||
if (!XFS_IS_GQUOTA_ON(mp))
|
||||
mp->m_qflags &= ~XFS_GQUOTA_CHKD;
|
||||
if (!XFS_IS_PQUOTA_ON(mp))
|
||||
mp->m_qflags &= ~XFS_PQUOTA_CHKD;
|
||||
|
||||
write_changes:
|
||||
/*
|
||||
* We actually don't have to acquire the m_sb_lock at all.
|
||||
* This can only be called from mount, and that's single threaded. XXX
|
||||
*/
|
||||
spin_lock(&mp->m_sb_lock);
|
||||
sbf = mp->m_sb.sb_qflags;
|
||||
mp->m_sb.sb_qflags = mp->m_qflags & XFS_MOUNT_QUOTA_ALL;
|
||||
spin_unlock(&mp->m_sb_lock);
|
||||
|
||||
if (sbf != (mp->m_qflags & XFS_MOUNT_QUOTA_ALL)) {
|
||||
if (xfs_qm_write_sb_changes(mp, XFS_SB_QFLAGS)) {
|
||||
/*
|
||||
* We could only have been turning quotas off.
|
||||
* We aren't in very good shape actually because
|
||||
* the incore structures are convinced that quotas are
|
||||
* off, but the on disk superblock doesn't know that !
|
||||
*/
|
||||
ASSERT(!(XFS_IS_QUOTA_RUNNING(mp)));
|
||||
xfs_alert(mp, "%s: Superblock update failed!",
|
||||
__func__);
|
||||
}
|
||||
}
|
||||
|
||||
if (error) {
|
||||
xfs_warn(mp, "Failed to initialize disk quotas.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Called from the vfsops layer.
|
||||
*/
|
||||
|
@ -1330,7 +1236,7 @@ out_unlock:
|
|||
* Walk thru all the filesystem inodes and construct a consistent view
|
||||
* of the disk quota world. If the quotacheck fails, disable quotas.
|
||||
*/
|
||||
int
|
||||
STATIC int
|
||||
xfs_qm_quotacheck(
|
||||
xfs_mount_t *mp)
|
||||
{
|
||||
|
@ -1466,6 +1372,99 @@ xfs_qm_quotacheck(
|
|||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is called from xfs_mountfs to start quotas and initialize all
|
||||
* necessary data structures like quotainfo. This is also responsible for
|
||||
* running a quotacheck as necessary. We are guaranteed that the superblock
|
||||
* is consistently read in at this point.
|
||||
*
|
||||
* If we fail here, the mount will continue with quota turned off. We don't
|
||||
* need to inidicate success or failure at all.
|
||||
*/
|
||||
void
|
||||
xfs_qm_mount_quotas(
|
||||
struct xfs_mount *mp)
|
||||
{
|
||||
int error = 0;
|
||||
uint sbf;
|
||||
|
||||
/*
|
||||
* If quotas on realtime volumes is not supported, we disable
|
||||
* quotas immediately.
|
||||
*/
|
||||
if (mp->m_sb.sb_rextents) {
|
||||
xfs_notice(mp, "Cannot turn on quotas for realtime filesystem");
|
||||
mp->m_qflags = 0;
|
||||
goto write_changes;
|
||||
}
|
||||
|
||||
ASSERT(XFS_IS_QUOTA_RUNNING(mp));
|
||||
|
||||
/*
|
||||
* Allocate the quotainfo structure inside the mount struct, and
|
||||
* create quotainode(s), and change/rev superblock if necessary.
|
||||
*/
|
||||
error = xfs_qm_init_quotainfo(mp);
|
||||
if (error) {
|
||||
/*
|
||||
* We must turn off quotas.
|
||||
*/
|
||||
ASSERT(mp->m_quotainfo == NULL);
|
||||
mp->m_qflags = 0;
|
||||
goto write_changes;
|
||||
}
|
||||
/*
|
||||
* If any of the quotas are not consistent, do a quotacheck.
|
||||
*/
|
||||
if (XFS_QM_NEED_QUOTACHECK(mp)) {
|
||||
error = xfs_qm_quotacheck(mp);
|
||||
if (error) {
|
||||
/* Quotacheck failed and disabled quotas. */
|
||||
return;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* If one type of quotas is off, then it will lose its
|
||||
* quotachecked status, since we won't be doing accounting for
|
||||
* that type anymore.
|
||||
*/
|
||||
if (!XFS_IS_UQUOTA_ON(mp))
|
||||
mp->m_qflags &= ~XFS_UQUOTA_CHKD;
|
||||
if (!XFS_IS_GQUOTA_ON(mp))
|
||||
mp->m_qflags &= ~XFS_GQUOTA_CHKD;
|
||||
if (!XFS_IS_PQUOTA_ON(mp))
|
||||
mp->m_qflags &= ~XFS_PQUOTA_CHKD;
|
||||
|
||||
write_changes:
|
||||
/*
|
||||
* We actually don't have to acquire the m_sb_lock at all.
|
||||
* This can only be called from mount, and that's single threaded. XXX
|
||||
*/
|
||||
spin_lock(&mp->m_sb_lock);
|
||||
sbf = mp->m_sb.sb_qflags;
|
||||
mp->m_sb.sb_qflags = mp->m_qflags & XFS_MOUNT_QUOTA_ALL;
|
||||
spin_unlock(&mp->m_sb_lock);
|
||||
|
||||
if (sbf != (mp->m_qflags & XFS_MOUNT_QUOTA_ALL)) {
|
||||
if (xfs_qm_write_sb_changes(mp, XFS_SB_QFLAGS)) {
|
||||
/*
|
||||
* We could only have been turning quotas off.
|
||||
* We aren't in very good shape actually because
|
||||
* the incore structures are convinced that quotas are
|
||||
* off, but the on disk superblock doesn't know that !
|
||||
*/
|
||||
ASSERT(!(XFS_IS_QUOTA_RUNNING(mp)));
|
||||
xfs_alert(mp, "%s: Superblock update failed!",
|
||||
__func__);
|
||||
}
|
||||
}
|
||||
|
||||
if (error) {
|
||||
xfs_warn(mp, "Failed to initialize disk quotas.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This is called after the superblock has been read in and we're ready to
|
||||
* iget the quota inodes.
|
||||
|
|
|
@ -157,7 +157,6 @@ struct xfs_dquot_acct {
|
|||
#define XFS_QM_RTBWARNLIMIT 5
|
||||
|
||||
extern void xfs_qm_destroy_quotainfo(struct xfs_mount *);
|
||||
extern int xfs_qm_quotacheck(struct xfs_mount *);
|
||||
extern int xfs_qm_write_sb_changes(struct xfs_mount *, __int64_t);
|
||||
|
||||
/* dquot stuff */
|
||||
|
|
|
@ -123,7 +123,7 @@ xfs_fs_rm_xquota(
|
|||
flags |= XFS_DQ_USER;
|
||||
if (uflags & FS_GROUP_QUOTA)
|
||||
flags |= XFS_DQ_GROUP;
|
||||
if (uflags & FS_USER_QUOTA)
|
||||
if (uflags & FS_PROJ_QUOTA)
|
||||
flags |= XFS_DQ_PROJ;
|
||||
|
||||
return xfs_qm_scall_trunc_qfiles(mp, flags);
|
||||
|
|
|
@ -944,9 +944,9 @@ xfs_growfs_rt(
|
|||
xfs_buf_t *bp; /* temporary buffer */
|
||||
int error; /* error return value */
|
||||
xfs_mount_t *nmp; /* new (fake) mount structure */
|
||||
xfs_drfsbno_t nrblocks; /* new number of realtime blocks */
|
||||
xfs_rfsblock_t nrblocks; /* new number of realtime blocks */
|
||||
xfs_extlen_t nrbmblocks; /* new number of rt bitmap blocks */
|
||||
xfs_drtbno_t nrextents; /* new number of realtime extents */
|
||||
xfs_rtblock_t nrextents; /* new number of realtime extents */
|
||||
uint8_t nrextslog; /* new log2 of sb_rextents */
|
||||
xfs_extlen_t nrsumblocks; /* new number of summary blocks */
|
||||
uint nrsumlevels; /* new rt summary levels */
|
||||
|
|
|
@ -205,9 +205,6 @@ xfs_parseargs(
|
|||
*/
|
||||
mp->m_flags |= XFS_MOUNT_BARRIER;
|
||||
mp->m_flags |= XFS_MOUNT_COMPAT_IOSIZE;
|
||||
#if !XFS_BIG_INUMS
|
||||
mp->m_flags |= XFS_MOUNT_SMALL_INUMS;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* These can be overridden by the mount option parsing.
|
||||
|
@ -314,11 +311,6 @@ xfs_parseargs(
|
|||
mp->m_flags |= XFS_MOUNT_SMALL_INUMS;
|
||||
} else if (!strcmp(this_char, MNTOPT_64BITINODE)) {
|
||||
mp->m_flags &= ~XFS_MOUNT_SMALL_INUMS;
|
||||
#if !XFS_BIG_INUMS
|
||||
xfs_warn(mp, "%s option not allowed on this system",
|
||||
this_char);
|
||||
return -EINVAL;
|
||||
#endif
|
||||
} else if (!strcmp(this_char, MNTOPT_NOUUID)) {
|
||||
mp->m_flags |= XFS_MOUNT_NOUUID;
|
||||
} else if (!strcmp(this_char, MNTOPT_BARRIER)) {
|
||||
|
@ -598,15 +590,20 @@ xfs_max_file_offset(
|
|||
return (((__uint64_t)pagefactor) << bitshift) - 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* xfs_set_inode32() and xfs_set_inode64() are passed an agcount
|
||||
* because in the growfs case, mp->m_sb.sb_agcount is not updated
|
||||
* yet to the potentially higher ag count.
|
||||
*/
|
||||
xfs_agnumber_t
|
||||
xfs_set_inode32(struct xfs_mount *mp)
|
||||
xfs_set_inode32(struct xfs_mount *mp, xfs_agnumber_t agcount)
|
||||
{
|
||||
xfs_agnumber_t index = 0;
|
||||
xfs_agnumber_t maxagi = 0;
|
||||
xfs_sb_t *sbp = &mp->m_sb;
|
||||
xfs_agnumber_t max_metadata;
|
||||
xfs_agino_t agino = XFS_OFFBNO_TO_AGINO(mp, sbp->sb_agblocks -1, 0);
|
||||
xfs_ino_t ino = XFS_AGINO_TO_INO(mp, sbp->sb_agcount -1, agino);
|
||||
xfs_agino_t agino;
|
||||
xfs_ino_t ino;
|
||||
xfs_perag_t *pag;
|
||||
|
||||
/* Calculate how much should be reserved for inodes to meet
|
||||
|
@ -621,10 +618,12 @@ xfs_set_inode32(struct xfs_mount *mp)
|
|||
do_div(icount, sbp->sb_agblocks);
|
||||
max_metadata = icount;
|
||||
} else {
|
||||
max_metadata = sbp->sb_agcount;
|
||||
max_metadata = agcount;
|
||||
}
|
||||
|
||||
for (index = 0; index < sbp->sb_agcount; index++) {
|
||||
agino = XFS_OFFBNO_TO_AGINO(mp, sbp->sb_agblocks - 1, 0);
|
||||
|
||||
for (index = 0; index < agcount; index++) {
|
||||
ino = XFS_AGINO_TO_INO(mp, index, agino);
|
||||
|
||||
if (ino > XFS_MAXINUMBER_32) {
|
||||
|
@ -649,11 +648,11 @@ xfs_set_inode32(struct xfs_mount *mp)
|
|||
}
|
||||
|
||||
xfs_agnumber_t
|
||||
xfs_set_inode64(struct xfs_mount *mp)
|
||||
xfs_set_inode64(struct xfs_mount *mp, xfs_agnumber_t agcount)
|
||||
{
|
||||
xfs_agnumber_t index = 0;
|
||||
|
||||
for (index = 0; index < mp->m_sb.sb_agcount; index++) {
|
||||
for (index = 0; index < agcount; index++) {
|
||||
struct xfs_perag *pag;
|
||||
|
||||
pag = xfs_perag_get(mp, index);
|
||||
|
@ -1189,6 +1188,7 @@ xfs_fs_remount(
|
|||
char *options)
|
||||
{
|
||||
struct xfs_mount *mp = XFS_M(sb);
|
||||
xfs_sb_t *sbp = &mp->m_sb;
|
||||
substring_t args[MAX_OPT_ARGS];
|
||||
char *p;
|
||||
int error;
|
||||
|
@ -1209,10 +1209,10 @@ xfs_fs_remount(
|
|||
mp->m_flags &= ~XFS_MOUNT_BARRIER;
|
||||
break;
|
||||
case Opt_inode64:
|
||||
mp->m_maxagi = xfs_set_inode64(mp);
|
||||
mp->m_maxagi = xfs_set_inode64(mp, sbp->sb_agcount);
|
||||
break;
|
||||
case Opt_inode32:
|
||||
mp->m_maxagi = xfs_set_inode32(mp);
|
||||
mp->m_maxagi = xfs_set_inode32(mp, sbp->sb_agcount);
|
||||
break;
|
||||
default:
|
||||
/*
|
||||
|
|
|
@ -44,16 +44,6 @@ extern void xfs_qm_exit(void);
|
|||
# define XFS_REALTIME_STRING
|
||||
#endif
|
||||
|
||||
#if XFS_BIG_BLKNOS
|
||||
# if XFS_BIG_INUMS
|
||||
# define XFS_BIGFS_STRING "large block/inode numbers, "
|
||||
# else
|
||||
# define XFS_BIGFS_STRING "large block numbers, "
|
||||
# endif
|
||||
#else
|
||||
# define XFS_BIGFS_STRING
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
# define XFS_DBG_STRING "debug"
|
||||
#else
|
||||
|
@ -64,7 +54,6 @@ extern void xfs_qm_exit(void);
|
|||
#define XFS_BUILD_OPTIONS XFS_ACL_STRING \
|
||||
XFS_SECURITY_STRING \
|
||||
XFS_REALTIME_STRING \
|
||||
XFS_BIGFS_STRING \
|
||||
XFS_DBG_STRING /* DBG must be last */
|
||||
|
||||
struct xfs_inode;
|
||||
|
@ -76,8 +65,8 @@ extern __uint64_t xfs_max_file_offset(unsigned int);
|
|||
|
||||
extern void xfs_flush_inodes(struct xfs_mount *mp);
|
||||
extern void xfs_blkdev_issue_flush(struct xfs_buftarg *);
|
||||
extern xfs_agnumber_t xfs_set_inode32(struct xfs_mount *);
|
||||
extern xfs_agnumber_t xfs_set_inode64(struct xfs_mount *);
|
||||
extern xfs_agnumber_t xfs_set_inode32(struct xfs_mount *, xfs_agnumber_t agcount);
|
||||
extern xfs_agnumber_t xfs_set_inode64(struct xfs_mount *, xfs_agnumber_t agcount);
|
||||
|
||||
extern const struct export_operations xfs_export_operations;
|
||||
extern const struct xattr_handler *xfs_xattr_handlers[];
|
||||
|
|
|
@ -38,43 +38,18 @@ typedef __int32_t xfs_tid_t; /* transaction identifier */
|
|||
typedef __uint32_t xfs_dablk_t; /* dir/attr block number (in file) */
|
||||
typedef __uint32_t xfs_dahash_t; /* dir/attr hash value */
|
||||
|
||||
/*
|
||||
* These types are 64 bits on disk but are either 32 or 64 bits in memory.
|
||||
* Disk based types:
|
||||
*/
|
||||
typedef __uint64_t xfs_dfsbno_t; /* blockno in filesystem (agno|agbno) */
|
||||
typedef __uint64_t xfs_drfsbno_t; /* blockno in filesystem (raw) */
|
||||
typedef __uint64_t xfs_drtbno_t; /* extent (block) in realtime area */
|
||||
typedef __uint64_t xfs_dfiloff_t; /* block number in a file */
|
||||
typedef __uint64_t xfs_dfilblks_t; /* number of blocks in a file */
|
||||
|
||||
/*
|
||||
* Memory based types are conditional.
|
||||
*/
|
||||
#if XFS_BIG_BLKNOS
|
||||
typedef __uint64_t xfs_fsblock_t; /* blockno in filesystem (agno|agbno) */
|
||||
typedef __uint64_t xfs_rfsblock_t; /* blockno in filesystem (raw) */
|
||||
typedef __uint64_t xfs_rtblock_t; /* extent (block) in realtime area */
|
||||
typedef __int64_t xfs_srtblock_t; /* signed version of xfs_rtblock_t */
|
||||
#else
|
||||
typedef __uint32_t xfs_fsblock_t; /* blockno in filesystem (agno|agbno) */
|
||||
typedef __uint32_t xfs_rfsblock_t; /* blockno in filesystem (raw) */
|
||||
typedef __uint32_t xfs_rtblock_t; /* extent (block) in realtime area */
|
||||
typedef __int32_t xfs_srtblock_t; /* signed version of xfs_rtblock_t */
|
||||
#endif
|
||||
typedef __uint64_t xfs_fileoff_t; /* block number in a file */
|
||||
typedef __int64_t xfs_sfiloff_t; /* signed block number in a file */
|
||||
typedef __uint64_t xfs_filblks_t; /* number of blocks in a file */
|
||||
|
||||
typedef __int64_t xfs_srtblock_t; /* signed version of xfs_rtblock_t */
|
||||
typedef __int64_t xfs_sfiloff_t; /* signed block number in a file */
|
||||
|
||||
/*
|
||||
* Null values for the types.
|
||||
*/
|
||||
#define NULLDFSBNO ((xfs_dfsbno_t)-1)
|
||||
#define NULLDRFSBNO ((xfs_drfsbno_t)-1)
|
||||
#define NULLDRTBNO ((xfs_drtbno_t)-1)
|
||||
#define NULLDFILOFF ((xfs_dfiloff_t)-1)
|
||||
|
||||
#define NULLFSBLOCK ((xfs_fsblock_t)-1)
|
||||
#define NULLRFSBLOCK ((xfs_rfsblock_t)-1)
|
||||
#define NULLRTBLOCK ((xfs_rtblock_t)-1)
|
||||
|
|
Loading…
Reference in New Issue