On Wed, Aug 31, 2016 at 05:17:41PM -0600, Bob Beck wrote: > Yes, ok beck@ > > to be shortly followed by the ntfs code - don't we have a fuse version of > this?
There's the ntfs_3g port benno uses. Iirc, access via ntfs_3g is somewhat slower than with the native filesystem (not that I care). > > > 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, > > }; > > > >