The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/ufs/ffs/ffs_vnops.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*
    2  * Copyright (c) 1982, 1986, 1989, 1993
    3  *      The Regents of the University of California.  All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  * 3. All advertising materials mentioning features or use of this software
   14  *    must display the following acknowledgement:
   15  *      This product includes software developed by the University of
   16  *      California, Berkeley and its contributors.
   17  * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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  *      @(#)ffs_vnops.c 8.7 (Berkeley) 2/3/94
   34  * $FreeBSD: src/sys/ufs/ffs/ffs_vnops.c,v 1.20.4.1 1999/09/05 08:23:37 peter Exp $
   35  */
   36 
   37 #include <sys/param.h>
   38 #include <sys/systm.h>
   39 #include <sys/resourcevar.h>
   40 #include <sys/signalvar.h>
   41 #include <sys/kernel.h>
   42 #include <sys/file.h>
   43 #include <sys/stat.h>
   44 #include <sys/buf.h>
   45 #include <sys/proc.h>
   46 #include <sys/conf.h>
   47 #include <sys/mount.h>
   48 #include <sys/vnode.h>
   49 #include <sys/malloc.h>
   50 #include <sys/lockf.h>
   51 
   52 #include <vm/vm.h>
   53 #include <vm/vm_param.h>
   54 #include <vm/vm_prot.h>
   55 #include <vm/vm_page.h>
   56 #include <vm/vm_object.h>
   57 #include <vm/vm_extern.h>
   58 
   59 #include <miscfs/specfs/specdev.h>
   60 #include <miscfs/fifofs/fifo.h>
   61 
   62 #include <ufs/ufs/quota.h>
   63 #include <ufs/ufs/inode.h>
   64 #include <ufs/ufs/dir.h>
   65 #include <ufs/ufs/ufs_extern.h>
   66 
   67 #include <ufs/ffs/fs.h>
   68 #include <ufs/ffs/ffs_extern.h>
   69 
   70 static int      ffs_fsync __P((struct vop_fsync_args *));
   71 static int      ffs_getpages __P((struct vop_getpages_args *));
   72 static int      ffs_read __P((struct vop_read_args *));
   73 static int      ffs_write __P((struct vop_write_args *));
   74 
   75 /* Global vfs data structures for ufs. */
   76 vop_t **ffs_vnodeop_p;
   77 static struct vnodeopv_entry_desc ffs_vnodeop_entries[] = {
   78         { &vop_default_desc, (vop_t *)vn_default_error },
   79         { &vop_lookup_desc, (vop_t *)ufs_lookup },      /* lookup */
   80         { &vop_create_desc, (vop_t *)ufs_create },      /* create */
   81         { &vop_mknod_desc, (vop_t *)ufs_mknod },        /* mknod */
   82         { &vop_open_desc, (vop_t *)ufs_open },          /* open */
   83         { &vop_close_desc, (vop_t *)ufs_close },        /* close */
   84         { &vop_access_desc, (vop_t *)ufs_access },      /* access */
   85         { &vop_getattr_desc, (vop_t *)ufs_getattr },    /* getattr */
   86         { &vop_setattr_desc, (vop_t *)ufs_setattr },    /* setattr */
   87         { &vop_read_desc, (vop_t *)ffs_read },          /* read */
   88         { &vop_write_desc, (vop_t *)ffs_write },        /* write */
   89         { &vop_ioctl_desc, (vop_t *)ufs_ioctl },        /* ioctl */
   90         { &vop_select_desc, (vop_t *)ufs_select },      /* select */
   91         { &vop_mmap_desc, (vop_t *)ufs_mmap },          /* mmap */
   92         { &vop_fsync_desc, (vop_t *)ffs_fsync },        /* fsync */
   93         { &vop_seek_desc, (vop_t *)ufs_seek },          /* seek */
   94         { &vop_remove_desc, (vop_t *)ufs_remove },      /* remove */
   95         { &vop_link_desc, (vop_t *)ufs_link },          /* link */
   96         { &vop_rename_desc, (vop_t *)ufs_rename },      /* rename */
   97         { &vop_mkdir_desc, (vop_t *)ufs_mkdir },        /* mkdir */
   98         { &vop_rmdir_desc, (vop_t *)ufs_rmdir },        /* rmdir */
   99         { &vop_symlink_desc, (vop_t *)ufs_symlink },    /* symlink */
  100         { &vop_readdir_desc, (vop_t *)ufs_readdir },    /* readdir */
  101         { &vop_readlink_desc, (vop_t *)ufs_readlink },  /* readlink */
  102         { &vop_abortop_desc, (vop_t *)ufs_abortop },    /* abortop */
  103         { &vop_inactive_desc, (vop_t *)ufs_inactive },  /* inactive */
  104         { &vop_reclaim_desc, (vop_t *)ufs_reclaim },    /* reclaim */
  105         { &vop_lock_desc, (vop_t *)ufs_lock },          /* lock */
  106         { &vop_unlock_desc, (vop_t *)ufs_unlock },      /* unlock */
  107         { &vop_bmap_desc, (vop_t *)ufs_bmap },          /* bmap */
  108         { &vop_strategy_desc, (vop_t *)ufs_strategy },  /* strategy */
  109         { &vop_print_desc, (vop_t *)ufs_print },        /* print */
  110         { &vop_islocked_desc, (vop_t *)ufs_islocked },  /* islocked */
  111         { &vop_pathconf_desc, (vop_t *)ufs_pathconf },  /* pathconf */
  112         { &vop_advlock_desc, (vop_t *)ufs_advlock },    /* advlock */
  113         { &vop_blkatoff_desc, (vop_t *)ffs_blkatoff },  /* blkatoff */
  114         { &vop_valloc_desc, (vop_t *)ffs_valloc },      /* valloc */
  115         { &vop_reallocblks_desc, (vop_t *)ffs_reallocblks },    /* reallocblks */
  116         { &vop_vfree_desc, (vop_t *)ffs_vfree },        /* vfree */
  117         { &vop_truncate_desc, (vop_t *)ffs_truncate },  /* truncate */
  118         { &vop_update_desc, (vop_t *)ffs_update },      /* update */
  119         { &vop_getpages_desc, (vop_t *)ffs_getpages},   /* getpages */
  120         { &vop_bwrite_desc, (vop_t *)vn_bwrite },       /* bwrite */
  121         { NULL, NULL }
  122 };
  123 static struct vnodeopv_desc ffs_vnodeop_opv_desc =
  124         { &ffs_vnodeop_p, ffs_vnodeop_entries };
  125 
  126 vop_t **ffs_specop_p;
  127 static struct vnodeopv_entry_desc ffs_specop_entries[] = {
  128         { &vop_default_desc, (vop_t *)vn_default_error },
  129         { &vop_lookup_desc, (vop_t *)spec_lookup },     /* lookup */
  130         { &vop_create_desc, (vop_t *)spec_create },     /* create */
  131         { &vop_mknod_desc, (vop_t *)spec_mknod },       /* mknod */
  132         { &vop_open_desc, (vop_t *)spec_open },         /* open */
  133         { &vop_close_desc, (vop_t *)ufsspec_close },    /* close */
  134         { &vop_access_desc, (vop_t *)ufs_access },      /* access */
  135         { &vop_getattr_desc, (vop_t *)ufs_getattr },    /* getattr */
  136         { &vop_setattr_desc, (vop_t *)ufs_setattr },    /* setattr */
  137         { &vop_read_desc, (vop_t *)ufsspec_read },      /* read */
  138         { &vop_write_desc, (vop_t *)ufsspec_write },    /* write */
  139         { &vop_ioctl_desc, (vop_t *)spec_ioctl },       /* ioctl */
  140         { &vop_select_desc, (vop_t *)spec_select },     /* select */
  141         { &vop_mmap_desc, (vop_t *)spec_mmap },         /* mmap */
  142         { &vop_fsync_desc, (vop_t *)ffs_fsync },        /* fsync */
  143         { &vop_seek_desc, (vop_t *)spec_seek },         /* seek */
  144         { &vop_remove_desc, (vop_t *)spec_remove },     /* remove */
  145         { &vop_link_desc, (vop_t *)spec_link },         /* link */
  146         { &vop_rename_desc, (vop_t *)spec_rename },     /* rename */
  147         { &vop_mkdir_desc, (vop_t *)spec_mkdir },       /* mkdir */
  148         { &vop_rmdir_desc, (vop_t *)spec_rmdir },       /* rmdir */
  149         { &vop_symlink_desc, (vop_t *)spec_symlink },   /* symlink */
  150         { &vop_readdir_desc, (vop_t *)spec_readdir },   /* readdir */
  151         { &vop_readlink_desc, (vop_t *)spec_readlink }, /* readlink */
  152         { &vop_abortop_desc, (vop_t *)spec_abortop },   /* abortop */
  153         { &vop_inactive_desc, (vop_t *)ufs_inactive },  /* inactive */
  154         { &vop_reclaim_desc, (vop_t *)ufs_reclaim },    /* reclaim */
  155         { &vop_lock_desc, (vop_t *)ufs_lock },          /* lock */
  156         { &vop_unlock_desc, (vop_t *)ufs_unlock },      /* unlock */
  157         { &vop_bmap_desc, (vop_t *)spec_bmap },         /* bmap */
  158         { &vop_strategy_desc, (vop_t *)spec_strategy }, /* strategy */
  159         { &vop_print_desc, (vop_t *)ufs_print },        /* print */
  160         { &vop_islocked_desc, (vop_t *)ufs_islocked },  /* islocked */
  161         { &vop_pathconf_desc, (vop_t *)spec_pathconf }, /* pathconf */
  162         { &vop_advlock_desc, (vop_t *)spec_advlock },   /* advlock */
  163         { &vop_blkatoff_desc, (vop_t *)spec_blkatoff }, /* blkatoff */
  164         { &vop_valloc_desc, (vop_t *)spec_valloc },     /* valloc */
  165         { &vop_reallocblks_desc, (vop_t *)spec_reallocblks },   /* reallocblks */
  166         { &vop_vfree_desc, (vop_t *)ffs_vfree },        /* vfree */
  167         { &vop_truncate_desc, (vop_t *)spec_truncate }, /* truncate */
  168         { &vop_update_desc, (vop_t *)ffs_update },      /* update */
  169         { &vop_getpages_desc, (vop_t *)spec_getpages},  /* getpages */
  170         { &vop_bwrite_desc, (vop_t *)vn_bwrite },       /* bwrite */
  171         { NULL, NULL }
  172 };
  173 static struct vnodeopv_desc ffs_specop_opv_desc =
  174         { &ffs_specop_p, ffs_specop_entries };
  175 
  176 vop_t **ffs_fifoop_p;
  177 static struct vnodeopv_entry_desc ffs_fifoop_entries[] = {
  178         { &vop_default_desc, (vop_t *)vn_default_error },
  179         { &vop_lookup_desc, (vop_t *)fifo_lookup },     /* lookup */
  180         { &vop_create_desc, (vop_t *)fifo_create },     /* create */
  181         { &vop_mknod_desc, (vop_t *)fifo_mknod },       /* mknod */
  182         { &vop_open_desc, (vop_t *)fifo_open },         /* open */
  183         { &vop_close_desc, (vop_t *)ufsfifo_close },    /* close */
  184         { &vop_access_desc, (vop_t *)ufs_access },      /* access */
  185         { &vop_getattr_desc, (vop_t *)ufs_getattr },    /* getattr */
  186         { &vop_setattr_desc, (vop_t *)ufs_setattr },    /* setattr */
  187         { &vop_read_desc, (vop_t *)ufsfifo_read },      /* read */
  188         { &vop_write_desc, (vop_t *)ufsfifo_write },    /* write */
  189         { &vop_ioctl_desc, (vop_t *)fifo_ioctl },       /* ioctl */
  190         { &vop_select_desc, (vop_t *)fifo_select },     /* select */
  191         { &vop_mmap_desc, (vop_t *)fifo_mmap },         /* mmap */
  192         { &vop_fsync_desc, (vop_t *)ffs_fsync },        /* fsync */
  193         { &vop_seek_desc, (vop_t *)fifo_seek },         /* seek */
  194         { &vop_remove_desc, (vop_t *)fifo_remove },     /* remove */
  195         { &vop_link_desc, (vop_t *)fifo_link },         /* link */
  196         { &vop_rename_desc, (vop_t *)fifo_rename },     /* rename */
  197         { &vop_mkdir_desc, (vop_t *)fifo_mkdir },       /* mkdir */
  198         { &vop_rmdir_desc, (vop_t *)fifo_rmdir },       /* rmdir */
  199         { &vop_symlink_desc, (vop_t *)fifo_symlink },   /* symlink */
  200         { &vop_readdir_desc, (vop_t *)fifo_readdir },   /* readdir */
  201         { &vop_readlink_desc, (vop_t *)fifo_readlink }, /* readlink */
  202         { &vop_abortop_desc, (vop_t *)fifo_abortop },   /* abortop */
  203         { &vop_inactive_desc, (vop_t *)ufs_inactive },  /* inactive */
  204         { &vop_reclaim_desc, (vop_t *)ufs_reclaim },    /* reclaim */
  205         { &vop_lock_desc, (vop_t *)ufs_lock },          /* lock */
  206         { &vop_unlock_desc, (vop_t *)ufs_unlock },      /* unlock */
  207         { &vop_bmap_desc, (vop_t *)fifo_bmap },         /* bmap */
  208         { &vop_strategy_desc, (vop_t *)fifo_strategy }, /* strategy */
  209         { &vop_print_desc, (vop_t *)ufs_print },        /* print */
  210         { &vop_islocked_desc, (vop_t *)ufs_islocked },  /* islocked */
  211         { &vop_pathconf_desc, (vop_t *)fifo_pathconf }, /* pathconf */
  212         { &vop_advlock_desc, (vop_t *)fifo_advlock },   /* advlock */
  213         { &vop_blkatoff_desc, (vop_t *)fifo_blkatoff }, /* blkatoff */
  214         { &vop_valloc_desc, (vop_t *)fifo_valloc },     /* valloc */
  215         { &vop_reallocblks_desc, (vop_t *)fifo_reallocblks },   /* reallocblks */
  216         { &vop_vfree_desc, (vop_t *)ffs_vfree },        /* vfree */
  217         { &vop_truncate_desc, (vop_t *)fifo_truncate }, /* truncate */
  218         { &vop_update_desc, (vop_t *)ffs_update },      /* update */
  219         { &vop_bwrite_desc, (vop_t *)vn_bwrite },       /* bwrite */
  220         { NULL, NULL }
  221 };
  222 static struct vnodeopv_desc ffs_fifoop_opv_desc =
  223         { &ffs_fifoop_p, ffs_fifoop_entries };
  224 
  225 VNODEOP_SET(ffs_vnodeop_opv_desc);
  226 VNODEOP_SET(ffs_specop_opv_desc);
  227 VNODEOP_SET(ffs_fifoop_opv_desc);
  228 
  229 #ifdef DEBUG
  230 /*
  231  * Enabling cluster read/write operations.
  232  */
  233 #include <sys/sysctl.h>
  234 int doclusterread = 1;
  235 SYSCTL_INT(_debug, 11, doclusterread, CTLFLAG_RW, &doclusterread, 0, "");
  236 int doclusterwrite = 1;
  237 SYSCTL_INT(_debug, 12, doclusterwrite, CTLFLAG_RW, &doclusterwrite, 0, "");
  238 #else
  239 /* XXX for ufs_readwrite */
  240 #define doclusterread 1
  241 #define doclusterwrite 1
  242 #endif
  243 
  244 #include <ufs/ufs/ufs_readwrite.c>
  245 
  246 /*
  247  * Synch an open file.
  248  */
  249 /* ARGSUSED */
  250 static int
  251 ffs_fsync(ap)
  252         struct vop_fsync_args /* {
  253                 struct vnode *a_vp;
  254                 struct ucred *a_cred;
  255                 int a_waitfor;
  256                 struct proc *a_p;
  257         } */ *ap;
  258 {
  259         register struct vnode *vp = ap->a_vp;
  260         register struct buf *bp;
  261         struct timeval tv;
  262         struct buf *nbp;
  263         int pass;
  264         int s;
  265 
  266         pass = 0;
  267         /*
  268          * Flush all dirty buffers associated with a vnode.
  269          */
  270 loop:
  271         s = splbio();
  272         for (bp = vp->v_dirtyblkhd.lh_first; bp; bp = nbp) {
  273                 nbp = bp->b_vnbufs.le_next;
  274                 if ((bp->b_flags & B_BUSY) || (pass == 0 && (bp->b_blkno < 0)))
  275                         continue;
  276                 if ((bp->b_flags & B_DELWRI) == 0)
  277                         panic("ffs_fsync: not dirty");
  278 
  279                 if (bp->b_vp != vp || ap->a_waitfor != MNT_NOWAIT) {
  280 
  281                         bremfree(bp);
  282                         bp->b_flags |= B_BUSY;
  283                         splx(s);
  284                         /*
  285                          * Wait for I/O associated with indirect blocks to complete,
  286                          * since there is no way to quickly wait for them below.
  287                          */
  288                         if (bp->b_vp == vp || ap->a_waitfor == MNT_NOWAIT)
  289                                 (void) bawrite(bp);
  290                         else
  291                                 (void) bwrite(bp);
  292                 } else {
  293                         vfs_bio_awrite(bp);
  294                         splx(s);
  295                 }
  296                 goto loop;
  297         }
  298         splx(s);
  299 
  300         if (pass == 0) {
  301                 pass = 1;
  302                 goto loop;
  303         }
  304 
  305         if (ap->a_waitfor == MNT_WAIT) {
  306                 s = splbio();
  307                 while (vp->v_numoutput) {
  308                         vp->v_flag |= VBWAIT;
  309                         (void) tsleep((caddr_t)&vp->v_numoutput, PRIBIO + 1, "ffsfsn", 0);
  310                 }
  311                 splx(s);
  312 #ifdef DIAGNOSTIC
  313                 if (vp->v_dirtyblkhd.lh_first) {
  314                         vprint("ffs_fsync: dirty", vp);
  315                         goto loop;
  316                 }
  317 #endif
  318         }
  319 
  320         tv = time;
  321         return (VOP_UPDATE(ap->a_vp, &tv, &tv, ap->a_waitfor == MNT_WAIT));
  322 }

Cache object: d5602417bece8054280ddb7425be7c8d


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.