Yes, ok beck@ to be shortly followed by the ntfs code - don't we have a fuse version of this?
On Wed, Aug 31, 2016 at 3:34 PM, Martin Natano <nat...@natano.net> wrote: > mount_ntfs forces the mount point to be MNT_RDONLY, so the write parts > in ntfs are never used. OK to remove? > > natano > > > Index: ntfs/ntfs_subr.c > =================================================================== > RCS file: /cvs/src/sys/ntfs/ntfs_subr.c,v > retrieving revision 1.47 > diff -u -p -r1.47 ntfs_subr.c > --- ntfs/ntfs_subr.c 31 Aug 2016 15:13:57 -0000 1.47 > +++ ntfs/ntfs_subr.c 31 Aug 2016 19:58:31 -0000 > @@ -1336,152 +1336,6 @@ ntfs_filesize(struct ntfsmount *ntmp, st > } > > /* > - * This is one of the write routines. > - */ > -int > -ntfs_writeattr_plain(struct ntfsmount *ntmp, struct ntnode *ip, > - u_int32_t attrnum, char *attrname, off_t roff, size_t rsize, void > *rdata, > - size_t *initp, struct uio *uio) > -{ > - size_t init; > - int error = 0; > - off_t off = roff; > - size_t left = rsize, towrite; > - caddr_t data = rdata; > - struct ntvattr *vap; > - *initp = 0; > - > - while (left) { > - error = ntfs_ntvattrget(ntmp, ip, attrnum, attrname, > - ntfs_btocn(off), &vap); > - if (error) > - return (error); > - towrite = MIN(left, ntfs_cntob(vap->va_vcnend + 1) - off); > - DDPRINTF("ntfs_writeattr_plain: o: %lld, s: %zu " > - "(%llu - %llu)\n", off, towrite, > - vap->va_vcnstart, vap->va_vcnend); > - error = ntfs_writentvattr_plain(ntmp, ip, vap, > - off - > ntfs_cntob(vap->va_vcnstart), > - towrite, data, &init, uio); > - if (error) { > - DPRINTF("ntfs_writeattr_plain: > ntfs_writentvattr_plain " > - "failed: o: %lld, s: %zu\n", off, towrite); > - DPRINTF("ntfs_writeattr_plain: attrib: %llu - > %llu\n", > - vap->va_vcnstart, vap->va_vcnend); > - ntfs_ntvattrrele(vap); > - break; > - } > - ntfs_ntvattrrele(vap); > - left -= towrite; > - off += towrite; > - data = data + towrite; > - *initp += init; > - } > - > - return (error); > -} > - > -/* > - * This is one of the write routines. > - * > - * ntnode should be locked. > - */ > -int > -ntfs_writentvattr_plain(struct ntfsmount *ntmp, struct ntnode *ip, > - struct ntvattr *vap, off_t roff, size_t rsize, void *rdata, size_t > *initp, > - struct uio *uio) > -{ > - int error = 0; > - off_t off; > - int cnt; > - cn_t ccn, ccl, cn, cl; > - caddr_t data = rdata; > - struct buf *bp; > - size_t left, tocopy; > - > - *initp = 0; > - > - if ((vap->va_flag & NTFS_AF_INRUN) == 0) { > - DPRINTF("ntfs_writevattr_plain: CAN'T WRITE RES. > ATTRIBUTE\n"); > - return ENOTTY; > - } > - > - DDPRINTF("ntfs_writentvattr_plain: data in run: %lu chains\n", > - vap->va_vruncnt); > - > - off = roff; > - left = rsize; > - > - for (cnt = 0; left && (cnt < vap->va_vruncnt); cnt++) { > - ccn = vap->va_vruncn[cnt]; > - ccl = vap->va_vruncl[cnt]; > - > - DDPRINTF("ntfs_writentvattr_plain: left %zu, cn: 0x%llx, " > - "cl: %llu, off: %lld\n", left, ccn, ccl, off); > - > - if (ntfs_cntob(ccl) < off) { > - off -= ntfs_cntob(ccl); > - cnt++; > - continue; > - } > - if (!ccn && ip->i_number != NTFS_BOOTINO) > - continue; /* XXX */ > - > - ccl -= ntfs_btocn(off); > - cn = ccn + ntfs_btocn(off); > - off = ntfs_btocnoff(off); > - > - while (left && ccl) { > - /* > - * Always read and write single clusters at a time > - > - * we need to avoid requesting differently-sized > - * blocks at the same disk offsets to avoid > - * confusing the buffer cache. > - */ > - tocopy = MIN(left, ntfs_cntob(1) - off); > - cl = ntfs_btocl(tocopy + off); > - KASSERT(cl == 1 && tocopy <= ntfs_cntob(1)); > - DDPRINTF("ntfs_writentvattr_plain: write: cn: > 0x%llx " > - "cl: %llu, off: %lld len: %zu, left: %zu\n", > - cn, cl, off, tocopy, left); > - if ((off == 0) && (tocopy == ntfs_cntob(cl))) > - { > - bp = getblk(ntmp->ntm_devvp, > ntfs_cntobn(cn), > - ntfs_cntob(cl), 0, 0); > - clrbuf(bp); > - } else { > - error = bread(ntmp->ntm_devvp, > ntfs_cntobn(cn), > - ntfs_cntob(cl), &bp); > - if (error) { > - brelse(bp); > - return (error); > - } > - } > - if (uio) { > - error = uiomove(bp->b_data + off, tocopy, > uio); > - if (error != 0) > - break; > - } else > - memcpy(bp->b_data + off, data, tocopy); > - bawrite(bp); > - data = data + tocopy; > - *initp += tocopy; > - off = 0; > - left -= tocopy; > - cn += cl; > - ccl -= cl; > - } > - } > - > - if (left && error == 0) { > - printf("ntfs_writentvattr_plain: POSSIBLE RUN ERROR\n"); > - error = EINVAL; > - } > - > - return (error); > -} > - > -/* > * This is one of the read routines. > * > * ntnode should be locked. > Index: ntfs/ntfs_subr.h > =================================================================== > RCS file: /cvs/src/sys/ntfs/ntfs_subr.h,v > retrieving revision 1.9 > diff -u -p -r1.9 ntfs_subr.h > --- ntfs/ntfs_subr.h 19 Jan 2014 18:35:45 -0000 1.9 > +++ ntfs/ntfs_subr.h 31 Aug 2016 19:59:33 -0000 > @@ -91,8 +91,6 @@ int ntfs_ntvattrget(struct ntfsmount *, > void ntfs_ntref(struct ntnode *); > void ntfs_ntrele(struct ntnode *); > int ntfs_loadntnode( struct ntfsmount *, struct ntnode * ); > -int ntfs_writentvattr_plain(struct ntfsmount *, struct ntnode *, struct > ntvattr *, off_t, size_t, void *, size_t *, struct uio *); > -int ntfs_writeattr_plain(struct ntfsmount *, struct ntnode *, u_int32_t, > char *, off_t, size_t, void *, size_t *, struct uio *); > int ntfs_fget(struct ntfsmount *, struct ntnode *, int, char *, struct > fnode **); > void ntfs_frele(struct fnode *); > int ntfs_ntreaddir(struct ntfsmount *, struct fnode *, u_int32_t, struct > attr_indexentry **, struct proc *); > Index: ntfs/ntfs_vfsops.c > =================================================================== > RCS file: /cvs/src/sys/ntfs/ntfs_vfsops.c,v > retrieving revision 1.53 > diff -u -p -r1.53 ntfs_vfsops.c > --- ntfs/ntfs_vfsops.c 13 Aug 2016 20:53:17 -0000 1.53 > +++ ntfs/ntfs_vfsops.c 31 Aug 2016 20:34:41 -0000 > @@ -122,7 +122,6 @@ ntfs_mount(struct mount *mp, const char > struct ntfs_args args; > char fname[MNAMELEN]; > char fspec[MNAMELEN]; > - mode_t amode; > > ntfs_nthashinit(); > > @@ -193,9 +192,8 @@ ntfs_mount(struct mount *mp, const char > * requested device. > */ > if (p->p_ucred->cr_uid) { > - amode = (mp->mnt_flag & MNT_RDONLY) ? VREAD : (VREAD | > VWRITE); > vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, p); > - err = VOP_ACCESS(devvp, amode, p->p_ucred, p); > + err = VOP_ACCESS(devvp, VREAD, p->p_ucred, p); > VOP_UNLOCK(devvp, p); > if (err) > goto error_2; > @@ -282,7 +280,7 @@ ntfs_mountfs(struct vnode *devvp, struct > struct buf *bp; > struct ntfsmount *ntmp = NULL; > dev_t dev = devvp->v_rdev; > - int error, ronly, ncount, i; > + int error, ncount, i; > struct vnode *vp; > > /* > @@ -303,8 +301,7 @@ ntfs_mountfs(struct vnode *devvp, struct > if (error) > return (error); > > - ronly = (mp->mnt_flag & MNT_RDONLY) != 0; > - error = VOP_OPEN(devvp, ronly ? FREAD : FREAD|FWRITE, FSCRED, p); > + error = VOP_OPEN(devvp, FREAD, FSCRED, p); > if (error) > return (error); > > @@ -464,7 +461,7 @@ out: > > /* lock the device vnode before calling VOP_CLOSE() */ > vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, p); > - (void)VOP_CLOSE(devvp, ronly ? FREAD : FREAD|FWRITE, NOCRED, p); > + (void)VOP_CLOSE(devvp, FREAD, NOCRED, p); > VOP_UNLOCK(devvp, p); > > return (error); > @@ -480,7 +477,7 @@ int > ntfs_unmount(struct mount *mp, int mntflags, struct proc *p) > { > struct ntfsmount *ntmp; > - int error, ronly = 0, flags, i; > + int error, flags, i; > > DPRINTF("ntfs_unmount: unmounting...\n"); > ntmp = VFSTONTFS(mp); > @@ -524,8 +521,7 @@ ntfs_unmount(struct mount *mp, int mntfl > /* lock the device vnode before calling VOP_CLOSE() */ > vn_lock(ntmp->ntm_devvp, LK_EXCLUSIVE | LK_RETRY, p); > vinvalbuf(ntmp->ntm_devvp, V_SAVE, NOCRED, p, 0, 0); > - (void)VOP_CLOSE(ntmp->ntm_devvp, ronly ? FREAD : FREAD|FWRITE, > - NOCRED, p); > + (void)VOP_CLOSE(ntmp->ntm_devvp, FREAD, NOCRED, p); > vput(ntmp->ntm_devvp); > > /* free the toupper table, if this has been last mounted ntfs > volume */ > Index: ntfs/ntfs_vnops.c > =================================================================== > RCS file: /cvs/src/sys/ntfs/ntfs_vnops.c,v > retrieving revision 1.41 > diff -u -p -r1.41 ntfs_vnops.c > --- ntfs/ntfs_vnops.c 19 Mar 2016 12:04:16 -0000 1.41 > +++ ntfs/ntfs_vnops.c 31 Aug 2016 20:32:31 -0000 > @@ -57,7 +57,6 @@ > #include <sys/unistd.h> /* for pathconf(2) constants */ > > int ntfs_read(void *); > -int ntfs_write(void *); > int ntfs_getattr(void *); > int ntfs_inactive(void *); > int ntfs_print(void *); > @@ -292,29 +291,8 @@ ntfs_strategy(void *v) > bzero(bp->b_data + toread, bp->b_bcount - toread); > } > } else { > - size_t tmp; > - u_int32_t towrite; > - > - if (ntfs_cntob(bp->b_blkno) + bp->b_bcount >= fp->f_size) { > - printf("ntfs_strategy: CAN'T EXTEND FILE\n"); > - bp->b_error = error = EFBIG; > - bp->b_flags |= B_ERROR; > - } else { > - towrite = MIN(bp->b_bcount, > - fp->f_size - ntfs_cntob(bp->b_blkno)); > - DPRINTF("ntfs_strategy: towrite: %u, fsize: > %llu\n", > - towrite, fp->f_size); > - > - error = ntfs_writeattr_plain(ntmp, ip, > fp->f_attrtype, > - fp->f_attrname, ntfs_cntob(bp->b_blkno), > towrite, > - bp->b_data, &tmp, NULL); > - > - if (error) { > - printf("ntfs_strategy: ntfs_writeattr > fail\n"); > - bp->b_error = error; > - bp->b_flags |= B_ERROR; > - } > - } > + bp->b_error = error = EROFS; > + bp->b_flags |= B_ERROR; > } > s = splbio(); > biodone(bp); > @@ -323,42 +301,6 @@ ntfs_strategy(void *v) > } > > int > -ntfs_write(void *v) > -{ > - struct vop_write_args *ap = v; > - struct vnode *vp = ap->a_vp; > - struct fnode *fp = VTOF(vp); > - struct ntnode *ip = FTONT(fp); > - struct uio *uio = ap->a_uio; > - struct ntfsmount *ntmp = ip->i_mp; > - u_int64_t towrite; > - size_t written; > - int error; > - > - DPRINTF("ntfs_write: ino: %u, off: %lld resid: %zu, segflg: %d\n", > - ip->i_number, uio->uio_offset, uio->uio_resid, > uio->uio_segflg); > - DPRINTF("ntfs_write: filesize: %llu", fp->f_size); > - > - if (uio->uio_resid + uio->uio_offset > fp->f_size) { > - printf("ntfs_write: CAN'T WRITE BEYOND END OF FILE\n"); > - return (EFBIG); > - } > - > - towrite = MIN(uio->uio_resid, fp->f_size - uio->uio_offset); > - > - DPRINTF(", towrite: %llu\n", towrite); > - > - error = ntfs_writeattr_plain(ntmp, ip, fp->f_attrtype, > - fp->f_attrname, uio->uio_offset, towrite, NULL, &written, > uio); > -#ifdef NTFS_DEBUG > - if (error) > - printf("ntfs_write: ntfs_writeattr failed: %d\n", error); > -#endif > - > - return (error); > -} > - > -int > ntfs_access(void *v) > { > struct vop_access_args *ap = v; > @@ -372,18 +314,15 @@ ntfs_access(void *v) > DPRINTF("ntfs_access: %u\n", ip->i_number); > > /* > - * Disallow write attempts on read-only file systems; > - * unless the file is a socket, fifo, or a block or > - * character device resident on the file system. > + * Disallow write attempts unless the file is a socket, fifo, or > + * a block or character device resident on the file system. > */ > if (mode & VWRITE) { > switch ((int)vp->v_type) { > case VDIR: > case VLNK: > case VREG: > - if (vp->v_mount->mnt_flag & MNT_RDONLY) > - return (EROFS); > - break; > + return (EROFS); > } > } > > @@ -606,7 +545,6 @@ ntfs_lookup(void *v) > return (error); > > if ((cnp->cn_flags & ISLASTCN) && > - (dvp->v_mount->mnt_flag & MNT_RDONLY) && > (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME)) > return (EROFS); > > @@ -746,5 +684,4 @@ struct vops ntfs_vops = { > .vop_strategy = ntfs_strategy, > .vop_bwrite = vop_generic_bwrite, > .vop_read = ntfs_read, > - .vop_write = ntfs_write, > }; > >