Fix r313495.

The file type DTYPE_VNODE can be assigned as a fallback if VOP_OPEN()
did not initialized file type.  This is a typical code path used by
normal file systems.

Also, change error returned for inappropriate file type used for
O_EXLOCK to EOPNOTSUPP, as declared in the open(2) man page.

Reported by:	cy, dhw, Iblis Lin <iblis@hs.ntnu.edu.tw>
Tested by:	dhw
Sponsored by:	The FreeBSD Foundation
MFC after:	13 days
This commit is contained in:
Konstantin Belousov 2017-02-10 14:49:04 +00:00
parent c0e295def7
commit e83a71c656
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=313549
2 changed files with 3 additions and 2 deletions

View File

@ -351,8 +351,8 @@ vn_open_vnode(struct vnode *vp, int fmode, struct ucred *cred,
while ((fmode & (O_EXLOCK | O_SHLOCK)) != 0) {
KASSERT(fp != NULL, ("open with flock requires fp"));
if (fp->f_type != DTYPE_VNODE) {
error = EBADF;
if (fp->f_type != DTYPE_NONE && fp->f_type != DTYPE_VNODE) {
error = EOPNOTSUPP;
break;
}
lock_flags = VOP_ISLOCKED(vp);

View File

@ -53,6 +53,7 @@ struct vnode;
#endif /* _KERNEL */
#define DTYPE_NONE 0 /* not yet initialized */
#define DTYPE_VNODE 1 /* file */
#define DTYPE_SOCKET 2 /* communications endpoint */
#define DTYPE_PIPE 3 /* pipe */