ufs mount problem.

Giorgos Keramidas keramida at ceid.upatras.gr
Mon Nov 22 16:28:16 EET 2004


On 2004-11-18 19:22, Giorgos Keramidas <keramida at ceid.upatras.gr> wrote:
>On 2004-11-18 19:00, Dimitris <lenis at inp.demokritos.gr> wrote:
>>Giorgos Keramidas wrote:
>>> Το φοβόμουνα.  Γι αυτό σου είχα γράψει περί block:fragment ratio.
>>>
>>> Μπορείς να μου δείξεις από το BSD πληροφορίες για αυτό το ίδιο
>>> filesystem;
>>
>> OK:
>> # dumpfs / | egrep -e '^(magic.*UFS|[fb]size)'
>> magic   19540119 (UFS2) time    Thu Nov 18 18:55:03 2004
>> bsize   16384   shift   14      mask    0xffffc000
>> fsize   2048    shift   11      mask    0xfffff800
>
> Όπως το φαντάστηκα.  Το autoselection του block:fragment ratio είδε ότι έχεις
> κάπως μεγάλο δίσκο και (πολύ σωστά) χρησιμοποίησε μεγέθη που είναι ελαφρώς
> μεγαλύτερα από αυτά που ξέρει το Linux να διαβάζει.
>
> Αν βρω λίγο χρόνο το Σαββατοκύριακο θα σου στείλω ένα patch για τον Linux
> πυρήνα σου που θα διορθώνει τα 'παιχνίδια' που κάνει με τα block sizes.
> Αν δε φοβάσαι να τρέξεις Linux πυρήνα με patch από ένα διαβολικό BSD user,
> μάλλον θα παίξει μια χαρά :-)

Ok, το βρήκα...

Το παρακάτω diff πρέπει να διορθώνει τα περισσότερα από τα mount
προβλήματα που έχει το linux-2.6.9 να κάνει mount `απρόβλεπτα' μεγέθη
στα block:fragment ratios των UFS/FFS filesystems.

Είχε δυο buglets στις υποθέσεις που έκανε για τα valid μεγέθη των
fragment & blocks.  Με αυτές τις αλλαγές θα πρέπει να μπορεί να κάνει
mount και UFS1 partitions που έχουν φτιαχτεί από το FreeBSD 5.X σε
μεγάλο δίσκο με τεράστια blocks & frags.

Το UFS χρησιμοποιεί ένα byte για να μαρκάρει τα used fragments ενός
fragmented block, οπότε ο μόνος έλεγχος που έχει όντως νόημα για το
ratio των δύο μεγεθών είναι να ισχύει οπωσδήποτε η συνθήκη:

	(bsize > fsize) >= 2 && (bsize / fsize) <= 8

Όποιος έχει πρόβλημα με Linux σύστημα που δε μπορεί να κάνει mount τα
UFS1 partitions του, ας δοκιμάσει αυτό το diff με:

	# cd /usr/src/linux
	# patch -p0 -i /tmp/linux-ufs.patch

%%%
--- fs/ufs/super.c.orig	Tue Oct 19 00:53:05 2004
+++ fs/ufs/super.c	Mon Nov 22 16:23:12 2004
@@ -795,17 +795,18 @@
 			uspi->s_fsize);
 		goto failed;
 	}
-	if (uspi->s_fsize > 4096) {
-		printk(KERN_ERR "ufs_read_super: fragment size %u is too large\n",
-			uspi->s_fsize);
-		goto failed;
-	}
 	if (uspi->s_bsize & (uspi->s_bsize - 1)) {
 		printk(KERN_ERR "ufs_read_super: block size %u is not a power of 2\n",
 			uspi->s_bsize);
 		goto failed;
 	}
-	if (uspi->s_bsize < 4096) {
+
+	/*
+	 * It is valid to have less than 8 fragments in each UFS block.
+	 * The only case where the superblock would be really strange would be
+	 * if there were less than 2 fragments in each block.
+	 */
+	if (uspi->s_bsize < (uspi->s_fsize * 2)) {
 		printk(KERN_ERR "ufs_read_super: block size %u is too small\n",
 			uspi->s_bsize);
 		goto failed;
%%%




More information about the Linux-greek-users mailing list