Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/fs/smbfs Use DENYNONE to give unixy semantics of permitt...



details:   https://anonhg.NetBSD.org/src/rev/f6d764fcdc85
branches:  trunk
changeset: 570764:f6d764fcdc85
user:      peter <peter%NetBSD.org@localhost>
date:      Wed Oct 27 19:17:13 2004 +0000

description:
Use DENYNONE to give unixy semantics of permitting everything not forbidden
by permissions.  Ie denial is up to server with clients/openers needing to use
advisory locks for further control.  From FreeBSD.

Fixes file access problem when the file is already open on the server.
Problem reported by George Abdelmalik <gabdelmalik at avdat dot com dot au>

Reviewed by jdolecek.

diffstat:

 sys/fs/smbfs/smbfs_vnops.c |  23 ++++++++++++++++-------
 1 files changed, 16 insertions(+), 7 deletions(-)

diffs (58 lines):

diff -r f51371c663cf -r f6d764fcdc85 sys/fs/smbfs/smbfs_vnops.c
--- a/sys/fs/smbfs/smbfs_vnops.c        Wed Oct 27 19:12:31 2004 +0000
+++ b/sys/fs/smbfs/smbfs_vnops.c        Wed Oct 27 19:17:13 2004 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: smbfs_vnops.c,v 1.44 2004/09/13 19:25:48 jdolecek Exp $        */
+/*     $NetBSD: smbfs_vnops.c,v 1.45 2004/10/27 19:17:13 peter Exp $   */
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -71,7 +71,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: smbfs_vnops.c,v 1.44 2004/09/13 19:25:48 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: smbfs_vnops.c,v 1.45 2004/10/27 19:17:13 peter Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -270,17 +270,25 @@
 
        smb_makescred(&scred, ap->a_p, ap->a_cred);
        if (vp->v_type == VDIR)
-               error = smbfs_smb_ntcreatex(np, SMB_AM_OPENREAD, &scred);
+               error = smbfs_smb_ntcreatex(np,
+                   SMB_SM_DENYNONE|SMB_AM_OPENREAD, &scred);
        else {
-               accmode = SMB_AM_OPENREAD;
+               /*
+                * Use DENYNONE to give unixy semantics of permitting
+                * everything not forbidden by permissions.  Ie denial
+                * is up to server with clients/openers needing to use
+                * advisory locks for further control.
+                */
+               accmode = SMB_SM_DENYNONE|SMB_AM_OPENREAD;
                if ((vp->v_mount->mnt_flag & MNT_RDONLY) == 0)
-                       accmode = SMB_AM_OPENRW;
+                       accmode = SMB_SM_DENYNONE|SMB_AM_OPENRW;
                error = smbfs_smb_open(np, accmode, &scred);
                if (error) {
                        if (ap->a_mode & FWRITE)
                                return EACCES;
                
-                       error = smbfs_smb_open(np, SMB_AM_OPENREAD, &scred);
+                       error = smbfs_smb_open(np,
+                           SMB_SM_DENYNONE|SMB_AM_OPENREAD, &scred);
                }
        }
        if (!error)
@@ -420,7 +428,8 @@
                np->n_size = vap->va_size;
                uvm_vnp_setsize(vp, vap->va_size);
                if ((np->n_flag & NOPEN) == 0) {
-                       error = smbfs_smb_open(np, SMB_AM_OPENRW, &scred);
+                       error = smbfs_smb_open(np,
+                           SMB_SM_DENYNONE|SMB_AM_OPENRW, &scred);
                        if (error == 0)
                                doclose = 1;
                }



Home | Main Index | Thread Index | Old Index