From raven@bingo.chel.ru  Wed Sep 11 02:26:05 2002
Return-Path: <raven@bingo.chel.ru>
Received: from mx1.FreeBSD.org (mx1.FreeBSD.org [216.136.204.125])
	by hub.freebsd.org (Postfix) with ESMTP
	id 7EB6037B400; Wed, 11 Sep 2002 02:26:05 -0700 (PDT)
Received: from bingo.chel.ru (bingo.modem.ru [217.107.26.22])
	by mx1.FreeBSD.org (Postfix) with ESMTP
	id A6B6343E3B; Wed, 11 Sep 2002 02:26:04 -0700 (PDT)
	(envelope-from raven@bingo.chel.ru)
Received: from bingo.chel.ru (localhost.bingo.modem.ru [127.0.0.1])
	by localhost (Postfix) with SMTP
	id E5279D936; Wed, 11 Sep 2002 15:26:05 +0600 (YEKST)
Received: by bingo.chel.ru (Postfix, from userid 1666)
	id CEDA8D935; Wed, 11 Sep 2002 15:26:04 +0600 (YEKST)
Message-Id: <20020911092604.CEDA8D935@bingo.chel.ru>
Date: Wed, 11 Sep 2002 15:26:04 +0600 (YEKST)
From: Dmitry Suhodoev <raven@bingo.chel.ru>
Reply-To: Dmitry Suhodoev <raven@bingo.chel.ru>
To: FreeBSD-gnats-submit@freebsd.org
Cc: freebsd-stable@FreeBSD.ORG, stable@FreeBSD.ORG
Subject: error deleting r/o (by windows) files on smbfs
X-Send-Pr-Version: 3.113
X-GNATS-Notify:

>Number:         42652
>Category:       kern
>Synopsis:       [smbfs] error deleting r/o (by windows) files on smbfs
>Confidential:   no
>Severity:       serious
>Priority:       high
>Responsible:    freebsd-bugs
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Wed Sep 11 02:30:01 PDT 2002
>Closed-Date:    Mon Nov 06 08:21:09 GMT 2006
>Last-Modified:  Mon Nov 06 08:21:09 GMT 2006
>Originator:     Dmitry Suhodoev
>Release:        FreeBSD 4.6-STABLE i386
>Organization:
Bingo GC, http://bingo.chel.ru
>Environment:
System: FreeBSD bingo.chel.ru 4.6-STABLE FreeBSD 4.6-STABLE #0: Mon Sep 2 15:44:16 YEKST 2002 root@bingo.chel.ru:/usr/obj/usr/src/sys/bingo i386
>Description:
have admin windows share: //machine/admin$, i.e. full access. my os computer is FreeBSD 4.6-STABLE from 28 aug 2002. on this windows share (mounted to /mount/smb/machine/admin) i cannot remove files (even rm -f: access denied) which having dos/windows attributes "read-only", though this files have 755 unix attributes. i has try chown 777 (by root). chown doesn't report error, but attributes do not be installed.

please, help me, i has use rsync on the smbfs, and rsync can't remove some files on smbfs and this is not right!
>How-To-Repeat:
mount any windows share with full access rights and try delete from these mount point any file, which have r/o attribute in windows.
>Fix:
first r/o attributes must be removed from file, then windows smb server allow delete the this file.
>Release-Note:
>Audit-Trail:

From: dad@netroad.ru
To: bug-followup@FreeBSD.org, raven@bingo.chel.ru
Cc:  
Subject: Re: kern/42652: [smbfs] error deleting r/o (by windows) files on smbfs
Date: Thu, 1 Sep 2005 01:07:44 +0400

 --SUOF0GtieIMvvwua
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: inline
 
 I have faced this problem myself and implemented a real fix for it.
 Attached are patches for RELENG_4, RELENG_5 and RELENG_6 branches.
 They apply cleanly as well to RELENG_4_11 and RELENG_5_4 branches.
 The patch for RELENG_6 also fits for the HEAD branch.
 I am personally using patched kernels on 4.11-RELEASE-p9 and 5.4-RELEASE-p1
 for a couple of weeks already without any problems enjoying the functionality.
 Though, I must admit, I have not tested the patch neither on -6 nor -HEAD,
 but nevetherless I think it's rather staightforward and must work as expected.
 
 I think it would be nice to get this commited.
 
 --SUOF0GtieIMvvwua
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: attachment; filename="smbfs_4.patch"
 
 diff -ruN RELENG_4/usr/src-orig/sys/fs/smbfs/smbfs_node.c RELENG_4/usr/src/sys/fs/smbfs/smbfs_node.c
 --- RELENG_4/usr/src-orig/sys/fs/smbfs/smbfs_node.c	Wed Aug 31 11:24:29 2005
 +++ RELENG_4/usr/src/sys/fs/smbfs/smbfs_node.c	Wed Aug 31 11:27:31 2005
 @@ -45,6 +45,7 @@
  /*#include <vm/vm_page.h>
  #include <vm/vm_object.h>*/
  #include <sys/queue.h>
 +#include <sys/stat.h>
  
  #include <netsmb/smb.h>
  #include <netsmb/smb_conn.h>
 @@ -415,6 +416,8 @@
  	va->va_type = vp->v_type;		/* vnode type (for create) */
  	if (vp->v_type == VREG) {
  		va->va_mode = smp->sm_args.file_mode;	/* files access mode and type */
 +		if (np->n_dosattr & SMB_FA_RDONLY)
 +			va->va_mode &= ~(S_IWUSR|S_IWGRP|S_IWOTH);
  	} else if (vp->v_type == VDIR) {
  		va->va_mode = smp->sm_args.dir_mode;	/* files access mode and type */
  	} else
 diff -ruN RELENG_4/usr/src-orig/sys/fs/smbfs/smbfs_smb.c RELENG_4/usr/src/sys/fs/smbfs/smbfs_smb.c
 --- RELENG_4/usr/src-orig/sys/fs/smbfs/smbfs_smb.c	Wed Aug 31 11:24:29 2005
 +++ RELENG_4/usr/src/sys/fs/smbfs/smbfs_smb.c	Wed Aug 31 11:27:32 2005
 @@ -512,9 +512,10 @@
  		mb_put_uint8(mbp, 0);
  		smb_rq_bend(rqp);
  		error = smb_rq_simple(rqp);
 -		SMBERROR("%d\n", error);
 -		if (error)
 +		if (error) {
 +			SMBERROR("smb_rq_simple(rqp) => error %d\n", error);
  			break;
 +		}
  	} while(0);
  	smb_rq_done(rqp);
  	return error;
 diff -ruN RELENG_4/usr/src-orig/sys/fs/smbfs/smbfs_vnops.c RELENG_4/usr/src/sys/fs/smbfs/smbfs_vnops.c
 --- RELENG_4/usr/src-orig/sys/fs/smbfs/smbfs_vnops.c	Wed Aug 31 11:24:30 2005
 +++ RELENG_4/usr/src/sys/fs/smbfs/smbfs_vnops.c	Wed Aug 31 22:11:39 2005
 @@ -41,6 +41,7 @@
  #include <sys/unistd.h>
  #include <sys/vnode.h>
  #include <sys/lockf.h>
 +#include <sys/stat.h>
  
  #include <machine/limits.h>
  
 @@ -332,6 +333,7 @@
  	struct smb_vc *vcp = SSTOVC(ssp);
  	u_quad_t tsize = 0;
  	int isreadonly, doclose, error = 0;
 +	int old_n_dosattr;
  
  	SMBVDEBUG("\n");
  	if (vap->va_flags != VNOVAL)
 @@ -377,6 +379,18 @@
  			return error;
  		}
    	}
 +	if (vap->va_mode != (mode_t)VNOVAL) {
 +		old_n_dosattr = np->n_dosattr;
 +		if (vap->va_mode & S_IWUSR)
 +			np->n_dosattr &= ~SMB_FA_RDONLY;
 +		else
 +			np->n_dosattr |= SMB_FA_RDONLY;
 +		if (np->n_dosattr != old_n_dosattr) {
 +			error = smbfs_smb_setpattr(np, np->n_dosattr, NULL, &scred);
 +			if (error)
 +				return error;
 +		}
 +	}
  	mtime = atime = NULL;
  	if (vap->va_mtime.tv_sec != VNOVAL)
  		mtime = &vap->va_mtime;
 
 --SUOF0GtieIMvvwua
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: attachment; filename="smbfs_5.patch"
 
 diff -ruN RELENG_5/usr/src-orig/sys/fs/smbfs/smbfs_node.c RELENG_5/usr/src/sys/fs/smbfs/smbfs_node.c
 --- RELENG_5/usr/src-orig/sys/fs/smbfs/smbfs_node.c	Wed Aug 31 11:23:54 2005
 +++ RELENG_5/usr/src/sys/fs/smbfs/smbfs_node.c	Wed Aug 31 21:50:41 2005
 @@ -40,6 +40,7 @@
  #include <sys/mount.h>
  #include <sys/proc.h>
  #include <sys/queue.h>
 +#include <sys/stat.h>
  #include <sys/sysctl.h>
  #include <sys/time.h>
  #include <sys/vnode.h>
 @@ -418,6 +419,8 @@
  	va->va_type = vp->v_type;		/* vnode type (for create) */
  	if (vp->v_type == VREG) {
  		va->va_mode = smp->sm_args.file_mode;	/* files access mode and type */
 +		if (np->n_dosattr & SMB_FA_RDONLY)
 +			va->va_mode &= ~(S_IWUSR|S_IWGRP|S_IWOTH);
  	} else if (vp->v_type == VDIR) {
  		va->va_mode = smp->sm_args.dir_mode;	/* files access mode and type */
  	} else
 diff -ruN RELENG_5/usr/src-orig/sys/fs/smbfs/smbfs_smb.c RELENG_5/usr/src/sys/fs/smbfs/smbfs_smb.c
 --- RELENG_5/usr/src-orig/sys/fs/smbfs/smbfs_smb.c	Wed Aug 31 11:23:54 2005
 +++ RELENG_5/usr/src/sys/fs/smbfs/smbfs_smb.c	Wed Aug 31 11:29:33 2005
 @@ -512,9 +512,10 @@
  		mb_put_uint8(mbp, 0);
  		smb_rq_bend(rqp);
  		error = smb_rq_simple(rqp);
 -		SMBERROR("%d\n", error);
 -		if (error)
 +		if (error) {
 +			SMBERROR("smb_rq_simple(rqp) => error %d\n", error);
  			break;
 +		}
  	} while(0);
  	smb_rq_done(rqp);
  	return error;
 diff -ruN RELENG_5/usr/src-orig/sys/fs/smbfs/smbfs_vnops.c RELENG_5/usr/src/sys/fs/smbfs/smbfs_vnops.c
 --- RELENG_5/usr/src-orig/sys/fs/smbfs/smbfs_vnops.c	Wed Aug 31 11:23:55 2005
 +++ RELENG_5/usr/src/sys/fs/smbfs/smbfs_vnops.c	Wed Aug 31 22:11:55 2005
 @@ -44,6 +44,7 @@
  #include <sys/vnode.h>
  #include <sys/limits.h>
  #include <sys/lockf.h>
 +#include <sys/stat.h>
  
  #include <vm/vm.h>
  #include <vm/vm_extern.h>
 @@ -319,6 +320,7 @@
  	struct smb_vc *vcp = SSTOVC(ssp);
  	u_quad_t tsize = 0;
  	int isreadonly, doclose, error = 0;
 +	int old_n_dosattr;
  
  	SMBVDEBUG("\n");
  	if (vap->va_flags != VNOVAL)
 @@ -364,6 +366,18 @@
  			return error;
  		}
    	}
 +	if (vap->va_mode != (mode_t)VNOVAL) {
 +		old_n_dosattr = np->n_dosattr;
 +		if (vap->va_mode & S_IWUSR)
 +			np->n_dosattr &= ~SMB_FA_RDONLY;
 +		else
 +			np->n_dosattr |= SMB_FA_RDONLY;
 +		if (np->n_dosattr != old_n_dosattr) {
 +			error = smbfs_smb_setpattr(np, np->n_dosattr, NULL, &scred);
 +			if (error)
 +				return error;
 +		}
 +	}
  	mtime = atime = NULL;
  	if (vap->va_mtime.tv_sec != VNOVAL)
  		mtime = &vap->va_mtime;
 
 --SUOF0GtieIMvvwua
 Content-Type: text/plain; charset=us-ascii
 Content-Disposition: attachment; filename="smbfs_6.patch"
 
 diff -ruN RELENG_6/usr/src-orig/sys/fs/smbfs/smbfs_node.c RELENG_6/usr/src/sys/fs/smbfs/smbfs_node.c
 --- RELENG_6/usr/src-orig/sys/fs/smbfs/smbfs_node.c	Sun Mar 13 15:18:24 2005
 +++ RELENG_6/usr/src/sys/fs/smbfs/smbfs_node.c	Wed Aug 31 21:51:10 2005
 @@ -40,6 +40,7 @@
  #include <sys/mount.h>
  #include <sys/proc.h>
  #include <sys/queue.h>
 +#include <sys/stat.h>
  #include <sys/sysctl.h>
  #include <sys/time.h>
  #include <sys/vnode.h>
 @@ -418,6 +419,8 @@
  	va->va_type = vp->v_type;		/* vnode type (for create) */
  	if (vp->v_type == VREG) {
  		va->va_mode = smp->sm_file_mode; /* files access mode and type */
 +		if (np->n_dosattr & SMB_FA_RDONLY)
 +			va->va_mode &= ~(S_IWUSR|S_IWGRP|S_IWOTH);
  	} else if (vp->v_type == VDIR) {
  		va->va_mode = smp->sm_dir_mode;	/* files access mode and type */
  	} else
 diff -ruN RELENG_6/usr/src-orig/sys/fs/smbfs/smbfs_smb.c RELENG_6/usr/src/sys/fs/smbfs/smbfs_smb.c
 --- RELENG_6/usr/src-orig/sys/fs/smbfs/smbfs_smb.c	Wed May  4 19:05:46 2005
 +++ RELENG_6/usr/src/sys/fs/smbfs/smbfs_smb.c	Wed Aug 31 11:30:44 2005
 @@ -512,9 +512,10 @@
  		mb_put_uint8(mbp, 0);
  		smb_rq_bend(rqp);
  		error = smb_rq_simple(rqp);
 -		SMBERROR("%d\n", error);
 -		if (error)
 +		if (error) {
 +			SMBERROR("smb_rq_simple(rqp) => error %d\n", error);
  			break;
 +		}
  	} while(0);
  	smb_rq_done(rqp);
  	return error;
 diff -ruN RELENG_6/usr/src-orig/sys/fs/smbfs/smbfs_vnops.c RELENG_6/usr/src/sys/fs/smbfs/smbfs_vnops.c
 --- RELENG_6/usr/src-orig/sys/fs/smbfs/smbfs_vnops.c	Wed Apr 13 14:59:08 2005
 +++ RELENG_6/usr/src/sys/fs/smbfs/smbfs_vnops.c	Wed Aug 31 22:12:22 2005
 @@ -44,6 +44,7 @@
  #include <sys/vnode.h>
  #include <sys/limits.h>
  #include <sys/lockf.h>
 +#include <sys/stat.h>
  
  #include <vm/vm.h>
  #include <vm/vm_extern.h>
 @@ -301,6 +302,7 @@
  	struct smb_vc *vcp = SSTOVC(ssp);
  	u_quad_t tsize = 0;
  	int isreadonly, doclose, error = 0;
 +	int old_n_dosattr;
  
  	SMBVDEBUG("\n");
  	if (vap->va_flags != VNOVAL)
 @@ -346,6 +348,18 @@
  			return error;
  		}
    	}
 +	if (vap->va_mode != (mode_t)VNOVAL) {
 +		old_n_dosattr = np->n_dosattr;
 +		if (vap->va_mode & S_IWUSR)
 +			np->n_dosattr &= ~SMB_FA_RDONLY;
 +		else
 +			np->n_dosattr |= SMB_FA_RDONLY;
 +		if (np->n_dosattr != old_n_dosattr) {
 +			error = smbfs_smb_setpattr(np, np->n_dosattr, NULL, &scred);
 +			if (error)
 +				return error;
 +		}
 +	}
  	mtime = atime = NULL;
  	if (vap->va_mtime.tv_sec != VNOVAL)
  		mtime = &vap->va_mtime;
 
 --SUOF0GtieIMvvwua--
State-Changed-From-To: open->closed 
State-Changed-By: bp 
State-Changed-When: Mon Nov 6 08:19:02 UTC 2006 
State-Changed-Why:  
Problem has been addressed in the -current branch and will be 
MFCed in one month. 

http://www.freebsd.org/cgi/query-pr.cgi?pr=42652 
>Unformatted:
