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,
> >  };
> >
> >

Reply via email to