xname.name = dep->name;
xname.len = dep->namelen;
dir_hash_add(mp->m_dirnameops->hashname(&xname), addr);
- ptr += M_DIROPS(mp)->data_entsize(dep->namelen);
+ ptr += libxfs_dir2_data_entsize(mp, dep->namelen);
count++;
lastfree = 0;
lino = be64_to_cpu(dep->inumber);
ptr += be16_to_cpu(dup->length);
else {
dep = (xfs_dir2_data_entry_t *)ptr;
- ptr += M_DIROPS(mp)->data_entsize(dep->namelen);
+ ptr += libxfs_dir2_data_entsize(mp, dep->namelen);
}
}
return i;
ptr += be16_to_cpu(dup->length);
else {
dep = (xfs_dir2_data_entry_t *)ptr;
- ptr += M_DIROPS(mp)->data_entsize(dep->namelen);
+ ptr += libxfs_dir2_data_entsize(mp, dep->namelen);
}
}
return ptr;
return bitize(be16_to_cpu(dup->length));
else {
dep = (xfs_dir2_data_entry_t *)dup;
- return bitize(M_DIROPS(mp)->data_entsize(dep->namelen));
+ return bitize(libxfs_dir2_data_entsize(mp, dep->namelen));
}
}
}
dep = (xfs_dir2_data_entry_t *)ptr;
- length = M_DIROPS(mp)->data_entsize(dep->namelen);
+ length = libxfs_dir2_data_entsize(mp, dep->namelen);
if (dir_offset + length > end_of_data ||
ptr + length > endptr) {
#define xfs_dir2_data_log_header libxfs_dir2_data_log_header
#define xfs_dir2_data_make_free libxfs_dir2_data_make_free
#define xfs_dir2_data_use_free libxfs_dir2_data_use_free
+#define xfs_dir2_data_entsize libxfs_dir2_data_entsize
#define xfs_dir2_shrink_inode libxfs_dir2_shrink_inode
#define xfs_dir2_sf_get_parent_ino libxfs_dir2_sf_get_parent_ino
#define xfs_dir2_sf_put_parent_ino libxfs_dir2_sf_put_parent_ino
sizeof(xfs_dir2_data_off_t) + sizeof(uint8_t)), \
XFS_DIR2_DATA_ALIGN)
-static int
+int
xfs_dir2_data_entsize(
+ struct xfs_mount *mp,
int n)
{
- return XFS_DIR2_DATA_ENTSIZE(n);
-}
-
-static int
-xfs_dir3_data_entsize(
- int n)
-{
- return XFS_DIR3_DATA_ENTSIZE(n);
+ if (xfs_sb_version_hasftype(&mp->m_sb))
+ return XFS_DIR3_DATA_ENTSIZE(n);
+ else
+ return XFS_DIR2_DATA_ENTSIZE(n);
}
static uint8_t
struct xfs_dir2_data_entry *dep)
{
return (__be16 *)((char *)dep +
- xfs_dir2_data_entsize(dep->namelen) - sizeof(__be16));
+ XFS_DIR2_DATA_ENTSIZE(dep->namelen) - sizeof(__be16));
}
static __be16 *
struct xfs_dir2_data_entry *dep)
{
return (__be16 *)((char *)dep +
- xfs_dir3_data_entsize(dep->namelen) - sizeof(__be16));
+ XFS_DIR3_DATA_ENTSIZE(dep->namelen) - sizeof(__be16));
}
static struct xfs_dir2_data_free *
}
static const struct xfs_dir_ops xfs_dir2_ops = {
- .data_entsize = xfs_dir2_data_entsize,
.data_get_ftype = xfs_dir2_data_get_ftype,
.data_put_ftype = xfs_dir2_data_put_ftype,
.data_entry_tag_p = xfs_dir2_data_entry_tag_p,
};
static const struct xfs_dir_ops xfs_dir2_ftype_ops = {
- .data_entsize = xfs_dir3_data_entsize,
.data_get_ftype = xfs_dir3_data_get_ftype,
.data_put_ftype = xfs_dir3_data_put_ftype,
.data_entry_tag_p = xfs_dir3_data_entry_tag_p,
};
static const struct xfs_dir_ops xfs_dir3_ops = {
- .data_entsize = xfs_dir3_data_entsize,
.data_get_ftype = xfs_dir3_data_get_ftype,
.data_put_ftype = xfs_dir3_data_put_ftype,
.data_entry_tag_p = xfs_dir3_data_entry_tag_p,
* directory operations vector for encode/decode routines
*/
struct xfs_dir_ops {
- int (*data_entsize)(int len);
uint8_t (*data_get_ftype)(struct xfs_dir2_data_entry *dep);
void (*data_put_ftype)(struct xfs_dir2_data_entry *dep,
uint8_t ftype);
extern int xfs_dir2_shrink_inode(struct xfs_da_args *args, xfs_dir2_db_t db,
struct xfs_buf *bp);
-extern void xfs_dir2_data_freescan_int(struct xfs_da_geometry *geo,
+extern void xfs_dir2_data_freescan_int(struct xfs_mount *mp,
const struct xfs_dir_ops *ops,
struct xfs_dir2_data_hdr *hdr, int *loghead);
extern void xfs_dir2_data_freescan(struct xfs_inode *dp,
if (error)
return error;
- len = dp->d_ops->data_entsize(args->namelen);
+ len = xfs_dir2_data_entsize(dp->i_mount, args->namelen);
/*
* Set up pointers to parts of the block.
needlog = needscan = 0;
xfs_dir2_data_make_free(args, bp,
(xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr),
- dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan);
+ xfs_dir2_data_entsize(dp->i_mount, dep->namelen), &needlog,
+ &needscan);
/*
* Fix up the block tail.
*/
xfs_dir2_data_log_entry(args, bp, dep);
blp[0].hashval = cpu_to_be32(xfs_dir_hash_dot);
blp[0].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(offset));
- offset += dp->d_ops->data_entsize(dep->namelen);
+ offset += xfs_dir2_data_entsize(mp, dep->namelen);
/*
* Create entry for ..
xfs_dir2_data_log_entry(args, bp, dep);
blp[1].hashval = cpu_to_be32(xfs_dir_hash_dotdot);
blp[1].address = cpu_to_be32(xfs_dir2_byte_to_dataptr(offset));
- offset += dp->d_ops->data_entsize(dep->namelen);
+ offset += xfs_dir2_data_entsize(mp, dep->namelen);
/*
* Loop over existing entries, stuff them in.
#include "xfs_mount.h"
#include "xfs_inode.h"
#include "xfs_dir2.h"
+#include "xfs_dir2_priv.h"
#include "xfs_trans.h"
static xfs_failaddr_t xfs_dir2_data_freefind_verify(
return __this_address;
if (xfs_dir_ino_validate(mp, be64_to_cpu(dep->inumber)))
return __this_address;
- if (offset + ops->data_entsize(dep->namelen) > end)
+ if (offset + xfs_dir2_data_entsize(mp, dep->namelen) > end)
return __this_address;
if (be16_to_cpu(*ops->data_entry_tag_p(dep)) != offset)
return __this_address;
if (i >= be32_to_cpu(btp->count))
return __this_address;
}
- offset += ops->data_entsize(dep->namelen);
+ offset += xfs_dir2_data_entsize(mp, dep->namelen);
}
/*
* Need to have seen all the entries and all the bestfree slots.
*/
void
xfs_dir2_data_freescan_int(
- struct xfs_da_geometry *geo,
+ struct xfs_mount *mp,
const struct xfs_dir_ops *ops,
struct xfs_dir2_data_hdr *hdr,
int *loghead)
memset(bf, 0, sizeof(*bf) * XFS_DIR2_DATA_FD_COUNT);
*loghead = 1;
- end = xfs_dir3_data_end_offset(geo, addr);
+ end = xfs_dir3_data_end_offset(mp->m_dir_geo, addr);
while (offset < end) {
struct xfs_dir2_data_unused *dup = addr + offset;
struct xfs_dir2_data_entry *dep = addr + offset;
* For active entries, check their tags and skip them.
*/
ASSERT(offset == be16_to_cpu(*ops->data_entry_tag_p(dep)));
- offset += ops->data_entsize(dep->namelen);
+ offset += xfs_dir2_data_entsize(mp, dep->namelen);
}
}
struct xfs_dir2_data_hdr *hdr,
int *loghead)
{
- return xfs_dir2_data_freescan_int(dp->i_mount->m_dir_geo, dp->d_ops,
- hdr, loghead);
+ return xfs_dir2_data_freescan_int(dp->i_mount, dp->d_ops, hdr, loghead);
}
/*
xfs_dir2_leaf_hdr_from_disk(dp->i_mount, &leafhdr, leaf);
ents = leafhdr.ents;
bestsp = xfs_dir2_leaf_bests_p(ltp);
- length = dp->d_ops->data_entsize(args->namelen);
+ length = xfs_dir2_data_entsize(dp->i_mount, args->namelen);
/*
* See if there are any entries with the same hash value
*/
xfs_dir2_data_make_free(args, dbp,
(xfs_dir2_data_aoff_t)((char *)dep - (char *)hdr),
- dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan);
+ xfs_dir2_data_entsize(dp->i_mount, dep->namelen), &needlog,
+ &needscan);
/*
* We just mark the leaf entry stale by putting a null in it.
*/
ASSERT(free->hdr.magic == cpu_to_be32(XFS_DIR2_FREE_MAGIC) ||
free->hdr.magic == cpu_to_be32(XFS_DIR3_FREE_MAGIC));
}
- length = dp->d_ops->data_entsize(args->namelen);
+ length = xfs_dir2_data_entsize(mp, args->namelen);
/*
* Loop over leaf entries with the right hash value.
*/
longest = be16_to_cpu(bf[0].length);
needlog = needscan = 0;
xfs_dir2_data_make_free(args, dbp, off,
- dp->d_ops->data_entsize(dep->namelen), &needlog, &needscan);
+ xfs_dir2_data_entsize(dp->i_mount, dep->namelen), &needlog,
+ &needscan);
/*
* Rescan the data block freespaces for bestfree.
* Log the data block header if needed.
int needscan = 0; /* need to rescan data frees */
__be16 *tagp; /* data entry tag pointer */
- length = dp->d_ops->data_entsize(args->namelen);
+ length = xfs_dir2_data_entsize(dp->i_mount, args->namelen);
error = xfs_dir2_node_find_freeblk(args, fblk, &dbno, &fbp, &freehdr,
&findex, length);
if (error)
struct xfs_buf *lbp, struct xfs_buf *dbp);
/* xfs_dir2_data.c */
+int xfs_dir2_data_entsize(struct xfs_mount *mp, int n);
+
#ifdef DEBUG
extern void xfs_dir3_data_check(struct xfs_inode *dp, struct xfs_buf *bp);
#else
sfep = xfs_dir2_sf_nextentry(mp, sfp, sfep);
}
- offset += dp->d_ops->data_entsize(dep->namelen);
+ offset += xfs_dir2_data_entsize(mp, dep->namelen);
}
ASSERT((char *)sfep - (char *)sfp == size);
*/
for (offset = dp->d_ops->data_first_offset,
oldsfep = xfs_dir2_sf_firstentry(oldsfp),
- add_datasize = dp->d_ops->data_entsize(args->namelen),
+ add_datasize = xfs_dir2_data_entsize(mp, args->namelen),
eof = (char *)oldsfep == &buf[old_isize];
!eof;
- offset = new_offset + dp->d_ops->data_entsize(oldsfep->namelen),
+ offset = new_offset + xfs_dir2_data_entsize(mp, oldsfep->namelen),
oldsfep = xfs_dir2_sf_nextentry(mp, oldsfp, oldsfep),
eof = (char *)oldsfep == &buf[old_isize]) {
new_offset = xfs_dir2_sf_get_offset(oldsfep);
int used; /* data bytes used */
sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
- size = dp->d_ops->data_entsize(args->namelen);
+ size = xfs_dir2_data_entsize(mp, args->namelen);
offset = dp->d_ops->data_first_offset;
sfep = xfs_dir2_sf_firstentry(sfp);
holefit = 0;
if (!holefit)
holefit = offset + size <= xfs_dir2_sf_get_offset(sfep);
offset = xfs_dir2_sf_get_offset(sfep) +
- dp->d_ops->data_entsize(sfep->namelen);
+ xfs_dir2_data_entsize(mp, sfep->namelen);
sfep = xfs_dir2_sf_nextentry(mp, sfp, sfep);
}
/*
i8count += ino > XFS_DIR2_MAX_SHORT_INUM;
offset =
xfs_dir2_sf_get_offset(sfep) +
- dp->d_ops->data_entsize(sfep->namelen);
+ xfs_dir2_data_entsize(mp, sfep->namelen);
ASSERT(xfs_dir2_sf_get_ftype(mp, sfep) < XFS_DIR3_FT_MAX);
}
ASSERT(i8count == sfp->i8count);
return __this_address;
offset = xfs_dir2_sf_get_offset(sfep) +
- dops->data_entsize(sfep->namelen);
+ xfs_dir2_data_entsize(mp, sfep->namelen);
sfep = next_sfep;
}
for (i = 0; i < sfp->count; i++) {
xfs_dir2_sf_put_offset(sfep, offset);
- offset += M_DIROPS(mp)->data_entsize(sfep->namelen);
+ offset += libxfs_dir2_data_entsize(mp, sfep->namelen);
sfep = libxfs_dir2_sf_nextentry(mp, sfp, sfep);
}
}
bad_offset = 1;
}
offset = xfs_dir2_sf_get_offset(sfep) +
- M_DIROPS(mp)->data_entsize(namelen);
+ libxfs_dir2_data_entsize(mp, namelen);
/*
* junk the entry by copying up the rest of the
continue;
}
dep = (xfs_dir2_data_entry_t *)ptr;
- if (ptr + M_DIROPS(mp)->data_entsize(dep->namelen) > endptr)
+ if (ptr + libxfs_dir2_data_entsize(mp, dep->namelen) > endptr)
break;
if (be16_to_cpu(*M_DIROPS(mp)->data_entry_tag_p(dep)) !=
(char *)dep - (char *)d)
break;
- ptr += M_DIROPS(mp)->data_entsize(dep->namelen);
+ ptr += libxfs_dir2_data_entsize(mp, dep->namelen);
lastfree = 0;
}
/*
/*
* Advance to the next entry.
*/
- ptr += M_DIROPS(mp)->data_entsize(dep->namelen);
+ ptr += libxfs_dir2_data_entsize(mp, dep->namelen);
}
/*
* Check the bestfree table.
da_bno, ino);
if (!no_modify) {
do_warn(_("repairing table\n"));
- libxfs_dir2_data_freescan_int(mp->m_dir_geo,
- M_DIROPS(mp), d, &i);
+ libxfs_dir2_data_freescan_int(mp, M_DIROPS(mp), d, &i);
*dirty = 1;
} else {
do_warn(_("would repair table\n"));
/* validate data entry size */
dep = (xfs_dir2_data_entry_t *)ptr;
- if (ptr + M_DIROPS(mp)->data_entsize(dep->namelen) > endptr)
+ if (ptr + libxfs_dir2_data_entsize(mp, dep->namelen) > endptr)
break;
if (be16_to_cpu(*M_DIROPS(mp)->data_entry_tag_p(dep)) !=
(char *)dep - (char *)d)
break;
- ptr += M_DIROPS(mp)->data_entsize(dep->namelen);
+ ptr += libxfs_dir2_data_entsize(mp, dep->namelen);
}
/* did we find an empty or corrupt block? */
addr = xfs_dir2_db_off_to_dataptr(mp->m_dir_geo, db,
ptr - (char *)d);
dep = (xfs_dir2_data_entry_t *)ptr;
- ptr += M_DIROPS(mp)->data_entsize(dep->namelen);
+ ptr += libxfs_dir2_data_entsize(mp, dep->namelen);
inum = be64_to_cpu(dep->inumber);
lastfree = 0;
/*
}
*num_illegal += nbad;
if (needscan)
- libxfs_dir2_data_freescan_int(mp->m_dir_geo, M_DIROPS(mp),
- d, &i);
+ libxfs_dir2_data_freescan_int(mp, M_DIROPS(mp), d, &i);
if (needlog)
libxfs_dir2_data_log_header(&da, bp);
error = -libxfs_trans_commit(tp);