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