1/* $Id: msdosfs_vnops.c,v 1.48 1997/10/16 10:48:52 phk Exp $ */ |
2/* $NetBSD: msdosfs_vnops.c,v 1.20 1994/08/21 18:44:13 ws Exp $ */ 3 4/*- 5 * Copyright (C) 1994 Wolfgang Solfrank. 6 * Copyright (C) 1994 TooLs GmbH. 7 * All rights reserved. 8 * Original code by Paul Popelka (paulp@uts.amdahl.com) (see below). 9 * --- 64 unchanged lines hidden (view full) --- 74#include <msdosfs/msdosfsmount.h> 75#include <msdosfs/fat.h> 76 77/* 78 * Prototypes for MSDOSFS vnode operations 79 */ 80static int msdosfs_create __P((struct vop_create_args *)); 81static int msdosfs_mknod __P((struct vop_mknod_args *)); |
82static int msdosfs_close __P((struct vop_close_args *)); 83static int msdosfs_access __P((struct vop_access_args *)); 84static int msdosfs_getattr __P((struct vop_getattr_args *)); 85static int msdosfs_setattr __P((struct vop_setattr_args *)); 86static int msdosfs_read __P((struct vop_read_args *)); 87static int msdosfs_write __P((struct vop_write_args *)); |
88static int msdosfs_fsync __P((struct vop_fsync_args *)); |
89static int msdosfs_remove __P((struct vop_remove_args *)); 90static int msdosfs_link __P((struct vop_link_args *)); 91static int msdosfs_rename __P((struct vop_rename_args *)); 92static int msdosfs_mkdir __P((struct vop_mkdir_args *)); 93static int msdosfs_rmdir __P((struct vop_rmdir_args *)); 94static int msdosfs_symlink __P((struct vop_symlink_args *)); 95static int msdosfs_readdir __P((struct vop_readdir_args *)); |
96static int msdosfs_abortop __P((struct vop_abortop_args *)); 97static int msdosfs_lock __P((struct vop_lock_args *)); 98static int msdosfs_unlock __P((struct vop_unlock_args *)); 99static int msdosfs_bmap __P((struct vop_bmap_args *)); 100static int msdosfs_strategy __P((struct vop_strategy_args *)); 101static int msdosfs_print __P((struct vop_print_args *)); 102static int msdosfs_islocked __P((struct vop_islocked_args *)); |
103static int msdosfs_pathconf __P((struct vop_pathconf_args *ap)); |
104 105/* 106 * Some general notes: 107 * 108 * In the ufs filesystem the inodes, superblocks, and indirect blocks are 109 * read/written using the vnode for the filesystem. Blocks that represent 110 * the contents of a file are read/written using the vnode for the file 111 * (including directories when they are read/written as files). This --- 90 unchanged lines hidden (view full) --- 202 zfree(namei_zone, ap->a_cnp->cn_pnbuf); 203 vput(ap->a_dvp); 204 break; 205 } 206 return error; 207} 208 209static int |
210msdosfs_close(ap) 211 struct vop_close_args /* { 212 struct vnode *a_vp; 213 int a_fflag; 214 struct ucred *a_cred; 215 struct proc *a_p; 216 } */ *ap; 217{ --- 583 unchanged lines hidden (view full) --- 801 } 802 } else if (ioflag & IO_SYNC) { 803 TIMEVAL_TO_TIMESPEC(&time, &ts); 804 error = deupdat(dep, &ts, 1); 805 } 806 return error; 807} 808 |
809/* 810 * Flush the blocks of a file to disk. 811 * 812 * This function is worthless for vnodes that represent directories. Maybe we 813 * could just do a sync if they try an fsync on a directory file. 814 */ 815static int 816msdosfs_fsync(ap) --- 38 unchanged lines hidden (view full) --- 855 goto loop; 856 } 857#endif 858 splx(s); 859 TIMEVAL_TO_TIMESPEC(&time, &ts); 860 return deupdat(VTODE(vp), &ts, wait); 861} 862 |
863static int |
864msdosfs_remove(ap) 865 struct vop_remove_args /* { 866 struct vnode *a_dvp; 867 struct vnode *a_vp; 868 struct componentname *a_cnp; 869 } */ *ap; 870{ 871 int error; --- 820 unchanged lines hidden (view full) --- 1692 if (dep->de_FileSize - (uio->uio_offset - bias) <= 0) 1693 *ap->a_eofflag = 1; 1694 else 1695 *ap->a_eofflag = 0; 1696 1697 return error; 1698} 1699 |
1700static int |
1701msdosfs_abortop(ap) 1702 struct vop_abortop_args /* { 1703 struct vnode *a_dvp; 1704 struct componentname *a_cnp; 1705 } */ *ap; 1706{ 1707 if ((ap->a_cnp->cn_flags & (HASBUF | SAVESTART)) == HASBUF) 1708 zfree(namei_zone, ap->a_cnp->cn_pnbuf); --- 70 unchanged lines hidden (view full) --- 1779 } 1780 if (ap->a_runb) { 1781 *ap->a_runb = 0; 1782 } 1783 return pcbmap(dep, ap->a_bn, ap->a_bnp, 0); 1784} 1785 1786static int |
1787msdosfs_strategy(ap) 1788 struct vop_strategy_args /* { 1789 struct buf *a_bp; 1790 } */ *ap; 1791{ 1792 struct buf *bp = ap->a_bp; 1793 struct denode *dep = VTODE(bp->b_vp); 1794 struct vnode *vp; --- 43 unchanged lines hidden (view full) --- 1838 dep->de_StartCluster, dep->de_dirclust, dep->de_diroffset); 1839 printf(" dev %d, %d", major(dep->de_dev), minor(dep->de_dev)); 1840 lockmgr_printinfo(&dep->de_lock); 1841 printf("\n"); 1842 return 0; 1843} 1844 1845static int |
1846msdosfs_pathconf(ap) 1847 struct vop_pathconf_args /* { 1848 struct vnode *a_vp; 1849 int a_name; 1850 int *a_retval; 1851 } */ *ap; 1852{ 1853 switch (ap->a_name) { --- 18 unchanged lines hidden (view full) --- 1872} 1873 1874/* Global vfs data structures for msdosfs */ 1875vop_t **msdosfs_vnodeop_p; 1876static struct vnodeopv_entry_desc msdosfs_vnodeop_entries[] = { 1877 { &vop_default_desc, (vop_t *) vn_default_error }, 1878 { &vop_abortop_desc, (vop_t *) msdosfs_abortop }, 1879 { &vop_access_desc, (vop_t *) msdosfs_access }, |
1880 { &vop_bmap_desc, (vop_t *) msdosfs_bmap }, 1881 { &vop_cachedlookup_desc, (vop_t *) msdosfs_lookup }, 1882 { &vop_close_desc, (vop_t *) msdosfs_close }, 1883 { &vop_create_desc, (vop_t *) msdosfs_create }, 1884 { &vop_fsync_desc, (vop_t *) msdosfs_fsync }, 1885 { &vop_getattr_desc, (vop_t *) msdosfs_getattr }, 1886 { &vop_inactive_desc, (vop_t *) msdosfs_inactive }, |
1887 { &vop_islocked_desc, (vop_t *) msdosfs_islocked }, 1888 { &vop_link_desc, (vop_t *) msdosfs_link }, 1889 { &vop_lock_desc, (vop_t *) msdosfs_lock }, 1890 { &vop_lookup_desc, (vop_t *) vfs_cache_lookup }, 1891 { &vop_mkdir_desc, (vop_t *) msdosfs_mkdir }, 1892 { &vop_mknod_desc, (vop_t *) msdosfs_mknod }, |
1893 { &vop_pathconf_desc, (vop_t *) msdosfs_pathconf }, |
1894 { &vop_print_desc, (vop_t *) msdosfs_print }, 1895 { &vop_read_desc, (vop_t *) msdosfs_read }, 1896 { &vop_readdir_desc, (vop_t *) msdosfs_readdir }, |
1897 { &vop_reclaim_desc, (vop_t *) msdosfs_reclaim }, 1898 { &vop_remove_desc, (vop_t *) msdosfs_remove }, 1899 { &vop_rename_desc, (vop_t *) msdosfs_rename }, 1900 { &vop_rmdir_desc, (vop_t *) msdosfs_rmdir }, |
1901 { &vop_setattr_desc, (vop_t *) msdosfs_setattr }, 1902 { &vop_strategy_desc, (vop_t *) msdosfs_strategy }, 1903 { &vop_symlink_desc, (vop_t *) msdosfs_symlink }, 1904 { &vop_unlock_desc, (vop_t *) msdosfs_unlock }, 1905 { &vop_write_desc, (vop_t *) msdosfs_write }, 1906 { NULL, NULL } 1907}; 1908static struct vnodeopv_desc msdosfs_vnodeop_opv_desc = 1909 { &msdosfs_vnodeop_p, msdosfs_vnodeop_entries }; 1910 1911VNODEOP_SET(msdosfs_vnodeop_opv_desc); |