/* libxfs parameters */
extern libxfs_init_t x;
+void xlog_init(struct xfs_mount *mp, struct xlog *log, libxfs_init_t *x);
int xlog_is_dirty(struct xfs_mount *mp, struct xlog *log, libxfs_init_t *x);
extern struct xfs_buf *xlog_get_bp(struct xlog *, int);
int print_record_header;
libxfs_init_t x;
-/*
- * Return 1 for dirty, 0 for clean, -1 for errors
- */
-int
-xlog_is_dirty(
+void
+xlog_init(
struct xfs_mount *mp,
struct xlog *log,
libxfs_init_t *x)
{
- int error;
- xfs_daddr_t head_blk, tail_blk;
-
memset(log, 0, sizeof(*log));
/* We (re-)init members of libxfs_init_t here? really? */
ASSERT(mp->m_sb.sb_logsectlog >= BBSHIFT);
}
log->l_sectbb_mask = (1 << log->l_sectbb_log) - 1;
+}
+
+/*
+ * Return 1 for dirty, 0 for clean, -1 for errors
+ */
+int
+xlog_is_dirty(
+ struct xfs_mount *mp,
+ struct xlog *log,
+ libxfs_init_t *x)
+{
+ int error;
+ xfs_daddr_t head_blk, tail_blk;
+
+ xlog_init(mp, log, x);
error = xlog_find_tail(log, &head_blk, &tail_blk);
if (error) {
{
int fd;
char buf[BBSIZE];
- xfs_sb_t *sb;
/* On Linux we always read the superblock of the
* filesystem. We need this to get the length of the
close (fd);
if (!x.disfile) {
+ struct xfs_sb *sb = &mp->m_sb;
+
/*
* Conjure up a mount structure
*/
- sb = &mp->m_sb;
libxfs_sb_from_disk(sb, (struct xfs_dsb *)buf);
mp->m_features |= libxfs_sb_version_to_features(&mp->m_sb);
mp->m_blkbb_log = sb->sb_blocklog - BBSHIFT;
- x.logBBsize = XFS_FSB_TO_BB(mp, sb->sb_logblocks);
- x.logBBstart = XFS_FSB_TO_DADDR(mp, sb->sb_logstart);
- x.lbsize = BBSIZE;
- if (xfs_has_sector(mp))
- x.lbsize <<= (sb->sb_logsectlog - BBSHIFT);
+ xlog_init(mp, log, &x);
if (!x.logname && sb->sb_logstart == 0) {
fprintf(stderr, _(" external log device not specified\n\n"));
struct stat s;
stat(x.dname, &s);
- x.logBBsize = s.st_size >> 9;
- x.logBBstart = 0;
- x.lbsize = BBSIZE;
- }
- log->l_dev = mp->m_logdev_targp;
- log->l_logBBstart = x.logBBstart;
- log->l_logBBsize = x.logBBsize;
- log->l_sectBBsize = BTOBB(x.lbsize);
- log->l_mp = mp;
+ log->l_logBBsize = s.st_size >> 9;
+ log->l_logBBstart = 0;
+ log->l_sectBBsize = BTOBB(BBSIZE);
+ log->l_dev = mp->m_logdev_targp;
+ log->l_mp = mp;
+ }
if (x.logname && *x.logname) { /* External log */
if ((fd = open(x.logname, O_RDONLY)) == -1) {
xfs_daddr_t tail_blk;
struct xlog *log = mp->m_log;
- memset(log, 0, sizeof(struct xlog));
- x.logBBsize = XFS_FSB_TO_BB(mp, mp->m_sb.sb_logblocks);
- x.logBBstart = XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart);
- x.lbsize = BBSIZE;
- if (xfs_has_sector(mp))
- x.lbsize <<= (mp->m_sb.sb_logsectlog - BBSHIFT);
-
- log->l_dev = mp->m_logdev_targp;
- log->l_logBBsize = x.logBBsize;
- log->l_logBBstart = x.logBBstart;
- log->l_sectBBsize = BTOBB(x.lbsize);
- log->l_mp = mp;
- if (xfs_has_sector(mp)) {
- log->l_sectbb_log = mp->m_sb.sb_logsectlog - BBSHIFT;
- ASSERT(log->l_sectbb_log <= mp->m_sectbb_log);
- /* for larger sector sizes, must have v2 or external log */
- ASSERT(log->l_sectbb_log == 0 ||
- log->l_logBBstart == 0 ||
- xfs_has_logv2(mp));
- ASSERT(mp->m_sb.sb_logsectlog >= BBSHIFT);
- }
- log->l_sectbb_mask = (1 << log->l_sectbb_log) - 1;
+ xlog_init(mp, mp->m_log, &x);
/*
* Find the log head and tail and alert the user to the situation if the