as far as i'm concerned ok benno@

btw i have incresingly problems with mounting ntfs partions (read-only) with
this and use the ntfs_3g fuse port.

Martin Natano(nat...@natano.net) on 2016.08.31 23:34:43 +0200:
> 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