Module Name:    src
Committed By:   uebayasi
Date:           Thu Oct  7 08:54:17 UTC 2010

Modified Files:
        src/sys/ufs/ffs [uebayasi-xip]: ffs_vfsops.c

Log Message:
Check filesystem's bsize/fsize are aligned to PAGE_SIZE, or fail with
ENXIO.


To generate a diff of this commit:
cvs rdiff -u -r1.257.2.9 -r1.257.2.10 src/sys/ufs/ffs/ffs_vfsops.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/ufs/ffs/ffs_vfsops.c
diff -u src/sys/ufs/ffs/ffs_vfsops.c:1.257.2.9 src/sys/ufs/ffs/ffs_vfsops.c:1.257.2.10
--- src/sys/ufs/ffs/ffs_vfsops.c:1.257.2.9	Sun Sep 26 06:35:32 2010
+++ src/sys/ufs/ffs/ffs_vfsops.c	Thu Oct  7 08:54:16 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: ffs_vfsops.c,v 1.257.2.9 2010/09/26 06:35:32 uebayasi Exp $	*/
+/*	$NetBSD: ffs_vfsops.c,v 1.257.2.10 2010/10/07 08:54:16 uebayasi Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.257.2.9 2010/09/26 06:35:32 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c,v 1.257.2.10 2010/10/07 08:54:16 uebayasi Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_ffs.h"
@@ -1182,19 +1182,22 @@
 	mp->mnt_flag |= MNT_LOCAL;
 	mp->mnt_iflag |= IMNT_MPSAFE;
 #ifdef XIP
-	if ((mp->mnt_flag & MNT_RDONLY) == 0)
-		printf("XIP needs read-only mount\n");
-	else {
-		void *physseg = NULL;
-
-		if ((VOP_IOCTL(devvp, DIOCGPHYSSEG, &physseg, FREAD,
-		    cred) == 0) &&
-		    physseg != NULL) {
-			mp->mnt_iflag |= IMNT_XIP;
-			devvp->v_physseg = physseg;
-		} else
-			printf("device doesn't support DIOCGPHYSSEG\n");
+#define	FS_IS_PAGE_ALIGNED_P(fs) \
+	(((fs)->fs_bsize & PAGE_MASK) == 0 && \
+	 ((fs)->fs_fsize & PAGE_MASK) == 0)
+
+	void *physseg = NULL;
+
+	if ((mp->mnt_flag & MNT_RDONLY) == 0 ||
+	    (VOP_IOCTL(devvp, DIOCGPHYSSEG, &physseg, FREAD, cred) != 0) ||
+	    physseg == NULL ||
+	    !FS_IS_PAGE_ALIGNED_P(fs)) {
+		error = ENXIO;
+		free(fs->fs_csp, M_UFSMNT);
+		goto out;
 	}
+	mp->mnt_iflag |= IMNT_XIP;
+	devvp->v_physseg = physseg;
 #endif
 #ifdef FFS_EI
 	if (needswap)

Reply via email to