View | Details | Raw Unified | Return to bug 264450 | Differences between
and this patch

Collapse All | Expand All

(-)b/sys/ufs/ffs/ffs_subr.c (-17 / +16 lines)
Lines 309-314 readsuper(void *devfd, struct fs **fsp, off_t sblockloc, int isaltsblk, Link Here
309
 * Verify the filesystem values.
309
 * Verify the filesystem values.
310
 */
310
 */
311
#define ILOG2(num) (fls(num) - 1)
311
#define ILOG2(num) (fls(num) - 1)
312
#define FAIL(code) { printf("Failed code %d\n", code); return (ENOENT); }
312
313
313
static int
314
static int
314
validate_sblock(struct fs *fs, int isaltsblk)
315
validate_sblock(struct fs *fs, int isaltsblk)
Lines 325-331 validate_sblock(struct fs *fs, int isaltsblk) Link Here
325
			sizeof(ufs2_daddr_t)) ||
326
			sizeof(ufs2_daddr_t)) ||
326
		    fs->fs_nindir != fs->fs_bsize / sizeof(ufs2_daddr_t) ||
327
		    fs->fs_nindir != fs->fs_bsize / sizeof(ufs2_daddr_t) ||
327
		    fs->fs_inopb != fs->fs_bsize / sizeof(struct ufs2_dinode))
328
		    fs->fs_inopb != fs->fs_bsize / sizeof(struct ufs2_dinode))
328
			return (ENOENT);
329
			FAIL(1);
329
	} else if (fs->fs_magic == FS_UFS1_MAGIC) {
330
	} else if (fs->fs_magic == FS_UFS1_MAGIC) {
330
		if ((!isaltsblk && (fs->fs_sblockloc > SBLOCK_UFS1 ||
331
		if ((!isaltsblk && (fs->fs_sblockloc > SBLOCK_UFS1 ||
331
		    !(fs->fs_sblockactualloc == SBLOCK_UFS1 ||
332
		    !(fs->fs_sblockactualloc == SBLOCK_UFS1 ||
Lines 337-343 validate_sblock(struct fs *fs, int isaltsblk) Link Here
337
		    fs->fs_old_inodefmt != FS_44INODEFMT ||
338
		    fs->fs_old_inodefmt != FS_44INODEFMT ||
338
		    fs->fs_old_cgoffset != 0 ||
339
		    fs->fs_old_cgoffset != 0 ||
339
		    fs->fs_old_cgmask != 0xffffffff ||
340
		    fs->fs_old_cgmask != 0xffffffff ||
340
		    fs->fs_old_size != fs->fs_size ||
341
		    fs->fs_old_rotdelay != 0 ||
341
		    fs->fs_old_rotdelay != 0 ||
342
		    fs->fs_old_rps != 60 ||
342
		    fs->fs_old_rps != 60 ||
343
		    fs->fs_old_nspf != fs->fs_fsize / sectorsize ||
343
		    fs->fs_old_nspf != fs->fs_fsize / sectorsize ||
Lines 350-372 validate_sblock(struct fs *fs, int isaltsblk) Link Here
350
		    fs->fs_old_spc != fs->fs_fpg * fs->fs_old_nspf ||
350
		    fs->fs_old_spc != fs->fs_fpg * fs->fs_old_nspf ||
351
		    fs->fs_old_nsect != fs->fs_old_spc ||
351
		    fs->fs_old_nsect != fs->fs_old_spc ||
352
		    fs->fs_old_npsect != fs->fs_old_spc ||
352
		    fs->fs_old_npsect != fs->fs_old_spc ||
353
		    fs->fs_old_dsize != fs->fs_dsize ||
354
		    fs->fs_old_ncyl != fs->fs_ncg)
353
		    fs->fs_old_ncyl != fs->fs_ncg)
355
			return (ENOENT);
354
			FAIL(2);
356
	} else {
355
	} else {
357
		return (ENOENT);
356
		FAIL(3);
358
	}
357
	}
359
	if (fs->fs_bsize < MINBSIZE || fs->fs_bsize > MAXBSIZE ||
358
	if (fs->fs_bsize < MINBSIZE || fs->fs_bsize > MAXBSIZE ||
360
	    fs->fs_bsize < roundup(sizeof(struct fs), DEV_BSIZE) ||
359
	    fs->fs_bsize < roundup(sizeof(struct fs), DEV_BSIZE) ||
361
	    fs->fs_sbsize > SBLOCKSIZE || fs->fs_sbsize < fs->fs_fsize ||
360
	    fs->fs_sbsize > SBLOCKSIZE || fs->fs_sbsize < fs->fs_fsize ||
362
	    !powerof2(fs->fs_bsize))
361
	    !powerof2(fs->fs_bsize))
363
		return (ENOENT);
362
		FAIL(4);
364
	if (fs->fs_fsize < sectorsize || fs->fs_fsize > fs->fs_bsize ||
363
	if (fs->fs_fsize < sectorsize || fs->fs_fsize > fs->fs_bsize ||
365
	    fs->fs_fsize * MAXFRAG < fs->fs_bsize || !powerof2(fs->fs_fsize))
364
	    fs->fs_fsize * MAXFRAG < fs->fs_bsize || !powerof2(fs->fs_fsize))
366
		return (ENOENT);
365
		FAIL(5);
367
	if (fs->fs_maxbsize < fs->fs_bsize || !powerof2(fs->fs_maxbsize) ||
366
	if (fs->fs_maxbsize < fs->fs_bsize || !powerof2(fs->fs_maxbsize) ||
368
	    fs->fs_maxbsize > FS_MAXCONTIG * fs->fs_bsize)
367
	    fs->fs_maxbsize > FS_MAXCONTIG * fs->fs_bsize)
369
		return (ENOENT);
368
		FAIL(6);
370
	if (fs->fs_bmask != ~(fs->fs_bsize - 1) ||
369
	if (fs->fs_bmask != ~(fs->fs_bsize - 1) ||
371
	    fs->fs_fmask != ~(fs->fs_fsize - 1) ||
370
	    fs->fs_fmask != ~(fs->fs_fsize - 1) ||
372
	    fs->fs_qbmask != ~fs->fs_bmask ||
371
	    fs->fs_qbmask != ~fs->fs_bmask ||
Lines 377-383 validate_sblock(struct fs *fs, int isaltsblk) Link Here
377
	    fs->fs_fragshift != ILOG2(fs->fs_frag) ||
376
	    fs->fs_fragshift != ILOG2(fs->fs_frag) ||
378
	    fs->fs_frag > MAXFRAG ||
377
	    fs->fs_frag > MAXFRAG ||
379
	    fs->fs_fsbtodb != ILOG2(fs->fs_fsize / sectorsize))
378
	    fs->fs_fsbtodb != ILOG2(fs->fs_fsize / sectorsize))
380
		return (ENOENT);
379
		FAIL(7);
381
	if (fs->fs_sblkno !=
380
	if (fs->fs_sblkno !=
382
		roundup(howmany(fs->fs_sblockloc + SBLOCKSIZE, fs->fs_fsize),
381
		roundup(howmany(fs->fs_sblockloc + SBLOCKSIZE, fs->fs_fsize),
383
		    fs->fs_frag) ||
382
		    fs->fs_frag) ||
Lines 385-392 validate_sblock(struct fs *fs, int isaltsblk) Link Here
385
		roundup(howmany(SBLOCKSIZE, fs->fs_fsize), fs->fs_frag) ||
384
		roundup(howmany(SBLOCKSIZE, fs->fs_fsize), fs->fs_frag) ||
386
	    fs->fs_iblkno != fs->fs_cblkno + fs->fs_frag ||
385
	    fs->fs_iblkno != fs->fs_cblkno + fs->fs_frag ||
387
	    fs->fs_dblkno != fs->fs_iblkno + fs->fs_ipg / INOPF(fs) ||
386
	    fs->fs_dblkno != fs->fs_iblkno + fs->fs_ipg / INOPF(fs) ||
388
	    fs->fs_cgsize != fragroundup(fs, CGSIZE(fs)))
387
	    fs->fs_cgsize > fs->fs_bsize)
389
		return (ENOENT);
388
		FAIL(8);
390
	if (fs->fs_csaddr != cgdmin(fs, 0) ||
389
	if (fs->fs_csaddr != cgdmin(fs, 0) ||
391
	    fs->fs_cssize !=
390
	    fs->fs_cssize !=
392
		fragroundup(fs, fs->fs_ncg * sizeof(struct csum)) ||
391
		fragroundup(fs, fs->fs_ncg * sizeof(struct csum)) ||
Lines 395-408 validate_sblock(struct fs *fs, int isaltsblk) Link Here
395
		howmany(fs->fs_cssize, fs->fs_fsize) ||
394
		howmany(fs->fs_cssize, fs->fs_fsize) ||
396
	    fs->fs_metaspace < 0 || fs->fs_metaspace > fs->fs_fpg / 2 ||
395
	    fs->fs_metaspace < 0 || fs->fs_metaspace > fs->fs_fpg / 2 ||
397
	    fs->fs_minfree > 99)
396
	    fs->fs_minfree > 99)
398
		return (ENOENT);
397
		FAIL(9);
399
	maxfilesize = fs->fs_bsize * UFS_NDADDR - 1;
398
	maxfilesize = fs->fs_bsize * UFS_NDADDR - 1;
400
	for (sizepb = fs->fs_bsize, i = 0; i < UFS_NIADDR; i++) {
399
	for (sizepb = fs->fs_bsize, i = 0; i < UFS_NIADDR; i++) {
401
		sizepb *= NINDIR(fs);
400
		sizepb *= NINDIR(fs);
402
		maxfilesize += sizepb;
401
		maxfilesize += sizepb;
403
	}
402
	}
404
	if (fs->fs_maxfilesize != maxfilesize)
403
	if (fs->fs_maxfilesize != maxfilesize)
405
		return (ENOENT);
404
		FAIL(10);
406
	/*
405
	/*
407
	 * These values have a tight interaction with each other that
406
	 * These values have a tight interaction with each other that
408
	 * makes it hard to tightly bound them. So we can only check
407
	 * makes it hard to tightly bound them. So we can only check
Lines 420-429 validate_sblock(struct fs *fs, int isaltsblk) Link Here
420
	    fs->fs_fpg < minfpg || fs->fs_fpg > fs->fs_size ||
419
	    fs->fs_fpg < minfpg || fs->fs_fpg > fs->fs_size ||
421
	    fs->fs_ipg * fs->fs_ncg > (((int64_t)(1)) << 32) - INOPB(fs) ||
420
	    fs->fs_ipg * fs->fs_ncg > (((int64_t)(1)) << 32) - INOPB(fs) ||
422
	    fs->fs_ipg > fs->fs_fpg || fs->fs_size < 8 * fs->fs_frag)
421
	    fs->fs_ipg > fs->fs_fpg || fs->fs_size < 8 * fs->fs_frag)
423
		return (ENOENT);
422
		FAIL(11);
424
	if (fs->fs_size <= (fs->fs_ncg - 1) * fs->fs_fpg ||
423
	if (fs->fs_size <= (fs->fs_ncg - 1) * fs->fs_fpg ||
425
	    fs->fs_size > fs->fs_ncg * fs->fs_fpg)
424
	    fs->fs_size > fs->fs_ncg * fs->fs_fpg)
426
		return (ENOENT);
425
		FAIL(12);
427
	/*
426
	/*
428
	 * With file system clustering it is possible to allocate
427
	 * With file system clustering it is possible to allocate
429
	 * many contiguous blocks. The kernel variable maxphys defines
428
	 * many contiguous blocks. The kernel variable maxphys defines
Lines 445-456 validate_sblock(struct fs *fs, int isaltsblk) Link Here
445
	 */
444
	 */
446
	if (fs->fs_maxcontig < 1 ||
445
	if (fs->fs_maxcontig < 1 ||
447
	    fs->fs_maxcontig > MAX(256, maxphys / fs->fs_bsize))
446
	    fs->fs_maxcontig > MAX(256, maxphys / fs->fs_bsize))
448
		return (ENOENT);
447
		FAIL(13);
449
	if (fs->fs_maxcontig < 0 ||
448
	if (fs->fs_maxcontig < 0 ||
450
	    (fs->fs_maxcontig == 0 && fs->fs_contigsumsize != 0) ||
449
	    (fs->fs_maxcontig == 0 && fs->fs_contigsumsize != 0) ||
451
	    (fs->fs_maxcontig > 1 &&
450
	    (fs->fs_maxcontig > 1 &&
452
	    fs->fs_contigsumsize != MIN(fs->fs_maxcontig, FS_MAXCONTIG)))
451
	    fs->fs_contigsumsize != MIN(fs->fs_maxcontig, FS_MAXCONTIG)))
453
		return (ENOENT);
452
		FAIL(14);
454
	return (0);
453
	return (0);
455
}
454
}
456
455

Return to bug 264450