[prev in list] [next in list] [prev in thread] [next in thread]
List: freebsd-bugs
Subject: kern/118320: [patch] NFS SETATTR sometimes fails to set file mode
From: "mark thompson <"<info-gentoo () mark ! thompson ! bz>
Date: 2007-11-28 21:59:29
Message-ID: 200711282159.lASLxTbZ008201 () www ! freebsd ! org
[Download RAW message or body]
> Number: 118320
> Category: kern
> Synopsis: [patch] NFS SETATTR sometimes fails to set file mode on ZFS \
> partition
> Confidential: no
> Severity: serious
> Priority: medium
> Responsible: freebsd-bugs
> State: open
> Quarter:
> Keywords:
> Date-Required:
> Class: sw-bug
> Submitter-Id: current-users
> Arrival-Date: Wed Nov 28 22:00:07 UTC 2007
> Closed-Date:
> Last-Modified:
> Originator: mark thompson
> Release: 7.0 BETA 3
> Organization:
tgsoft.com
> Environment:
FreeBSD moose.tgsoft.com 7.0-BETA3 FreeBSD 7.0-BETA3 #6: Wed Nov 28 13:24:23 PST 2007 \
mark@moose.tgsoft.com:/usr/obj/usr/src/sys/ASUS amd64
> Description:
ZFS partition exported with NFS, using a MacOS X (Tiger) client. Finder has problems \
creating files (they are created, but have a mode of zero, so cannot be opened). \
Trace shows that an NFS SETATTR call that should set uid, gid, and mode fails to set \
the mode. Similar trace on a UFS partition works as expected.
Examination shows that secpolicy_vnode_setattr is smashing the mode argument. \
Attached patch to zfs_setattr saves and restores the argument in this one case.
> How-To-Repeat:
NFS export ZFS partition, import on MacOS X. Try to drag a file into the folder on \
the imported drive using the Finder. In some cases, it will fail.
> Fix:
In /usr/src/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c:
*** zfs_vnops.c-orig Wed Nov 28 09:20:23 2007
--- zfs_vnops.c Wed Nov 28 13:39:07 2007
***************
*** 2080,2085 ****
--- 2080,2086 ----
vattr_t oldva;
uint_t mask = vap->va_mask;
uint_t saved_mask;
+ uint64_t saved_mode;
int trim_mask = 0;
uint64_t new_mode;
znode_t *attrzp;
***************
*** 2214,2219 ****
--- 2215,2221 ----
if (trim_mask) {
saved_mask = vap->va_mask;
+ saved_mode = vap->va_mode; /* secpolicy.. smashes */
vap->va_mask &= ~trim_mask;
}
***************
*** 2224,2231 ****
return (err);
}
! if (trim_mask)
vap->va_mask |= saved_mask;
}
/*
--- 2226,2236 ----
return (err);
}
! if (trim_mask) {
vap->va_mask |= saved_mask;
+ if (trim_mask & AT_MODE)
+ vap->va_mode = saved_mode;
+ }
}
/*
> Release-Note:
> Audit-Trail:
> Unformatted:
_______________________________________________
freebsd-bugs@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-bugs
To unsubscribe, send any mail to "freebsd-bugs-unsubscribe@freebsd.org"
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic