1163838Spjd/*-
2163838Spjd * Copyright (c) 2006 Pawel Jakub Dawidek <pjd@FreeBSD.org>
3163838Spjd * All rights reserved.
4163838Spjd *
5163838Spjd * Redistribution and use in source and binary forms, with or without
6163838Spjd * modification, are permitted provided that the following conditions
7163838Spjd * are met:
8163838Spjd * 1. Redistributions of source code must retain the above copyright
9163838Spjd *    notice, this list of conditions and the following disclaimer.
10163838Spjd * 2. Redistributions in binary form must reproduce the above copyright
11163838Spjd *    notice, this list of conditions and the following disclaimer in the
12163838Spjd *    documentation and/or other materials provided with the distribution.
13163838Spjd *
14163838Spjd * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
15163838Spjd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16163838Spjd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17163838Spjd * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
18163838Spjd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19163838Spjd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20163838Spjd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21163838Spjd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22163838Spjd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23163838Spjd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24163838Spjd * SUCH DAMAGE.
25163838Spjd */
26163838Spjd
27163838Spjd#include <sys/cdefs.h>
28163838Spjd__FBSDID("$FreeBSD$");
29163838Spjd
30163838Spjd#include <sys/param.h>
31163838Spjd#include <sys/disklabel.h>
32163838Spjd#include <sys/mount.h>
33163838Spjd
34163838Spjd#include <ufs/ufs/dinode.h>
35163838Spjd#include <ufs/ffs/fs.h>
36163838Spjd
37163838Spjd#include <libufs.h>
38163838Spjd#include <libgeom.h>
39163838Spjd#include <core/geom.h>
40163838Spjd#include <misc/subr.h>
41163838Spjd
42163838Spjd#include "geom_journal.h"
43163838Spjd
44163838Spjdstatic struct fs *
45163838Spjdread_superblock(const char *prov)
46163838Spjd{
47163838Spjd	static struct uufsd disk;
48163838Spjd	struct fs *fs;
49163838Spjd
50163838Spjd	if (ufs_disk_fillout(&disk, prov) == -1)
51163838Spjd		return (NULL);
52163838Spjd	fs = &disk.d_fs;
53163838Spjd	ufs_disk_close(&disk);
54163838Spjd	return (fs);
55163838Spjd}
56163838Spjd
57163838Spjdint
58163838Spjdg_journal_ufs_exists(const char *prov)
59163838Spjd{
60163838Spjd
61163838Spjd	return (read_superblock(prov) != NULL);
62163838Spjd}
63163838Spjd
64163838Spjdint
65163838Spjdg_journal_ufs_using_last_sector(const char *prov)
66163838Spjd{
67163838Spjd	struct fs *fs;
68163838Spjd	off_t psize, fssize;
69163838Spjd
70163838Spjd	fs = read_superblock(prov);
71163838Spjd	if (fs == NULL)
72163838Spjd		return (0);
73245074Skib	/* Provider size in 512 bytes blocks. */
74245074Skib	psize = g_get_mediasize(prov) / DEV_BSIZE;
75245074Skib	/* File system size in 512 bytes blocks. */
76245074Skib	fssize = fsbtodb(fs, fs->fs_size);
77245074Skib	return (psize <= fssize);
78163838Spjd}
79