1/* $NetBSD: ops_xfs.c,v 1.1.1.2 2009/03/20 20:26:50 christos Exp $ */ 2 3/* 4 * Copyright (c) 1997-2009 Erez Zadok 5 * Copyright (c) 1990 Jan-Simon Pendry 6 * Copyright (c) 1990 Imperial College of Science, Technology & Medicine 7 * Copyright (c) 1990 The Regents of the University of California. 8 * All rights reserved. 9 * 10 * This code is derived from software contributed to Berkeley by 11 * Jan-Simon Pendry at Imperial College, London. 12 * 13 * Redistribution and use in source and binary forms, with or without 14 * modification, are permitted provided that the following conditions 15 * are met: 16 * 1. Redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer. 18 * 2. Redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution. 21 * 3. All advertising materials mentioning features or use of this software 22 * must display the following acknowledgment: 23 * This product includes software developed by the University of 24 * California, Berkeley and its contributors. 25 * 4. Neither the name of the University nor the names of its contributors 26 * may be used to endorse or promote products derived from this software 27 * without specific prior written permission. 28 * 29 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 30 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 31 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 32 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 33 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 34 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 35 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 36 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 37 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 38 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 39 * SUCH DAMAGE. 40 * 41 * 42 * File: am-utils/amd/ops_xfs.c 43 * 44 */ 45 46/* 47 * Irix UN*X file system: XFS (Extended File System) 48 */ 49 50#ifdef HAVE_CONFIG_H 51# include <config.h> 52#endif /* HAVE_CONFIG_H */ 53#include <am_defs.h> 54#include <amd.h> 55 56/* forward declarations */ 57static char *xfs_match(am_opts *fo); 58static int xfs_mount(am_node *am, mntfs *mf); 59static int xfs_umount(am_node *am, mntfs *mf); 60 61/* 62 * Ops structure 63 */ 64am_ops xfs_ops = 65{ 66 "xfs", 67 xfs_match, 68 0, /* xfs_init */ 69 xfs_mount, 70 xfs_umount, 71 amfs_error_lookup_child, 72 amfs_error_mount_child, 73 amfs_error_readdir, 74 0, /* xfs_readlink */ 75 0, /* xfs_mounted */ 76 0, /* xfs_umounted */ 77 amfs_generic_find_srvr, 78 0, /* xfs_get_wchan */ 79 FS_MKMNT | FS_NOTIMEOUT | FS_UBACKGROUND | FS_AMQINFO, /* nfs_fs_flags */ 80#ifdef HAVE_FS_AUTOFS 81 AUTOFS_XFS_FS_FLAGS, 82#endif /* HAVE_FS_AUTOFS */ 83}; 84 85 86/* 87 * XFS needs local filesystem and device. 88 */ 89static char * 90xfs_match(am_opts *fo) 91{ 92 93 if (!fo->opt_dev) { 94 plog(XLOG_USER, "xfs: no device specified"); 95 return 0; 96 } 97 98 dlog("XFS: mounting device \"%s\" on \"%s\"", fo->opt_dev, fo->opt_fs); 99 100 /* 101 * Determine magic cookie to put in mtab 102 */ 103 return strdup(fo->opt_dev); 104} 105 106 107static int 108mount_xfs(char *mntdir, char *fs_name, char *opts, int on_autofs) 109{ 110 xfs_args_t xfs_args; 111 mntent_t mnt; 112 int flags; 113 114 /* 115 * Figure out the name of the file system type. 116 */ 117 MTYPE_TYPE type = MOUNT_TYPE_XFS; 118 119 memset((voidp) &xfs_args, 0, sizeof(xfs_args)); /* Paranoid */ 120 121 /* 122 * Fill in the mount structure 123 */ 124 memset((voidp) &mnt, 0, sizeof(mnt)); 125 mnt.mnt_dir = mntdir; 126 mnt.mnt_fsname = fs_name; 127 mnt.mnt_type = MNTTAB_TYPE_XFS; 128 mnt.mnt_opts = opts; 129 130 flags = compute_mount_flags(&mnt); 131#ifdef HAVE_FS_AUTOFS 132 if (on_autofs) 133 flags |= autofs_compute_mount_flags(&mnt); 134#endif /* HAVE_FS_AUTOFS */ 135 136#ifdef HAVE_XFS_ARGS_T_FLAGS 137 xfs_args.flags = 0; /* XXX: fix this to correct flags */ 138#endif /* HAVE_XFS_ARGS_T_FLAGS */ 139#ifdef HAVE_XFS_ARGS_T_FSPEC 140 xfs_args.fspec = fs_name; 141#endif /* HAVE_XFS_ARGS_T_FSPEC */ 142 143 /* 144 * Call generic mount routine 145 */ 146 return mount_fs(&mnt, flags, (caddr_t) &xfs_args, 0, type, 0, NULL, mnttab_file_name, on_autofs); 147} 148 149 150static int 151xfs_mount(am_node *am, mntfs *mf) 152{ 153 int on_autofs = mf->mf_flags & MFF_ON_AUTOFS; 154 int error; 155 156 error = mount_xfs(mf->mf_mount, mf->mf_info, mf->mf_mopts, on_autofs); 157 if (error) { 158 errno = error; 159 plog(XLOG_ERROR, "mount_xfs: %m"); 160 return error; 161 } 162 163 return 0; 164} 165 166 167static int 168xfs_umount(am_node *am, mntfs *mf) 169{ 170 int unmount_flags = (mf->mf_flags & MFF_ON_AUTOFS) ? AMU_UMOUNT_AUTOFS : 0; 171 172 return UMOUNT_FS(mf->mf_mount, mnttab_file_name, unmount_flags); 173} 174