[BACK]Return to xfs_vfsops-common.c CVS log [TXT][DIR] Up to [local] / sys / xfs

Annotation of sys/xfs/xfs_vfsops-common.c, Revision 1.1.1.1

1.1       nbrk        1: /*
                      2:  * Copyright (c) 1995 - 2002 Kungliga Tekniska Högskolan
                      3:  * (Royal Institute of Technology, Stockholm, Sweden).
                      4:  * All rights reserved.
                      5:  *
                      6:  * Redistribution and use in source and binary forms, with or without
                      7:  * modification, are permitted provided that the following conditions
                      8:  * are met:
                      9:  *
                     10:  * 1. Redistributions of source code must retain the above copyright
                     11:  *    notice, this list of conditions and the following disclaimer.
                     12:  *
                     13:  * 2. Redistributions in binary form must reproduce the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer in the
                     15:  *    documentation and/or other materials provided with the distribution.
                     16:  *
                     17:  * 3. Neither the name of the Institute nor the names of its contributors
                     18:  *    may be used to endorse or promote products derived from this software
                     19:  *    without specific prior written permission.
                     20:  *
                     21:  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
                     22:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     23:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     24:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
                     25:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     26:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     27:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     28:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     29:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     30:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     31:  * SUCH DAMAGE.
                     32:  */
                     33:
                     34: #include <xfs/xfs_locl.h>
                     35:
                     36: RCSID("$arla: xfs_vfsops-common.c,v 1.40 2003/06/02 18:26:40 lha Exp $");
                     37:
                     38: /*
                     39:  * NNPFS vfs operations.
                     40:  */
                     41:
                     42: #include <xfs/xfs_common.h>
                     43: #include <xfs/xfs_message.h>
                     44: #include <xfs/xfs_fs.h>
                     45: #include <xfs/xfs_dev.h>
                     46: #include <xfs/xfs_deb.h>
                     47: #include <xfs/xfs_syscalls.h>
                     48: #include <xfs/xfs_vfsops.h>
                     49:
                     50: #ifdef HAVE_KERNEL_UDEV2DEV
                     51: #define VA_RDEV_TO_DEV(x) udev2dev(x, 0) /* XXX what is the 0 */
                     52: #else
                     53: #define VA_RDEV_TO_DEV(x) x
                     54: #endif
                     55:
                     56:
                     57: struct xfs xfs[NNNPFS];
                     58:
                     59: /*
                     60:  * path and data is in system memory
                     61:  */
                     62:
                     63: int
                     64: xfs_mount_common_sys(struct mount *mp,
                     65:                     const char *path,
                     66:                     void *data,
                     67:                     struct nameidata *ndp,
                     68:                     d_thread_t *p)
                     69: {
                     70:     struct vnode *devvp;
                     71:     dev_t dev;
                     72:     int error;
                     73:     struct vattr vat;
                     74:
                     75:     NNPFSDEB(XDEBVFOPS, ("xfs_mount: "
                     76:                       "struct mount mp = %lx path = '%s' data = '%s'\n",
                     77:                       (unsigned long)mp, path, (char *)data));
                     78:
                     79: #ifdef ARLA_KNFS
                     80:     NNPFSDEB(XDEBVFOPS, ("xfs_mount: mount flags = %x\n", mp->mnt_flag));
                     81:
                     82:     /*
                     83:      * mountd(8) flushes all export entries when it starts
                     84:      * right now we ignore it (but should not)
                     85:      */
                     86:
                     87:     if (mp->mnt_flag & MNT_UPDATE ||
                     88:        mp->mnt_flag & MNT_DELEXPORT) {
                     89:
                     90:        NNPFSDEB(XDEBVFOPS,
                     91:               ("xfs_mount: ignoreing MNT_UPDATE or MNT_DELEXPORT\n"));
                     92:        return 0;
                     93:     }
                     94: #endif
                     95:
                     96:     NDINIT(ndp, LOOKUP, FOLLOW | LOCKLEAF, UIO_SYSSPACE, data, p);
                     97:     error = namei(ndp);
                     98:     if (error) {
                     99:        NNPFSDEB(XDEBVFOPS, ("namei failed, errno = %d\n", error));
                    100:        return error;
                    101:     }
                    102:
                    103:     devvp = ndp->ni_vp;
                    104:
                    105:     if (devvp->v_type != VCHR) {
                    106:        vput(devvp);
                    107:        NNPFSDEB(XDEBVFOPS, ("not VCHR (%d)\n", devvp->v_type));
                    108:        return ENXIO;
                    109:     }
                    110: #if defined(__osf__)
                    111:     VOP_GETATTR(devvp, &vat, ndp->ni_cred, error);
                    112: #elif defined(HAVE_FREEBSD_THREAD)
                    113:     error = VOP_GETATTR(devvp, &vat, p->td_proc->p_ucred, p);
                    114: #else
                    115:     error = VOP_GETATTR(devvp, &vat, p->p_ucred, p);
                    116: #endif
                    117:     vput(devvp);
                    118:     if (error) {
                    119:        NNPFSDEB(XDEBVFOPS, ("VOP_GETATTR failed, error = %d\n", error));
                    120:        return error;
                    121:     }
                    122:
                    123:     dev = VA_RDEV_TO_DEV(vat.va_rdev);
                    124:
                    125:     NNPFSDEB(XDEBVFOPS, ("dev = %d.%d\n", major(dev), minor(dev)));
                    126:
                    127:     if (!xfs_is_xfs_dev (dev)) {
                    128:        NNPFSDEB(XDEBVFOPS, ("%s is not a xfs device\n", (char *)data));
                    129:        return ENXIO;
                    130:     }
                    131:
                    132:     if (xfs[minor(dev)].status & NNPFS_MOUNTED)
                    133:        return EBUSY;
                    134:
                    135:     xfs[minor(dev)].status = NNPFS_MOUNTED;
                    136:     xfs[minor(dev)].mp = mp;
                    137:     xfs[minor(dev)].root = 0;
                    138:     xfs[minor(dev)].nnodes = 0;
                    139:     xfs[minor(dev)].fd = minor(dev);
                    140:
                    141:     nnfs_init_head(&xfs[minor(dev)].nodehead);
                    142:
                    143:     VFS_TO_NNPFS(mp) = &xfs[minor(dev)];
                    144: #if defined(HAVE_KERNEL_VFS_GETNEWFSID)
                    145: #if defined(HAVE_TWO_ARGUMENT_VFS_GETNEWFSID)
                    146:     vfs_getnewfsid(mp, MOUNT_AFS);
                    147: #else
                    148:     vfs_getnewfsid(mp);
                    149: #endif /* HAVE_TWO_ARGUMENT_VFS_GETNEWFSID */
                    150: #endif /* HAVE_KERNEL_VFS_GETNEWFSID */
                    151:
                    152:     mp->mnt_stat.f_bsize = DEV_BSIZE;
                    153: #ifndef __osf__
                    154:     mp->mnt_stat.f_iosize = DEV_BSIZE;
                    155:     mp->mnt_stat.f_owner = 0;
                    156: #endif
                    157:     mp->mnt_stat.f_blocks = 4711 * 4711;
                    158:     mp->mnt_stat.f_bfree = 4711 * 4711;
                    159:     mp->mnt_stat.f_bavail = 4711 * 4711;
                    160:     mp->mnt_stat.f_files = 4711;
                    161:     mp->mnt_stat.f_ffree = 4711;
                    162:     mp->mnt_stat.f_flags = mp->mnt_flag;
                    163:
                    164: #ifdef __osf__
                    165:     mp->mnt_stat.f_fsid.val[0] = dev;
                    166:     mp->mnt_stat.f_fsid.val[1] = MOUNT_NNPFS;
                    167:
                    168:     MALLOC(mp->m_stat.f_mntonname, char *, strlen(path) + 1,
                    169:           M_PATHNAME, M_WAITOK);
                    170:     strcpy(mp->m_stat.f_mntonname, path);
                    171:
                    172:     MALLOC(mp->m_stat.f_mntfromname, char *, sizeof("arla"),
                    173:           M_PATHNAME, M_WAITOK);
                    174:     strcpy(mp->m_stat.f_mntfromname, "arla");
                    175: #else /* __osf__ */
                    176:     strncpy(mp->mnt_stat.f_mntonname,
                    177:            path,
                    178:            sizeof(mp->mnt_stat.f_mntonname));
                    179:
                    180:     strncpy(mp->mnt_stat.f_mntfromname,
                    181:            data,
                    182:            sizeof(mp->mnt_stat.f_mntfromname));
                    183:
                    184:     strncpy(mp->mnt_stat.f_fstypename,
                    185:            "xfs",
                    186:            sizeof(mp->mnt_stat.f_fstypename));
                    187: #endif /* __osf__ */
                    188:
                    189:     return 0;
                    190: }
                    191:
                    192: int
                    193: xfs_mount_common(struct mount *mp,
                    194:                 const char *user_path,
                    195:                 void *user_data,
                    196:                 struct nameidata *ndp,
                    197:                 d_thread_t *p)
                    198: {
                    199:     char *path = NULL;
                    200:     char *data = NULL;
                    201:     size_t count;
                    202:     int error = 0;
                    203:
                    204:     data = malloc(MAXPATHLEN, M_TEMP, M_WAITOK);
                    205:     if (data == NULL) {
                    206:         error = ENOMEM;
                    207:        goto done;
                    208:     }
                    209:     path = malloc(MAXPATHLEN, M_TEMP, M_WAITOK);
                    210:     if (path == NULL) {
                    211:         error = ENOMEM;
                    212:        goto done;
                    213:     }
                    214:
                    215:     error = copyinstr(user_path, path, MAXPATHLEN, &count);
                    216:     if (error)
                    217:         goto done;
                    218:
                    219:     error = copyinstr(user_data, data, MAXPATHLEN, &count);
                    220:     if (error)
                    221:        goto done;
                    222:     error = xfs_mount_common_sys (mp, path, data, ndp, p);
                    223: done:
                    224:     free(data, M_TEMP);
                    225:     free(path, M_TEMP);
                    226:     return(error);
                    227: }
                    228:
                    229: #ifdef HAVE_KERNEL_DOFORCE
                    230: extern int doforce;
                    231: #endif
                    232:
                    233: int
                    234: xfs_unmount_common(struct mount *mp, int mntflags)
                    235: {
                    236:     struct xfs *xfsp = VFS_TO_NNPFS(mp);
                    237:     int flags = 0;
                    238:     int error;
                    239:
                    240:     if (mntflags & MNT_FORCE) {
                    241: #ifdef HAVE_KERNEL_DOFORCE
                    242:        if (!doforce)
                    243:            return EINVAL;
                    244: #endif
                    245:        flags |= FORCECLOSE;
                    246:     }
                    247:
                    248:     error = free_all_xfs_nodes(xfsp, flags, 1);
                    249:     if (error)
                    250:        return error;
                    251:
                    252:     xfsp->status = 0;
                    253:     NNPFS_TO_VFS(xfsp) = NULL;
                    254:     return 0;
                    255: }
                    256:
                    257: int
                    258: xfs_root_common(struct mount *mp, struct vnode **vpp,
                    259:                d_thread_t *proc, struct ucred *cred)
                    260: {
                    261:     struct xfs *xfsp = VFS_TO_NNPFS(mp);
                    262:     struct xfs_message_getroot msg;
                    263:     int error;
                    264:
                    265:     do {
                    266:        if (xfsp->root != NULL) {
                    267:            *vpp = XNODE_TO_VNODE(xfsp->root);
                    268:            xfs_do_vget(*vpp, LK_EXCLUSIVE, proc);
                    269:            return 0;
                    270:        }
                    271:        msg.header.opcode = NNPFS_MSG_GETROOT;
                    272:        msg.cred.uid = cred->cr_uid;
                    273:        msg.cred.pag = xfs_get_pag(cred);
                    274:        error = xfs_message_rpc(xfsp->fd, &msg.header, sizeof(msg), proc);
                    275:        if (error == 0)
                    276:            error = ((struct xfs_message_wakeup *) & msg)->error;
                    277:     } while (error == 0);
                    278:     /*
                    279:      * Failed to get message through, need to pretend that all went well
                    280:      * and return a fake dead vnode to be able to unmount.
                    281:      */
                    282:
                    283:     if ((error = xfs_make_dead_vnode(mp, vpp)))
                    284:        return error;
                    285:
                    286:     NNPFS_MAKE_VROOT(*vpp);
                    287:     return 0;
                    288: }

CVSweb