[#] проблема с ext2
51t(lenina,1) — All
2014-07-31 09:49:45


Мартин написал, что у него проблема с ext2 не воспроизводится. Я сделал маленькую виртуалку - и тоже нет проблем. Но зато на двух моих компьютерах - просто невозможно пользоваться, так всё падает...

И что делать? :(

[#] Re: проблема с ext2
51t(lenina,1) — 51t
2014-07-31 10:23:38


кстати, fsck на ext2fs до сих пор крэшится...

[#] Re: проблема с ext2
zhuk@(lenina,131) — 51t
2014-07-31 11:24:49


Надо собрать детальную инфу о параметрах ФС (хз, чем это делается). А лучше - сделать через dd образ и выложить в Сеть, чтобы pelikan@ мог в нём поковыряться.

Можешь заодно мне выложить, я тоже не хочу битый ext2fs в релизе. :)

[#] Re: проблема с ext2
51t(lenina,1) — zhuk@
2014-07-31 11:25:57


да я их поудалял нафиг, пусть ext4 будет, потому что без openbsd тоже не жизнь :)

[#] Re: проблема с ext2
51t(lenina,1) — zhuk@
2014-07-31 11:28:45


впрочем, на компьютерах у меня проблема воспроизводится всегда - создал новый раздел, начал на них писать, и моментально получил ddb> на виртуалке - не воспроизводится :(

[#] Re: проблема с ext2
51t(lenina,1) — 51t
2014-07-31 18:35:09


хм, только я перебил разделы, так Мартин прислал мне вот это... надо будет как-то протестировать (кстати, как эти диффы накладывать?)

кстати, я не понял, какой там вопрос :)


> The diff is here. Tested on i386, compiling on sparc64 (and will commit after it's been tested).

> In short, we need to respect smaller on-disk inodes, but not copy more than our pool(9) gives us. Therefore the copying macro needs to know what kind of a filesystem is it. Yes, I'd like to have this in 5.6-release.

> ok?


Index: ufs/ext2fs/ext2fs_bswap.c
===================================================================
RCS file: /cvs/src/sys/ufs/ext2fs/ext2fs_bswap.c,v
retrieving revision 1.7
diff -u -p -r1.7 ext2fs_bswap.c
--- ufs/ext2fs/ext2fs_bswap.c 14 Jul 2014 08:54:13 -0000 1.7
+++ ufs/ext2fs/ext2fs_bswap.c 31 Jul 2014 13:37:35 -0000
@@ -110,7 +110,8 @@ e2fs_cg_bswap(struct ext2_gd *old, struc
}

void
-e2fs_i_bswap(struct ext2fs_dinode *old, struct ext2fs_dinode *new)
+e2fs_i_bswap(struct m_ext2fs *fs, struct ext2fs_dinode *old,
+ struct ext2fs_dinode *new)
{
new->e2di_mode = swap16(old->e2di_mode);
new->e2di_uid_low = swap16(old->e2di_uid_low);
@@ -133,5 +134,9 @@ e2fs_i_bswap(struct ext2fs_dinode *old,
new->e2di_facl_hi = swap16(old->e2di_facl_hi);
memcpy(&new->e2di_blocks[0], &old->e2di_blocks[0],
(NDADDR+NIADDR) * sizeof(int));
+
+ if (EXT2_DINODE_SIZE(fs) <= EXT2_REV0_DINODE_SIZE)
+ return;
+ new->e2di_isize = swap16(old->e2di_isize);
}
#endif
Index: ufs/ext2fs/ext2fs_dinode.h
===================================================================
RCS file: /cvs/src/sys/ufs/ext2fs/ext2fs_dinode.h,v
retrieving revision 1.16
diff -u -p -r1.16 ext2fs_dinode.h
--- ufs/ext2fs/ext2fs_dinode.h 11 Jul 2014 12:53:19 -0000 1.16
+++ ufs/ext2fs/ext2fs_dinode.h 31 Jul 2014 13:37:35 -0000
@@ -154,10 +154,12 @@ struct ext2fs_dinode {

/* e2fs needs byte swapping on big-endian systems */
#if BYTE_ORDER == LITTLE_ENDIAN
-# define e2fs_iload(old, new) memcpy((new),(old),sizeof(struct ext2fs_dinode))
-# define e2fs_isave(old, new) memcpy((new),(old),sizeof(struct ext2fs_dinode))
+# define e2fs_iload(fs, old, new) \
+ memcpy((new),(old), MIN(EXT2_DINODE_SIZE(fs), sizeof(*new)))
+# define e2fs_isave(fs, old, new) \
+ memcpy((new),(old), MIN(EXT2_DINODE_SIZE(fs), sizeof(*new)))
#else
-void e2fs_i_bswap(struct ext2fs_dinode *, struct ext2fs_dinode *);
-# define e2fs_iload(old, new) e2fs_i_bswap((old), (new))
-# define e2fs_isave(old, new) e2fs_i_bswap((old), (new))
+void e2fs_i_bswap(struct m_ext2fs *, struct ext2fs_dinode *, struct ext2fs_dinode *);
+# define e2fs_iload(fs, old, new) e2fs_i_bswap((fs), (old), (new))
+# define e2fs_isave(fs, old, new) e2fs_i_bswap((fs), (old), (new))
#endif
Index: ufs/ext2fs/ext2fs_inode.c
===================================================================
RCS file: /cvs/src/sys/ufs/ext2fs/ext2fs_inode.c,v
retrieving revision 1.54
diff -u -p -r1.54 ext2fs_inode.c
--- ufs/ext2fs/ext2fs_inode.c 13 Jul 2014 16:59:35 -0000 1.54
+++ ufs/ext2fs/ext2fs_inode.c 31 Jul 2014 13:37:35 -0000
@@ -189,7 +189,7 @@ ext2fs_update(struct inode *ip, int wait
ip->i_e2fs_uid_high = ip->i_e2fs_uid >> 16;
ip->i_e2fs_gid_high = ip->i_e2fs_gid >> 16;

- e2fs_isave(ip->i_e2din, (struct ext2fs_dinode *)cp);
+ e2fs_isave(fs, ip->i_e2din, (struct ext2fs_dinode *)cp);
if (waitfor)
return (bwrite(bp));
else {
Index: ufs/ext2fs/ext2fs_vfsops.c
===================================================================
RCS file: /cvs/src/sys/ufs/ext2fs/ext2fs_vfsops.c,v
retrieving revision 1.81
diff -u -p -r1.81 ext2fs_vfsops.c
--- ufs/ext2fs/ext2fs_vfsops.c 13 Jul 2014 15:07:01 -0000 1.81
+++ ufs/ext2fs/ext2fs_vfsops.c 31 Jul 2014 13:37:35 -0000
@@ -365,7 +365,7 @@ ext2fs_reload_vnode(struct vnode *vp, vo
}
cp = (caddr_t)bp->b_data +
(ino_to_fsbo(era->fs, ip->i_number) * EXT2_DINODE_SIZE(era->fs));
- e2fs_iload((struct ext2fs_dinode *)cp, ip->i_e2din);
+ e2fs_iload(era->fs, (struct ext2fs_dinode *)cp, ip->i_e2din);
brelse(bp);
vput(vp);
return (0);
@@ -891,7 +891,7 @@ ext2fs_vget(struct mount *mp, ino_t ino,
+ EXT2_DINODE_SIZE(fs) * ino_to_fsbo(fs, ino));

ip->i_e2din = pool_get(&ext2fs_dinode_pool, PR_WAITOK);
- e2fs_iload(dp, ip->i_e2din);
+ e2fs_iload(fs, dp, ip->i_e2din);
brelse(bp);

ip->i_effnlink = ip->i_e2fs_nlink;

[#] Re: проблема с ext2
51t(lenina,1) — 51t
2014-07-31 19:38:25


У кого-нибудь этот патч вообще применяется? У меня не накладывается :(

ps. Пробовал сделать на том же компьютере раздел на 850 мб ext2 - там проблема не воспроизводится...

[#] Re: проблема с ext2
zhuk@(lenina,131) — 51t
2014-07-31 21:19:29


Как накладывать:

cd /usr/src/sys
cvs up -APd
patch -C </path/to/ext2.patch && patch </path/to/ext2.patch

У меня всё прекрасно применяется. Ты, видимо, забыл обновить исходники. :)

[#] Re: проблема с ext2
51t(lenina,1) — zhuk@
2014-07-31 21:33:24


обновил... только я делал patch -p0, единственное известное мне с детских лет шаманство...

не совсем понял, что за двойной вызов? почему первый раз -C, а затем без оной?

[#] Re: проблема с ext2
zhuk@(lenina,131) — 51t
2014-07-31 21:50:34


-С не меняет конечные файлы - то есть, это позволяет избежать порчи исходников. Эффект такой цепочки - или патч нормально применился, или ничего не поменялось. Так как отменять частично применившийся патч заметно сложнее. См. документацию patch(1). ;)

[#] Re: проблема с ext2
zhuk@(lenina,131) — 51t
2014-07-31 21:54:40


Мои поздравления. :)

Кстати, в ii-морде есть возможность как-то форсировать отображение части текста моноширинным шрифтом? Для программистов-сисадминов очень актуально.


CVSROOT: /cvs
Module name: src
Changes by: pelikan@cvs.openbsd.org 2014/07/31 11:37:52

Modified files:
sys/ufs/ext2fs : ext2fs_bswap.c ext2fs_dinode.h ext2fs_inode.c
ext2fs_vfsops.c

Log message:
use proper on-disk inode size: no more, no less.

Reported by Roman Yakovlev, thanks!

"do it now" deraadt

[#] Re: проблема с ext2
51t(lenina,1) — zhuk@
2014-07-31 22:03:36


> Мои поздравления. :)

один фиг, у себя я это наложить не смог, что на старую версию исходников, что на новую, что с p0, что без оного - один фиг:



# patch -C -p0 < fs.diff 
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|Index: ufs/ext2fs/ext2fs_bswap.c
|===================================================================
|RCS file: /cvs/src/sys/ufs/ext2fs/ext2fs_bswap.c,v
|retrieving revision 1.7
|diff -u -p -r1.7 ext2fs_bswap.c
|--- ufs/ext2fs/ext2fs_bswap.c 14 Jul 2014 08:54:13 -0000 1.7
|+++ ufs/ext2fs/ext2fs_bswap.c 31 Jul 2014 13:37:35 -0000
--------------------------
Patching file ufs/ext2fs/ext2fs_bswap.c using Plan A...
patch: **** malformed patch at line 9: }


подожду в репозиториях, раз запушили... наверное, сейчас c .ca. попробую дёрнуть...

[#] Re: проблема с ext2
51t(lenina,1) — zhuk@
2014-07-31 22:05:54


> Кстати, в ii-морде есть возможность как-то форсировать отображение части текста моноширинным шрифтом? Для программистов-сисадминов очень актуально.

можно

четыре равно сверху, и четыре равно снизу.

а
    между
                        ними
всё
         что
                     угодно


раньше был даже код хилайтинг, но по общему мнению его просто вырезали, для простоты жизни :)

главное - чтобы в текстовых клиентах и веб-клиентах выглядело одинаково :)

[#] Вывод
51t(lenina,1) — zhuk@
2014-07-31 22:15:27


из четырёх проблем, которые я поймал с ext2 за последнее время, исправлено 3 - с инсталлером amd64 (fixed by Vadim Zhukov, thanks!), со сломанной датой и, вот эта (хотя непонятно, во-первых, исправлено оно или нет, а во-вторых, нафига я весь день ext2-разделы сносил :).

Осталась только бага с floating point exception в e2fsck. Я и Мартину сейчас об этом сказал, но он говорит "вроде бы исправляли на хакафоне". Но в снапшоте от 20 июля - валится, как миленькое, при запуске.

[#] Re: проблема с ext2
zhuk@(lenina,131) — 51t
2014-08-01 00:10:59


> patch: **** malformed patch at line 9: }

Это означает, что у тебя сам патч кривой. Например, с ^M на концах строк. Я себе такой алиас держу для таких случаев в ~/.kshrc:
stripm='perl -pi -e '\''s/\r$//'\'