From: Bruce Evans <[EMAIL PROTECTED]>
> The kernel returns EROFS for unlink() without even looking up the last
> component of the filename.  This is a cosmetic bug IMO.  The errors
> listed in POSIX.1 are not required to be checked for in the given
> order.  However, checking in that order usually gives the most logical
> results.  For unlink() and similar syscalls, EROFS is at the end of
> the list.

I tried to fix this problem.  I think it is very dirty code but it
works to return ENOENT for "rm -rf" with read-only nfs mounted
filesystem.  Could someone clean up this?


Index: nfs_vnops.c
===================================================================
RCS file: /home/ncvs/src/sys/nfs/nfs_vnops.c,v
retrieving revision 1.150
diff -u -r1.150 nfs_vnops.c
--- nfs_vnops.c 2000/01/05 00:32:18     1.150
+++ nfs_vnops.c 2000/02/15 15:49:39
@@ -820,9 +820,6 @@
        struct proc *p = cnp->cn_proc;
 
        *vpp = NULLVP;
-       if ((flags & ISLASTCN) && (dvp->v_mount->mnt_flag & MNT_RDONLY) &&
-           (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME))
-               return (EROFS);
        if (dvp->v_type != VDIR)
                return (ENOTDIR);
        lockparent = flags & LOCKPARENT;
@@ -833,6 +830,11 @@
                struct vattr vattr;
                int vpid;
 
+               if ((flags & ISLASTCN) &&
+                   (dvp->v_mount->mnt_flag & MNT_RDONLY) &&
+                   (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME))
+                       return (EROFS);
+
                if ((error = VOP_ACCESS(dvp, VEXEC, cnp->cn_cred, p)) != 0) {
                        *vpp = NULLVP;
                        return (error);
@@ -894,6 +896,10 @@
                goto nfsmout;
        }
        nfsm_getfh(fhp, fhsize, v3);
+
+       if ((flags & ISLASTCN) && (dvp->v_mount->mnt_flag & MNT_RDONLY) &&
+           (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME))
+               return (EROFS);
 
        /*
         * Handle RENAME case...


Jun Kuriyama // [EMAIL PROTECTED]
            // [EMAIL PROTECTED]


To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to