Изменение размера разделов MTD во время выполнения

Я работаю со встроенными устройствами и хотел бы, чтобы они могли изменять размер своих разделов MTD через Linux без перезагрузки.

Проблема в том, что размер моего образа Linux увеличился, а текущий раздел MTD (mtd0), в котором он находится, теперь слишком мал. Однако раздел сразу после него (mtd1) является разделом JFFS2, используемым для хранения информации о конфигурации, поэтому изменение размера с перезагрузкой не является вариантом, поскольку конфигурация может быть потеряна.

Моя цель такова:

1. Copy contents of JFFS2 into /tmp/
2. Unmount JFFS2 from mtd1
3. Increase the starting offset + reduce size of mtd1 by X bytes (or delete mtd1 and create new mtd of proper size and offset)
4. Mount JFFS2 on new mtd1 and restore contents from /tmp/
5. Increase the size of mtd0 by X bytes
6. Burn new (larger) Linux image into mtd0 (the new image will contain a device tree with an updated partition structure)
7. Reboot

Я нашел предложенный патч для "mtd-utils" пару лет назад:

http://article.gmane.org/gmane.linux.drivers.mtd/30949
http://article.gmane.org/gmane.linux.drivers.mtd/30950
http://article.gmane.org/gmane.linux.drivers.mtd/30951

Используя его в качестве руководства, я смог написать ядро ​​и код пользовательского пространства для создания новый раздел MTD, на который я могу смонтировать JFFS2. Однако этот код не удаляет разделы должным образом. Даже после размонтирования JFFS2 из mtd1 и вызова put_mtd_deviceпри вызове del_mtd_deviceядро ​​жалуется:

user.notice kernel: Removing MTD device #1 (jffs2) with use count 1 

Что я хотел бы знать:

1. How to fix the patch to allow deleting my old mtd1
2. How to change the starting offset of mtd1 instead of creating/deleting partitions

Я пытался связаться с автором патча, но их электронная почта больше не действительна, поэтому буду признателен за любые предложения!


ОБНОВЛЕНИЕ:

Кажется, что mtd_open()в mtdchar.cвызывает get_mtd_device(), что, вероятно, объясняет дополнительные usecountприращение. Но моему пользовательскому приложению необходимо вызвать open()для раздела, чтобы отправить ему ioctl()для удаления раздела :/ catch 22? Есть ли более правильный способ сделать это?

5
задан mikhail 1 March 2014 в 20:39
поделиться