svn commit: r274706 - stable/10/sys/kern

Konstantin Belousov kib at FreeBSD.org
Wed Nov 19 10:25:10 UTC 2014


Author: kib
Date: Wed Nov 19 10:25:08 2014
New Revision: 274706
URL: https://svnweb.freebsd.org/changeset/base/274706

Log:
  MFC r274438:
  For posix_fallocate(2) and posix_fadvise(2), return ESPIPE
  when underlying file does not have DFLAG_SEEKABLE set. For
  posix_fallocate(2), simplify error handling logic.

Modified:
  stable/10/sys/kern/vfs_syscalls.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/kern/vfs_syscalls.c
==============================================================================
--- stable/10/sys/kern/vfs_syscalls.c	Wed Nov 19 09:07:49 2014	(r274705)
+++ stable/10/sys/kern/vfs_syscalls.c	Wed Nov 19 10:25:08 2014	(r274706)
@@ -4549,38 +4549,29 @@ kern_posix_fallocate(struct thread *td, 
 	off_t olen, ooffset;
 	int error;
 
-	fp = NULL;
+	if (offset < 0 || len <= 0)
+		return (EINVAL);
+	/* Check for wrap. */
+	if (offset > OFF_MAX - len)
+		return (EFBIG);
 	error = fget(td, fd, cap_rights_init(&rights, CAP_WRITE), &fp);
 	if (error != 0)
-		goto out;
-
-	switch (fp->f_type) {
-	case DTYPE_VNODE:
-		break;
-	case DTYPE_PIPE:
-	case DTYPE_FIFO:
+		return (error);
+	if ((fp->f_ops->fo_flags & DFLAG_SEEKABLE) == 0) {
 		error = ESPIPE;
 		goto out;
-	default:
-		error = ENODEV;
-		goto out;
 	}
 	if ((fp->f_flag & FWRITE) == 0) {
 		error = EBADF;
 		goto out;
 	}
-	vp = fp->f_vnode;
-	if (vp->v_type != VREG) {
+	if (fp->f_type != DTYPE_VNODE) {
 		error = ENODEV;
 		goto out;
 	}
-	if (offset < 0 || len <= 0) {
-		error = EINVAL;
-		goto out;
-	}
-	/* Check for wrap. */
-	if (offset > OFF_MAX - len) {
-		error = EFBIG;
+	vp = fp->f_vnode;
+	if (vp->v_type != VREG) {
+		error = ENODEV;
 		goto out;
 	}
 
@@ -4617,8 +4608,7 @@ kern_posix_fallocate(struct thread *td, 
 		maybe_yield();
 	}
  out:
-	if (fp != NULL)
-		fdrop(fp, td);
+	fdrop(fp, td);
 	return (error);
 }
 
@@ -4668,15 +4658,11 @@ kern_posix_fadvise(struct thread *td, in
 	error = fget(td, fd, cap_rights_init(&rights), &fp);
 	if (error != 0)
 		goto out;
-
-	switch (fp->f_type) {
-	case DTYPE_VNODE:
-		break;
-	case DTYPE_PIPE:
-	case DTYPE_FIFO:
+	if ((fp->f_ops->fo_flags & DFLAG_SEEKABLE) == 0) {
 		error = ESPIPE;
 		goto out;
-	default:
+	}
+	if (fp->f_type != DTYPE_VNODE) {
 		error = ENODEV;
 		goto out;
 	}


More information about the svn-src-all mailing list