Суть проблемы в следующем: добавил одно поле в структуру айнод, написал системный вызов, который в юземорде помещает туда то. что мне нужно. НО после перезагрузки системы то, что там раньше лежало не сохраняется... и это понятно почему, т.к. айнод структура лежит в VFS, а не на самом диске.
ФС ext3. В структуру ext3_inode добавил то же поле и опять после перезагрузки не сохраняется число. Хотелось бы узнать, если кто-то сталкивался с такой же или подобной проблемой, просьба написать как решили=) буду признателен за сслыки или описание функций которые непосрдетсвенно сохраняют данные на диск.
Как сохранить добавочное поле в структуре айнода?
нужно ещё изменить код как минимум в 3-х местах:
1) структуру инода на диске (см. include/linux/ext3_fs.h), вот тут проблема - инод на диске забит под завязку.
2) код, который читает инод с диска (ext3_alloc_inode если не ошибаюсь)
3) код, сохраняющий инод на диск (ext3_write_inode, если не ошибаюсь опять же)
ЗЫ: наверное лучше пост в ветку про ядро перенести
1) изменил, добавил туда такое же поле...
а вот аналоги 2 и 3.. искал в другом месте...
так, спасибо, попробую - отпишусь=)
3110 int ext3_write_inode(struct inode *inode, struct writeback_control *wbc)
3111 {
3112 if (current->flags & PF_MEMALLOC)
3113 return 0;
3114
3115 if (ext3_journal_current_handle()) {
3116 jbd_debug(1, "called recursively, non-PF_MEMALLOC!\n");
3117 dump_stack();
3118 return -EIO;
3119 }
3120
3121 if (wbc->sync_mode != WB_SYNC_ALL)
3122 return 0;
3123
3124 return ext3_force_commit(inode->i_sb);
3125 }
хм... а что тут изменять?
я вот здесь изменял....
2954 static int ext3_do_update_inode(handle_t *handle,
2955 struct inode *inode,
2956 struct ext3_iloc *iloc)
2957 {
2958 struct ext3_inode *raw_inode = ext3_raw_inode(iloc);
2959 struct ext3_inode_info *ei = EXT3_I(inode);
2960 struct buffer_head *bh = iloc->bh;
2961 int err = 0, rc, block;
2962
2963 again:
2964 /* we can't allow multiple procs in here at once, its a bit racey */
2965 lock_buffer(bh);
2966
2967 /* For fields not not tracking in the in-memory inode,
2968 * initialise them to zero for new inodes. */
2969 if (ext3_test_inode_state(inode, EXT3_STATE_NEW))
2970 memset(raw_inode, 0, EXT3_SB(inode->i_sb)->s_inode_size);
2971
2972 ext3_get_inode_flags(ei);
2973 raw_inode->i_mode = cpu_to_le16(inode->i_mode);
2974 if(!(test_opt(inode->i_sb, NO_UID32))) {
2975 raw_inode->i_uid_low = cpu_to_le16(low_16_bits(inode->i_uid));
2976 raw_inode->i_gid_low = cpu_to_le16(low_16_bits(inode->i_gid));
2977 /*
2978 * Fix up interoperability with old kernels. Otherwise, old inodes get
2979 * re-used with the upper 16 bits of the uid/gid intact
2980 */
2981 if(!ei->i_dtime) {
2982 raw_inode->i_uid_high =
2983 cpu_to_le16(high_16_bits(inode->i_uid));
2984 raw_inode->i_gid_high =
2985 cpu_to_le16(high_16_bits(inode->i_gid));
2986 } else {
2987 raw_inode->i_uid_high = 0;
2988 raw_inode->i_gid_high = 0;
2989 }
2990 } else {
2991 raw_inode->i_uid_low =
2992 cpu_to_le16(fs_high2lowuid(inode->i_uid));
2993 raw_inode->i_gid_low =
2994 cpu_to_le16(fs_high2lowgid(inode->i_gid));
2995 raw_inode->i_uid_high = 0;
2996 raw_inode->i_gid_high = 0;
2997 }
2998 raw_inode->i_links_count = cpu_to_le16(inode->i_nlink);
2999 raw_inode->i_size = cpu_to_le32(ei->i_disksize);
3000 raw_inode->i_atime = cpu_to_le32(inode->i_atime.tv_sec);
3001 raw_inode->i_ctime = cpu_to_le32(inode->i_ctime.tv_sec);
3002 raw_inode->i_mtime = cpu_to_le32(inode->i_mtime.tv_sec);
3003 raw_inode->i_blocks = cpu_to_le32(inode->i_blocks);
3004 raw_inode->i_dtime = cpu_to_le32(ei->i_dtime);
3005 raw_inode->i_flags = cpu_to_le32(ei->i_flags);
3006 #ifdef EXT3_FRAGMENTS
привел пример часть функции... вот тут явно по полям сохраняется... и я здесь так же пытаюсь сохранить свое поле... но ни фига..
вы просто добавили поле в конец структуры? трабла в том, что она должна остаться такого же размера, иначе всё может полететь...
привел пример часть функции... вот тут явно по полям сохраняется... и я здесь так же пытаюсь сохранить свое поле... но ни фига..
тут тоже гемор с размером идёт...
хм... а что тут изменять?
там ниже по вызовам должно лежать сохранение... опять же если размер не менялся, то проблем быть не должно...
ЗЫ: а без изменений в ФС никак не обойтись? может лучше менять не инод, а xattr? а то инод менять уж слишком чревато...
вы просто добавили поле в конец структуры? трабла в том, что она должна остаться такого же размера, иначе всё может полететь...
привел пример часть функции... вот тут явно по полям сохраняется... и я здесь так же пытаюсь сохранить свое поле... но ни фига..
тут тоже гемор с размером идёт...
хм... а что тут изменять?
там ниже по вызовам должно лежать сохранение... опять же если размер не менялся, то проблем быть не должно...
ЗЫ: а без изменений в ФС никак не обойтись? может лучше менять не инод, а xattr? а то инод менять уж слишком чревато...
вы просто добавили поле в конец структуры? трабла в том, что она должна остаться такого же размера, иначе всё может полететь...
Я добавил в середину структуры... хм... странно, если она должна оставаться такого же размера, то получается если добавлять что-то в структуру айнода, то ничего сохраняться не будет, т.к. уже размер будет больше...
может лучше менять не инод, а xattr?
так, т.е. просто изменять xattr? а функции никакие не трогать?
так, т.е. просто изменять xattr? а функции никакие не трогать?
нет... функции, наверное, менять придётся, но на счёт этого я не уверен... да и как оно работает я не очень представляю.
вам сколько надо? я так понимаю, что на переносимость ваша ФС претендовать не будет, так что если надо 4-8 байт, то можно использовать зарезервированные куски в osd1/2
функции, наверное, менять придётся,
тогда бы хотелось узнать, какие именно?=)
наверное лучше пост в ветку про ядро перенести
как это сделать?=))
От.. вышел на новый уровень просвтеления...
вопрос состоит в следующем: как синхронизировать содержимое дискового и "виртуального" inode?