コード例 #1
0
ファイル: xfs_macros.c プロジェクト: kzlin129/tt-gpl
int
xfs_sb_version_hassector(xfs_sb_t *sbp)
{
    return XFS_SB_VERSION_HASSECTOR(sbp);
}
コード例 #2
0
/*
 * xfs_mount
 *
 * The file system configurations are:
 *	(1) device (partition) with data and internal log
 *	(2) logical volume with data and log subvolumes.
 *	(3) logical volume with data, log, and realtime subvolumes.
 *
 * We only have to handle opening the log and realtime volumes here if
 * they are present.  The data subvolume has already been opened by
 * get_sb_bdev() and is stored in vfsp->vfs_super->s_bdev.
 */
STATIC int
xfs_mount(
	struct bhv_desc		*bhvp,
	struct xfs_mount_args	*args,
	cred_t			*credp)
{
	struct vfs		*vfsp = bhvtovfs(bhvp);
	struct bhv_desc		*p;
	struct xfs_mount	*mp = XFS_BHVTOM(bhvp);
	struct block_device	*ddev, *logdev, *rtdev;
	int			flags = 0, error;

	ddev = vfsp->vfs_super->s_bdev;
	logdev = rtdev = NULL;

	/*
	 * Open real time and log devices - order is important.
	 */
	if (args->logname[0]) {
		error = xfs_blkdev_get(mp, args->logname, &logdev);
		if (error)
			return error;
	}
	if (args->rtname[0]) {
		error = xfs_blkdev_get(mp, args->rtname, &rtdev);
		if (error) {
			xfs_blkdev_put(logdev);
			return error;
		}

		if (rtdev == ddev || rtdev == logdev) {
			cmn_err(CE_WARN,
	"XFS: Cannot mount filesystem with identical rtdev and ddev/logdev.");
			xfs_blkdev_put(logdev);
			xfs_blkdev_put(rtdev);
			return EINVAL;
		}
	}

	/*
	 * Setup xfs_mount function vectors from available behaviors
	 */
	p = vfs_bhv_lookup(vfsp, VFS_POSITION_DM);
	mp->m_dm_ops = p ? *(xfs_dmops_t *) vfs_bhv_custom(p) : xfs_dmcore_stub;
	p = vfs_bhv_lookup(vfsp, VFS_POSITION_QM);
	mp->m_qm_ops = p ? *(xfs_qmops_t *) vfs_bhv_custom(p) : xfs_qmcore_stub;
	p = vfs_bhv_lookup(vfsp, VFS_POSITION_IO);
	mp->m_io_ops = p ? *(xfs_ioops_t *) vfs_bhv_custom(p) : xfs_iocore_xfs;

	/*
	 * Setup xfs_mount buffer target pointers
	 */
	mp->m_ddev_targp = xfs_alloc_buftarg(ddev);
	if (rtdev)
		mp->m_rtdev_targp = xfs_alloc_buftarg(rtdev);
	mp->m_logdev_targp = (logdev && logdev != ddev) ?
				xfs_alloc_buftarg(logdev) : mp->m_ddev_targp;

	/*
	 * Setup flags based on mount(2) options and then the superblock
	 */
	error = xfs_start_flags(vfsp, args, mp);
	if (error)
		goto error;
	error = xfs_readsb(mp);
	if (error)
		goto error;
	error = xfs_finish_flags(vfsp, args, mp);
	if (error) {
		xfs_freesb(mp);
		goto error;
	}

	/*
	 * Setup xfs_mount buffer target pointers based on superblock
	 */
	xfs_setsize_buftarg(mp->m_ddev_targp, mp->m_sb.sb_blocksize,
			    mp->m_sb.sb_sectsize);
	if (logdev && logdev != ddev) {
		unsigned int	log_sector_size = BBSIZE;

		if (XFS_SB_VERSION_HASSECTOR(&mp->m_sb))
			log_sector_size = mp->m_sb.sb_logsectsize;
		xfs_setsize_buftarg(mp->m_logdev_targp, mp->m_sb.sb_blocksize,
				    log_sector_size);
	}
	if (rtdev)
		xfs_setsize_buftarg(mp->m_rtdev_targp, mp->m_sb.sb_blocksize,
				    mp->m_sb.sb_blocksize);

	if (!(error = XFS_IOINIT(vfsp, args, flags)))
		return 0;

 error:
	xfs_binval(mp->m_ddev_targp);
	if (logdev != NULL && logdev != ddev) {
		xfs_binval(mp->m_logdev_targp);
	}
	if (rtdev != NULL) {
		xfs_binval(mp->m_rtdev_targp);
	}
	xfs_unmountfs_close(mp, NULL);
	return error;
}