kern/42652: [smbfs] error deleting r/o (by windows) files on
smbfs
dad at netroad.ru
dad at netroad.ru
Wed Aug 31 21:10:26 GMT 2005
The following reply was made to PR kern/42652; it has been noted by GNATS.
From: dad at netroad.ru
To: bug-followup at FreeBSD.org, raven at 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--
More information about the freebsd-bugs
mailing list