forked from vitalif/vitastor
Compare commits
1 Commits
master
...
lrc-matrix
Author | SHA1 | Date |
---|---|---|
Vitaliy Filippov | 42ae8f91ee |
|
@ -96,5 +96,5 @@ Vitastor Network Public License 1.1, основанная на GNU GPL 3.0 с д
|
||||||
и также на условиях GNU GPL 2.0 или более поздней версии. Так сделано в целях
|
и также на условиях GNU GPL 2.0 или более поздней версии. Так сделано в целях
|
||||||
совместимости с таким ПО, как QEMU и fio.
|
совместимости с таким ПО, как QEMU и fio.
|
||||||
|
|
||||||
Вы можете найти полный текст VNPL 1.1 на английском языке в файле [VNPL-1.1.txt](VNPL-1.1.txt),
|
Вы можете найти полный текст VNPL 1.1 в файле [VNPL-1.1.txt](VNPL-1.1.txt),
|
||||||
VNPL 1.1 на русском языке в файле [VNPL-1.1-RU.txt](VNPL-1.1-RU.txt), а GPL 2.0 в файле [GPL-2.0.txt](GPL-2.0.txt).
|
а GPL 2.0 в файле [GPL-2.0.txt](GPL-2.0.txt).
|
||||||
|
|
680
VNPL-1.1-RU.txt
680
VNPL-1.1-RU.txt
|
@ -1,680 +0,0 @@
|
||||||
СЕТЕВАЯ ПУБЛИЧНАЯ ЛИЦЕНЗИЯ VITASTOR
|
|
||||||
VITASTOR NETWORK PUBLIC LICENSE
|
|
||||||
Версия 1.1, от 6 февраля 2021
|
|
||||||
|
|
||||||
Автор лицензии: Виталий Филиппов <vitalif@yourcmc.ru>, 2021 год
|
|
||||||
Каждый имеет право копировать и распространять точные копии этой
|
|
||||||
лицензии, но без внесения изменений.
|
|
||||||
|
|
||||||
ПРЕАМБУЛА
|
|
||||||
|
|
||||||
Сетевая Публичная Лицензия Vitastor - это свободная "копилефт" лицензия для
|
|
||||||
для программного обеспечения (ПО) и других видов произведений, специально
|
|
||||||
разработанная, чтобы гарантировать кооперацию с сообществом при разработке
|
|
||||||
сетевых приложений.
|
|
||||||
|
|
||||||
Большинство лицензий на программное обеспечение и другие произведения
|
|
||||||
спроектированы так, чтобы лишить Вас свободы делиться ими и изменять их.
|
|
||||||
Сетевая Публичная Лицензия Vitastor, напротив, разработана с целью
|
|
||||||
гарантировать Ваше право распространять и вносить изменения во все версии
|
|
||||||
программного обеспечения -- для уверенности, что ПО останется свободным для
|
|
||||||
всех пользователей.
|
|
||||||
|
|
||||||
Когда мы говорим о свободном ПО, мы имеем в виду свободу использования, а не
|
|
||||||
бесплатность. Свободные лицензии, такие, как Сетевая Публичная Лицензия
|
|
||||||
Vitastor, составлены для того, чтобы убедиться, что у Вас есть право
|
|
||||||
распространять копии свободного ПО (и взимать плату за них, если Вы хотите),
|
|
||||||
что Вы получаете исходные тексты или можете получить их, если захотите, что Вы
|
|
||||||
можете изменять программное обеспечение или использовать его части в новых
|
|
||||||
свободных программах, и что Вы знаете о своем праве делать всё это.
|
|
||||||
|
|
||||||
Разработчики, использующие Сетевую Публичную Лицензию Vitastor, гарантируют
|
|
||||||
Ваши права при помощи следующих мер: (1) закрепляют авторское право на
|
|
||||||
программное обеспечение, и (2) предлагают Вам принять условия настоящей
|
|
||||||
Лицензии, закрепляющей Ваше право на создание копий, распространение и (или)
|
|
||||||
модификацию программного обеспечения.
|
|
||||||
|
|
||||||
Еще одно преимущество защиты свободы всех пользователей заключается в том,
|
|
||||||
что улучшения, сделанные в разных версиях программы, при их широком
|
|
||||||
распространении становятся доступными для использования другими разработчиками.
|
|
||||||
Многие разработчики программного обеспечения воодушевляются этим
|
|
||||||
сотрудничеством и пользуются его преимуществами. Однако, если программное
|
|
||||||
обеспечение используется на сетевых серверах, данный результат не всегда
|
|
||||||
достигается. Генеральная публичная лицензия GNU разрешает создание измененных
|
|
||||||
версий и предоставление неограниченного доступа к ним, не делая общедоступным
|
|
||||||
их исходный текст. Даже генеральная публичная лицензия GNU Affero разрешает
|
|
||||||
использование модифицированной версии свободной программы в закрытой среде, где
|
|
||||||
внешние пользователи взаимодействуют с ней только через закрытый промежуточный
|
|
||||||
интерфейс (прокси), опять же, без открытия в свободный публичный доступ как
|
|
||||||
самой программы, так и прокси.
|
|
||||||
|
|
||||||
Сетевая Публичная Лицензия Vitastor разработана специально чтобы
|
|
||||||
гарантировать, что в таких случаях и модифицированная версия программы, и
|
|
||||||
прокси оставались доступными сообществу. Для этого лицензия требует от
|
|
||||||
операторов сетевых серверов предоставлять исходный код оригинальной программы,
|
|
||||||
а также всех других программ, взаимодействующих с ней на их серверах,
|
|
||||||
пользователям этих серверов, на условиях свободных лицензий. Таким образом,
|
|
||||||
публичное использование изменённой версии ПО на сервере, прямо или косвенно
|
|
||||||
доступном пользователям, даёт пользователям доступ к исходным кодам изменённой
|
|
||||||
версии.
|
|
||||||
|
|
||||||
Детальные определения используемых терминов и описание условий копирования,
|
|
||||||
распространения и внесения изменений приведены ниже.
|
|
||||||
|
|
||||||
ТЕРМИНЫ И УСЛОВИЯ
|
|
||||||
|
|
||||||
0. Определения.
|
|
||||||
|
|
||||||
"Настоящая Лицензия" -- версия 1.1 Сетевой Публичной Лицензии Vitastor.
|
|
||||||
|
|
||||||
Под "Авторским правом" понимаются все законы, сходные с авторско-правовыми,
|
|
||||||
которые применяются к любым видам работ, например, к топологиям микросхем.
|
|
||||||
|
|
||||||
Термином "Программа" обозначается любое охраноспособное произведение,
|
|
||||||
используемое в соответствии с настоящей Лицензией. Лицензиат именуется "Вы".
|
|
||||||
"Лицензиаты" и "получатели" могут быть как физическими лицами, так и
|
|
||||||
организациями.
|
|
||||||
|
|
||||||
"Внесение изменений" в произведение означает копирование или адаптацию
|
|
||||||
произведения целиком или в части, способом, требующим разрешения
|
|
||||||
правообладателя, за исключением изготовления его точной копии. Получившееся
|
|
||||||
произведение называется "измененной версией" предыдущего произведения или
|
|
||||||
произведением, "основанным на" более ранней работе.
|
|
||||||
|
|
||||||
Термином "Лицензионное произведение" обозначается неизмененная Программа или
|
|
||||||
произведение, основанное на Программе.
|
|
||||||
|
|
||||||
"Распространение" произведения означает совершение с ним действий, которые
|
|
||||||
при отсутствии разрешения сделают Вас прямо или косвенно ответственным за
|
|
||||||
нарушение действующего закона об авторском праве, за исключением запуска на
|
|
||||||
компьютере или изменения копии, созданной в личных целях. Распространение
|
|
||||||
включает в себя копирование, раздачу копий (с изменениями или без них),
|
|
||||||
доведение до всеобщего сведения, а в некоторых странах -- и другие действия.
|
|
||||||
|
|
||||||
"Передача" произведения означает любой вид распространения, который позволяет
|
|
||||||
другим лицам создавать или получать копии произведения. Обычное взаимодействие
|
|
||||||
с пользователем через компьютерную сеть без создания копии передачей не
|
|
||||||
является.
|
|
||||||
|
|
||||||
Интерактивный интерфейс пользователя должен отображать "Информация об
|
|
||||||
авторском праве", достаточную для того, чтобы (1) обеспечить отображение
|
|
||||||
соответствующего уведомления об авторских правах и (2) сообщить пользователю
|
|
||||||
о том, что ему не предоставляются никакие гарантии на произведение (за
|
|
||||||
исключением явным образом предоставленных гарантий), о том, что лицензиаты
|
|
||||||
могут передавать произведение на условиях, описанных в настоящей Лицензии,
|
|
||||||
а также о том, как ознакомиться с текстом настоящей Лицензии. Если интерфейс
|
|
||||||
предоставляет собой список пользовательских команд или настроек, наподобие
|
|
||||||
меню, это требование считается выполненным при наличии явно выделенного
|
|
||||||
пункта в таком меню.
|
|
||||||
|
|
||||||
1. Исходный текст.
|
|
||||||
|
|
||||||
Под "Исходным текстом" понимается произведение в форме, которая более всего
|
|
||||||
подходит для внесения в него изменений. "Объектным кодом" называется
|
|
||||||
произведение в любой иной форме.
|
|
||||||
|
|
||||||
"Стандартный интерфейс" -- интерфейс, который либо является общепринятым
|
|
||||||
стандартом, введенным общепризнанным органом по стандартизации, либо, в случае
|
|
||||||
интерфейсов, характерных для конкретного языка программирования -- тот,
|
|
||||||
который широко используется разработчиками, пишущими программы на этом языке.
|
|
||||||
|
|
||||||
"Системные библиотеки" исполняемого произведения включают в себя то, что не
|
|
||||||
относится к произведению в целом и при этом (a) входит в обычный комплект
|
|
||||||
Основного компонента, но при этом не является его частью и (b) служит только
|
|
||||||
для обеспечения работы с этим Основным компонентом или для реализации
|
|
||||||
Стандартного интерфейса, для которого существует общедоступная реализация,
|
|
||||||
опубликованная в виде исходного текста. "Основным компонентом" в данном
|
|
||||||
контексте назван главный существенный компонент (ядро, оконная система и т.д.)
|
|
||||||
определенной операционной системы (если она используется), под управлением
|
|
||||||
которой функционирует исполняемое произведение, либо компилятор, используемый
|
|
||||||
для создания произведения или интерпретатор объектного кода, используемый для
|
|
||||||
его запуска.
|
|
||||||
|
|
||||||
"Полный исходный текст" для произведения в форме объектного кода -- весь
|
|
||||||
исходный текст, необходимый для создания, установки и (для исполняемого
|
|
||||||
произведения) функционирования объектного кода, а также модификации
|
|
||||||
произведения, включая сценарии, контролирующие эти действия. Однако он не
|
|
||||||
включает в себя Системные библиотеки, необходимые для функционирования
|
|
||||||
произведения, инструменты общего назначения или общедоступные свободные
|
|
||||||
программы, которые используются в неизменном виде для выполнения этих
|
|
||||||
действий, но не являются частью произведения. Полный исходный текст включает
|
|
||||||
в себя, например, файлы описания интерфейса, прилагаемые к файлам исходного
|
|
||||||
текста произведения, а также исходные тексты общих библиотек и динамически
|
|
||||||
связанных подпрограмм, которые требуются для функционирования произведения
|
|
||||||
и разработаны специально для этого, например, для прямой передачи данных
|
|
||||||
или управления потоками между этими подпрограммами и другими частями
|
|
||||||
произведения. Полный исходный текст не включает в себя то, что пользователи
|
|
||||||
могут сгенерировать автоматически из других частей Полного исходного текста.
|
|
||||||
Полным исходным текстом для произведения в форме исходных текстов является
|
|
||||||
само это произведение.
|
|
||||||
|
|
||||||
2. Основные права.
|
|
||||||
|
|
||||||
Все права, предоставленные на основании настоящей Лицензии, действуют в
|
|
||||||
течение срока действия авторских прав на Программу и не могут быть отозваны
|
|
||||||
при условии, что сформулированные в ней условия соблюдены. Настоящая Лицензия
|
|
||||||
однозначно подтверждает Ваши неограниченные права на запуск неизмененной
|
|
||||||
Программы. Настоящая Лицензия распространяется на результаты функционирования
|
|
||||||
Лицензионного произведения только в том случае, если они, учитывая их
|
|
||||||
содержание, сами являются частью Лицензионного произведения. Настоящая
|
|
||||||
Лицензия подтверждает Ваши права на свободное использование произведения
|
|
||||||
или другие аналогичные полномочия, предусмотренные действующим
|
|
||||||
законодательством об авторском праве.
|
|
||||||
|
|
||||||
Если Вы не осуществляете обычную передачу Лицензионного произведения, то
|
|
||||||
можете как угодно создавать, запускать и распространять его копии до тех пор,
|
|
||||||
пока ваша Лицензия сохраняет силу. Вы можете передавать Лицензионные
|
|
||||||
произведения третьим лицам исключительно для того, чтобы они внесли в них
|
|
||||||
изменения для Вас или предоставили Вам возможность их запуска, при условии,
|
|
||||||
что Вы соглашаетесь с условиями настоящей Лицензии при передаче всех
|
|
||||||
материалов, авторскими правами на которые Вы не обладаете. Лица, создающие
|
|
||||||
или запускающие Лицензионные произведения для Вас, должны делать это
|
|
||||||
исключительно от Вашего имени, под Вашим руководством и контролем, на
|
|
||||||
условиях, которые запрещают им создание без Вашей санкции каких-либо копий
|
|
||||||
материалов, на которые Вы обладаете авторским правом.
|
|
||||||
|
|
||||||
Любая другая передача разрешается исключительно при соблюдении описанных
|
|
||||||
ниже условий. Сублицензирование не допускается; раздел 10 делает его не нужным.
|
|
||||||
|
|
||||||
3. Защита прав пользователей от законов, запрещающих обход технических средств.
|
|
||||||
|
|
||||||
Ни одно Лицензионное произведение не должно считаться содержащим эффективные
|
|
||||||
технические средства, удовлетворяющие требованиям любого действующего закона,
|
|
||||||
принятого для исполнения обязательств, предусмотренных статьей 11 Договора ВОИС
|
|
||||||
по авторскому праву от 20 декабря 1996 года или аналогичных законов,
|
|
||||||
запрещающих или ограничивающих обход таких технических средств.
|
|
||||||
|
|
||||||
При передаче Лицензионного произведения Вы отказываетесь от всех
|
|
||||||
предоставляемых законом полномочий по запрету обхода технических средств,
|
|
||||||
используемых авторами в связи с осуществлением их прав, признавая, что такой
|
|
||||||
обход находится в рамках осуществления прав на использование Лицензионного
|
|
||||||
произведения, предоставленных настоящей Лицензией; также Вы отказываетесь
|
|
||||||
от любых попыток ограничить функционирование произведения или внесение в него
|
|
||||||
изменений, направленных на реализацию предоставленных Вам законом прав на
|
|
||||||
запрет пользователю обхода технических средств.
|
|
||||||
|
|
||||||
4. Передача неизмененных копий.
|
|
||||||
|
|
||||||
Вы можете передавать точные копии исходных текстов Программы в том виде,
|
|
||||||
в котором Вы их получили, на любом носителе, при условии, что Вы прилагаете
|
|
||||||
к каждой копии соответствующее уведомление об авторских правах способом,
|
|
||||||
обеспечивающим ознакомление с ним пользователя; сохраняете все уведомления
|
|
||||||
о том, что к тексту применима настоящая Лицензия и любые ограничения,
|
|
||||||
добавленные в соответствии с разделом 7; сохраняете все уведомления об
|
|
||||||
отсутствии каких-либо гарантий; предоставляете всем получателям вместе с
|
|
||||||
Программой копию настоящей Лицензии.
|
|
||||||
|
|
||||||
Вы можете установить любую цену за каждую копию, которую Вы передаете,
|
|
||||||
или распространять копии бесплатно; также Вы можете предложить поддержку
|
|
||||||
или гарантию за отдельную плату.
|
|
||||||
|
|
||||||
5. Передача измененных исходных текстов.
|
|
||||||
|
|
||||||
Вы можете передавать исходный текст произведения, основанного на Программе,
|
|
||||||
или изменений, необходимых для того, чтобы получить его из Программы, на
|
|
||||||
условиях, описанных в разделе 4, при соблюдении следующих условий:
|
|
||||||
|
|
||||||
а) Произведение должно содержать уведомления о произведенных Вами
|
|
||||||
изменениях с указанием их даты, сделанные способом, обеспечивающим
|
|
||||||
ознакомление с ними пользователя.
|
|
||||||
|
|
||||||
b) Произведение должно содержать уведомление о том, что оно
|
|
||||||
распространяется на условиях настоящей Лицензии, а также об условиях,
|
|
||||||
добавленных в соответствии с разделом 7, сделанное способом,
|
|
||||||
обеспечивающим ознакомление с ним пользователя. Данное требование имеет
|
|
||||||
приоритет над требованиями раздела 4 "оставлять нетронутыми все
|
|
||||||
уведомления".
|
|
||||||
|
|
||||||
c) Вы должны передать на условиях настоящей Лицензии всю работу целиком
|
|
||||||
любому лицу, которое приобретает копию. Таким образом, настоящая Лицензия
|
|
||||||
вместе с любыми применимыми условиями раздела 7 будет применяться к
|
|
||||||
произведению в целом и всем его частям, независимо от их комплектности.
|
|
||||||
Настоящая Лицензия не дает права на лицензирование произведения на любых
|
|
||||||
других условиях, но это не лишает законной силы такое разрешение, если Вы
|
|
||||||
получили его отдельно.
|
|
||||||
|
|
||||||
d) Если произведение имеет интерактивные пользовательские интерфейсы,
|
|
||||||
каждый из них должен отображать Информацию об авторском праве; однако,
|
|
||||||
если Программа имеет пользовательские интерфейсы, которые не отображают
|
|
||||||
информацию об авторском праве, от Вашего произведения этого также не
|
|
||||||
требуется.
|
|
||||||
|
|
||||||
Включение Лицензионного произведения в подборку на разделе хранения данных
|
|
||||||
или на носителе, на котором распространяется произведение, вместе с другими
|
|
||||||
отдельными самостоятельными произведениями, которые по своей природе не
|
|
||||||
являются переработкой Лицензионного произведения и не объединены с ним,
|
|
||||||
например, в программный комплекс, называется "набором", если авторские права
|
|
||||||
на подборку не используются для ограничения доступа к ней или законных прав
|
|
||||||
её пользователей сверх того, что предусматривают лицензии на отдельные
|
|
||||||
произведения. Включение Лицензионного произведения в набор не влечет применения
|
|
||||||
положений настоящей Лицензии к остальным его частям.
|
|
||||||
|
|
||||||
6. Передача произведения в формах, не относящихся к исходному тексту.
|
|
||||||
|
|
||||||
Вы можете передавать Лицензионное произведение в виде объектного кода в
|
|
||||||
соответствии с положениями разделов 4 и 5, при условии, что Вы также передаете
|
|
||||||
машиночитаемый Полный исходный текст в соответствии с условиями настоящей
|
|
||||||
Лицензии, одним из следующих способов:
|
|
||||||
|
|
||||||
а) Передавая объектный код или содержащий его материальный продукт (включая
|
|
||||||
распределенный материальный носитель), с приложением Полного исходного
|
|
||||||
текста наматериальном носителе, обычно используемом для обмена программным
|
|
||||||
обеспечением.
|
|
||||||
|
|
||||||
b) Передавая объектный код или содержащий его материальный продукт (включая
|
|
||||||
носитель, на котором распространяется произведение), с письменным
|
|
||||||
предложением, действительным в течение не менее трех лет либо до тех пор,
|
|
||||||
пока Вы предоставляете запасные части или поддержку для данного продукта,
|
|
||||||
о передаче любому обладателю объектного кода (1) копии Полного исходного
|
|
||||||
текста для всего программного обеспечения, содержащегося в продукте, на
|
|
||||||
которое распространяется действие настоящей Лицензии, на физическом
|
|
||||||
носителе, обычно используемом для обмена программным обеспечением, по цене,
|
|
||||||
не превышающей разумных затрат на передачу копии, или (2) доступа к Полному
|
|
||||||
исходному тексту с возможностью его копирования с сетевого сервера без
|
|
||||||
взимания платы.
|
|
||||||
|
|
||||||
с) Передавая отдельные копии объектного кода с письменной копией предложения
|
|
||||||
о предоставлении Полного исходного текста. Этот вариант допускается только
|
|
||||||
в отдельных случаях при распространении без извлечения прибыли, и только
|
|
||||||
если Вы получили объектный код с таким предложением в соответствии
|
|
||||||
с пунктом 6b.
|
|
||||||
|
|
||||||
d) Передавая объектный код посредством предоставления доступа к нему по
|
|
||||||
определенному адресу (бесплатно или за дополнительную плату), и предлагая
|
|
||||||
эквивалентный доступ к Полному исходному тексту таким же способом по тому же
|
|
||||||
адресу без какой-либо дополнительной оплаты. От Вас не требуется принуждать
|
|
||||||
получателей копировать Полный исходный текст вместе с объектным кодом. Если
|
|
||||||
объектный код размещен на сетевом сервере, Полный исходный текст может
|
|
||||||
находиться на другом сервере (управляемом Вами или третьим лицом), который
|
|
||||||
предоставляет аналогичную возможность копирования; при этом Вы должны четко
|
|
||||||
указать рядом с объектным кодом способ получения Полного исходного текста.
|
|
||||||
Независимо от того, на каком сервере расположен Полный исходный текст, Вы
|
|
||||||
обязаны убедиться в том, что он будет распространяться в течение времени,
|
|
||||||
необходимого для соблюдения этих требований.
|
|
||||||
|
|
||||||
e) Передавая объектный код с использованием одноранговой (пиринговой) сети,
|
|
||||||
при условии информирования других пользователей сети о том, где можно
|
|
||||||
бесплатно получить объектный код и Полный исходный текст произведения
|
|
||||||
способом, описанным в пункте 6d.
|
|
||||||
|
|
||||||
Не нужно включать в передаваемый объектный код его отделимые части, исходные
|
|
||||||
тексты которых не входят в состав Полного исходного текста, такие как Системные
|
|
||||||
библиотеки.
|
|
||||||
|
|
||||||
"Потребительский товар" это либо (1) "товар, предназначенный для личных нужд",
|
|
||||||
под которым понимается любое материальное личное имущество, которое обычно
|
|
||||||
используется для личных, семейных или домашних целей, или (2) что-либо
|
|
||||||
спроектированное или продающееся для использования в жилище. При определении
|
|
||||||
того, предназначен ли товар для личных нужд, сомнения должны толковаться в
|
|
||||||
пользу положительного ответа на этот вопрос. Применительно к конкретному
|
|
||||||
товару, используемому конкретным пользователем, под выражением "обычно
|
|
||||||
используется" имеется в виду способ, которым данный вид товаров преимущественно
|
|
||||||
или как правило используется, независимо от статуса конкретного пользователя
|
|
||||||
или способа, которым конкретный пользователь использует, предполагает или
|
|
||||||
будет использовать товар. Товар относится к предназначенным для личных нужд
|
|
||||||
независимо от того, насколько часто он используется в коммерческой
|
|
||||||
деятельности, промышленности или иной сфере, не относящейся к личным нуждам,
|
|
||||||
за исключением случая, когда использование в этой сфере представляет собой
|
|
||||||
единственный основной способ использования такого товара.
|
|
||||||
|
|
||||||
"Информация, необходимая для установки" Потребительского товара -- любые
|
|
||||||
методы, процедуры, сведения, необходимые для авторизации, или другая
|
|
||||||
информация, необходимая для установки и запуска в Потребительском товаре
|
|
||||||
измененных версий Лицензионного произведения, полученных при изменении
|
|
||||||
Полного исходного текста. Данная информация должна быть достаточной для
|
|
||||||
того, чтобы обеспечить возможность внесения в исходный текст изменений,
|
|
||||||
не приводящих к ограничению или нарушению его дальнейшей работоспособности.
|
|
||||||
|
|
||||||
Если вместе с Потребительским товаром или специально для использования
|
|
||||||
в нём Вы передаете произведение в виде объектного кода на условиях, описанных
|
|
||||||
в данном разделе, и такая передача является частью сделки, по которой право
|
|
||||||
владения и пользования Потребительским товаром переходит к получателю
|
|
||||||
пожизненно или на определенный срок (независимо от признаков сделки), Полный
|
|
||||||
исходный текст, передаваемый согласно данному разделу, должен сопровождаться
|
|
||||||
Информацией, необходимой для установки. Но это требование не применяется,
|
|
||||||
если ни Вы, ни какое-либо третье лицо не сохраняет за собой возможности
|
|
||||||
установки измененного объектного кода на Потребительский товар (например,
|
|
||||||
произведение было установлено в постоянную память).
|
|
||||||
|
|
||||||
Требование о предоставлении Информации, необходимой для установки, не
|
|
||||||
включает в себя требование продолжения оказания услуг по поддержке,
|
|
||||||
предоставления гарантии или обновлений для произведения, которое было изменено
|
|
||||||
или установлено получателем, либо для Потребительского товара, в котором оно
|
|
||||||
было изменено или на который оно было установлено. В доступе к сети может быть
|
|
||||||
отказано, если само внесение изменений существенно и негативно влияет на
|
|
||||||
работу сети, нарушает правила обмена данными или не поддерживает протоколы для
|
|
||||||
обмена данными по сети.
|
|
||||||
|
|
||||||
Передаваемый в соответствии с данным разделом Полный исходный текст и
|
|
||||||
предоставленная Информация, необходимая для установки, должны быть записаны в
|
|
||||||
формате, который имеет общедоступное описание (и общедоступную реализацию,
|
|
||||||
опубликованную в форме исходного текста) и не должны требовать никаких
|
|
||||||
специальных паролей или ключей для распаковки, чтения или копирования.
|
|
||||||
|
|
||||||
7. Дополнительные условия.
|
|
||||||
|
|
||||||
"Дополнительными разрешениями" называются условия, которые дополняют условия
|
|
||||||
настоящей Лицензии, делая исключения из одного или нескольких её положений.
|
|
||||||
Дополнительные разрешения, которые применимы ко всей Программе, должны
|
|
||||||
рассматриваться как часть настоящей Лицензии, в той степени, в которой они
|
|
||||||
соответствуют действующему законодательству. Если дополнительные разрешения
|
|
||||||
применяются только к части Программы, эта часть может быть использована отдельно
|
|
||||||
на измененных условиях, но вся Программа продолжает использоваться на условиях
|
|
||||||
настоящей Лицензии без учета дополнительных разрешений.
|
|
||||||
|
|
||||||
Когда Вы передаете копию Лицензионного произведения, Вы можете по своему
|
|
||||||
усмотрению исключить любые дополнительные разрешения, примененные к этой копии
|
|
||||||
или к любой её части. (Для дополнительных разрешений может быть заявлено
|
|
||||||
требование об их удалении в определенных случаях, когда Вы вносите изменения в
|
|
||||||
произведение.) Вы можете добавлять дополнительные разрешения к добавленным Вами
|
|
||||||
в Лицензионное произведение материалам, на которые Вы обладаете авторскими
|
|
||||||
правами или правом выдачи соответствующего разрешения.
|
|
||||||
|
|
||||||
Независимо от любых других положений настоящей Лицензии, Вы можете дополнить
|
|
||||||
следующими условиями положения настоящей Лицензии в отношении материала,
|
|
||||||
добавленного к Лицензионному произведению (если это разрешено обладателями
|
|
||||||
авторских прав на материал):
|
|
||||||
|
|
||||||
a) отказом от гарантий или ограничением ответственности, отличающимися от
|
|
||||||
тех, что описаны в разделах 15 и 16 настоящей Лицензии; либо
|
|
||||||
|
|
||||||
b) требованием сохранения соответствующей информации о правах или об
|
|
||||||
авторстве материала, или включения её в Информацию об авторском праве,
|
|
||||||
отображаемую содержащим его произведением; либо
|
|
||||||
|
|
||||||
c) запретом на искажение информации об источнике происхождения материала
|
|
||||||
или требованием того, чтобы измененные версии такого материала содержали
|
|
||||||
корректную отметку об отличиях от исходной версии; либо
|
|
||||||
|
|
||||||
d) ограничением использования в целях рекламы имен лицензиаров или авторов
|
|
||||||
материала; либо
|
|
||||||
|
|
||||||
e) отказом от предоставления прав на использование в качестве товарных
|
|
||||||
знаков некоторых торговых наименований, товарных знаков или знаков
|
|
||||||
обслуживания; либо
|
|
||||||
|
|
||||||
f) требованием от каждого, кто по договору передает материал (или его
|
|
||||||
измененные версии), предоставления компенсации лицензиарам и авторам
|
|
||||||
материала в виде принятия на себя любой ответственности, которую этот
|
|
||||||
договор налагает на лицензиаров и авторов.
|
|
||||||
|
|
||||||
Все остальные ограничительные дополнительные условия считаются "дополнительными
|
|
||||||
запретами" по смыслу раздела 10. Если программа, которую Вы получили, или любая
|
|
||||||
её часть содержит уведомление о том, что наряду с настоящей Лицензией её
|
|
||||||
использование регулируется условием, относящимся к дополнительным запретам, Вы
|
|
||||||
можете удалить такое условие. Если лицензия содержит дополнительный запрет, но
|
|
||||||
допускает лицензирование на измененных условиях или передачу в соответствии с
|
|
||||||
настоящей Лицензией, Вы можете добавить к Лицензионному произведению материал,
|
|
||||||
используемый на условиях такой лицензии, в том случае, если дополнительный
|
|
||||||
запрет не сохраняется при таком изменении условий лицензии или передаче.
|
|
||||||
|
|
||||||
Если Вы добавляете условия для использования Лицензионного произведения в
|
|
||||||
соответствии с настоящим разделом, Вы должны поместить в соответствующих файлах
|
|
||||||
исходного текста уведомление о том, что к этим файлам применяются дополнительные
|
|
||||||
условия, или указание на то, как ознакомиться с соответствующими условиями.
|
|
||||||
|
|
||||||
Дополнительные разрешающие или ограничивающие условия могут быть сформулированы
|
|
||||||
в виде отдельной лицензии или зафиксированы как исключения; вышеуказанные
|
|
||||||
требования применяются в любом случае.
|
|
||||||
|
|
||||||
8. Прекращение действия.
|
|
||||||
|
|
||||||
Вы не можете распространять Лицензионное произведение или вносить в него
|
|
||||||
изменения на условиях, отличающихся от явно оговоренных в настоящей Лицензии.
|
|
||||||
Любая попытка распространения или внесения изменений на иных условиях является
|
|
||||||
ничтожной и автоматически прекращает Ваши права, полученные по настоящей
|
|
||||||
Лицензии (включая лицензию на любые патенты, предоставленные согласно третьему
|
|
||||||
пункту раздела 11).
|
|
||||||
|
|
||||||
Тем не менее если Вы прекращаете нарушение настоящей Лицензии, Ваши права,
|
|
||||||
полученные от конкретного правообладателя, восстанавливаются (а) временно, до
|
|
||||||
тех пор пока правообладатель явно и окончательно не прекратит действие Ваших
|
|
||||||
прав, и (б) навсегда, если правообладатель не уведомит Вас о нарушении с помощью
|
|
||||||
надлежащих средств в течение 60 дней после прекращения нарушений.
|
|
||||||
|
|
||||||
Кроме того, Ваши права, полученные от конкретного правообладателя,
|
|
||||||
восстанавливаются навсегда, если правообладатель впервые любым подходящим
|
|
||||||
способом уведомляет Вас о нарушении настоящей Лицензии на свое произведение (для
|
|
||||||
любого произведения) и Вы устраняете нарушение в течение 30 дней после получения
|
|
||||||
уведомления.
|
|
||||||
|
|
||||||
Прекращение Ваших прав, описанное в настоящем разделе, не прекращает действие
|
|
||||||
лицензий лиц, которые получили от Вас копии произведения или права,
|
|
||||||
предоставляемые настоящей Лицензией. Если Ваши права были прекращены навсегда и
|
|
||||||
не восстановлены, Вы не можете вновь получить право на тот же материал на
|
|
||||||
условиях, описанных в разделе 10.
|
|
||||||
|
|
||||||
9. Акцепт не требуется для получения копий.
|
|
||||||
|
|
||||||
Вы не обязаны принимать условия настоящей Лицензии для того, чтобы получить или
|
|
||||||
запустить копию Программы. Случайное распространение Лицензионного произведения,
|
|
||||||
происходящее вследствие использования одноранговой (пиринговой) сети для
|
|
||||||
получения его копии, также не требует принятия этих условий. Тем не менее только
|
|
||||||
настоящая Лицензия дает Вам право распространять или изменять любое Лицензионное
|
|
||||||
произведение. Если Вы не приняли условия настоящей Лицензии, такие действия
|
|
||||||
будут нарушением авторского права. Поэтому изменяя или распространяя
|
|
||||||
Лицензионное произведение, Вы выражаете согласие с условиями настоящей Лицензии.
|
|
||||||
|
|
||||||
10. Автоматическое получение прав последующими получателями.
|
|
||||||
|
|
||||||
Каждый раз, когда Вы передаете Лицензионное произведение, получатель
|
|
||||||
автоматически получает от его лицензиара право запускать, изменять и
|
|
||||||
распространять это произведение при условии соблюдения настоящей Лицензии. Вы не
|
|
||||||
несете ответственности за соблюдение третьими лицами условий настоящей Лицензии.
|
|
||||||
|
|
||||||
"Реорганизацией" называются действия, в результате которых передается управление
|
|
||||||
организацией или значительная часть её активов, а также происходит разделение
|
|
||||||
или слияние организаций. Если распространение Лицензионного произведения
|
|
||||||
является результатом реорганизации, каждая из сторон сделки, получающая копию
|
|
||||||
произведения, также получает все права на произведение, которые предшествующее
|
|
||||||
юридическое лицо имело или могло предоставить согласно предыдущему абзацу, а
|
|
||||||
также право на владение Полным исходным текстом произведения от предшественника,
|
|
||||||
осуществляемое в его интересах, если предшественник владеет им или может
|
|
||||||
получить его при разумных усилиях.
|
|
||||||
|
|
||||||
Вы не можете налагать каких-либо дополнительных ограничений на осуществление
|
|
||||||
прав, предоставленных или подтвержденных в соответствии с настоящей Лицензией.
|
|
||||||
Например, Вы не можете ставить осуществление прав, предоставленных по настоящей
|
|
||||||
Лицензии, в зависимость от оплаты отчислений, роялти или других сборов; также Вы
|
|
||||||
не можете инициировать судебный процесс (включая встречный иск или заявление
|
|
||||||
встречного требования в судебном процессе) о нарушении любых патентных прав при
|
|
||||||
создании, использовании, продаже, предложении продажи, импорте Программы или
|
|
||||||
любой её части.
|
|
||||||
|
|
||||||
11. Патенты.
|
|
||||||
|
|
||||||
"Инвестором" называется правообладатель, разрешающий использование Программы
|
|
||||||
либо произведения, на котором основана Программа, на условиях настоящей
|
|
||||||
Лицензии. Произведение, лицензированное таким образом, называется "версией со
|
|
||||||
вкладом" инвестора.
|
|
||||||
|
|
||||||
"Неотъемлемые патентные претензии" инвестора -- все патентные права,
|
|
||||||
принадлежащие инвестору или контролируемые им в настоящее время либо
|
|
||||||
приобретенные в будущем, которые могут быть нарушены созданием, использованием
|
|
||||||
или продажей версии со вкладом, допускаемыми настоящей Лицензией; они не
|
|
||||||
включают в себя права, которые будут нарушены исключительно вследствие будущих
|
|
||||||
изменений версии со вкладом. Для целей данного определения под "контролем"
|
|
||||||
понимается право выдавать патентные сублицензии способами, не нарушающими
|
|
||||||
требований настоящей Лицензии.
|
|
||||||
|
|
||||||
Каждый инвестор предоставляет Вам неисключительную безвозмездную лицензию на
|
|
||||||
патент, действующую во всем мире, соответствующую неотъемлемым патентным
|
|
||||||
претензиям инвестора, на создание, использование, продажу, предложение для
|
|
||||||
продажи, импорт, а также запуск, внесение изменений и распространение всего, что
|
|
||||||
входит в состав версии со вкладом.
|
|
||||||
|
|
||||||
В следующих трех абзацах "лицензией на патент" называется любое явно выраженное
|
|
||||||
вовне согласие или обязательство не применять патент (например, выдача
|
|
||||||
разрешения на использование запатентованного объекта или обещание не подавать в
|
|
||||||
суд за нарушение патента). "Выдать" кому-то такую лицензию на патент означает
|
|
||||||
заключить такое соглашение или обязаться не применять патент против него.
|
|
||||||
|
|
||||||
Если Вы передаете Лицензионное произведение, сознательно основываясь на лицензии
|
|
||||||
на патент, в то время как Полный исходный текст произведения невозможно
|
|
||||||
бесплатно скопировать с общедоступного сервера или другим не вызывающим
|
|
||||||
затруднений способом, Вы должны либо (1) обеспечить возможность такого доступа к
|
|
||||||
Полному исходному тексту, либо (2) отказаться от прав, предоставленных по
|
|
||||||
лицензии на патент для данного произведения, либо (3) принять меры по передаче
|
|
||||||
лицензии на патент последующим получателям произведения, в соответствии с
|
|
||||||
требованиями настоящей Лицензии. "Сознательно основываясь" означает, что Вы
|
|
||||||
знаете, что при отсутствии лицензии на патент передача Вами Лицензионного
|
|
||||||
произведения в определенной стране или использование получателем переданного ему
|
|
||||||
Вами Лицензионного произведения в этой стране нарушит один или несколько
|
|
||||||
определенных патентов этой страны, срок действия которых не истек.
|
|
||||||
|
|
||||||
Если в соответствии или в связи с единичной сделкой либо соглашением Вы
|
|
||||||
передаете или делаете заказ на распространение Лицензионного произведения, и
|
|
||||||
предоставляете определенным лицам, получающим Лицензионное произведение,
|
|
||||||
лицензию на патент, разрешающую им использовать, распространять, вносить
|
|
||||||
изменения или передавать конкретные экземпляры Лицензионного произведения,
|
|
||||||
права, которые Вы предоставляете по лицензии на патент, автоматически переходят
|
|
||||||
ко всем получателям Лицензионного произведения и произведений, созданных на его
|
|
||||||
основе.
|
|
||||||
|
|
||||||
Патентная лицензия называется "дискриминирующей", если она не покрывает,
|
|
||||||
запрещает осуществление или содержит в качестве условия отказ от применения
|
|
||||||
одного или нескольких прав, предоставленных настоящей Лицензией. Вы не можете
|
|
||||||
передавать Лицензионное произведение, если Вы являетесь участником договора с
|
|
||||||
третьим лицом, осуществляющим распространение программного обеспечения, в
|
|
||||||
соответствии с которым Вы делаете в пользу третьего лица выплаты, размер которых
|
|
||||||
зависит от масштабов Вашей деятельности по передаче произведения, и в
|
|
||||||
соответствии с которым любое третье лицо, получающее от Вас Лицензионное
|
|
||||||
произведение, делает это на условиях дискриминирующей патентной лицензии (а)
|
|
||||||
которая зависит от количества копий Лицензионного произведения, переданных Вами
|
|
||||||
(или копий, сделанных с этих копий), или (b) которая используется
|
|
||||||
преимущественно в конкретных товарах или подборках, содержащих Лицензионное
|
|
||||||
произведение, или в связи с ними, в том случае, если Вы заключили данный договор
|
|
||||||
или получили лицензию на патент после 28 марта 2007 года.
|
|
||||||
|
|
||||||
Ничто в настоящей Лицензии не должно толковаться как исключение или ограничение
|
|
||||||
любого предполагаемого права или других способов противодействия нарушениям,
|
|
||||||
которые во всем остальном могут быть доступны для Вас в соответствии с
|
|
||||||
применимым патентным правом.
|
|
||||||
|
|
||||||
12. Запрет отказывать в свободе другим.
|
|
||||||
|
|
||||||
Если на Вас наложены обязанности (будь то по решению суда, договору или иным
|
|
||||||
способом), которые противоречат условиям настоящей Лицензии, это не освобождает
|
|
||||||
Вас от соблюдения её условий. Если Вы не можете передать Лицензионное
|
|
||||||
произведение так, чтобы одновременно выполнять Ваши обязательства по настоящей
|
|
||||||
Лицензии и любые другие относящиеся к делу обязательства, то Вы не можете
|
|
||||||
передавать его вообще. Например, если Вы согласны с условием, обязывающими Вас
|
|
||||||
производить сбор отчислений за дальнейшую передачу от тех, кому Вы передаете
|
|
||||||
Программу, то для того, чтобы соблюсти это условие и выполнить требования
|
|
||||||
настоящей Лицензии, Вы должны полностью воздержаться от передачи Программы.
|
|
||||||
|
|
||||||
13. Удаленное сетевое взаимодействие.
|
|
||||||
|
|
||||||
Под "Прокси-программой" понимается отдельная программа, специально
|
|
||||||
разработанная для использования совместно с Лицензионным произведением,
|
|
||||||
и взаимодействующая с ним прямо или косвенно через любой вид программного
|
|
||||||
интерфейса, компьютерную сеть, имитацию такой сети, или, в свою очередь,
|
|
||||||
через другую Прокси-программу.
|
|
||||||
|
|
||||||
Независимо от любых других положений настоящей Лицензии, если вы
|
|
||||||
предоставляете любому пользователю возможность взаимодействовать с Лицензионным
|
|
||||||
произведением через компьютерную сеть, имитацию такой сети, или через любое
|
|
||||||
количество "Прокси-программ", вы должны в явной форме предложить этому
|
|
||||||
пользователю возможность получить Полный исходный текст Лицензионного
|
|
||||||
произведения и всех Прокси-программ путём предоставления доступа к нему
|
|
||||||
с сетевого сервера без взимания платы, посредством стандартных или
|
|
||||||
традиционных способов, используемых для копирования программного обеспечения.
|
|
||||||
Полный исходный текст Лицензионного произведения должен предоставляться
|
|
||||||
пользователю на условиях настоящей Лицензии, а Полный исходный текст
|
|
||||||
Прокси-программ должен предоставляться пользователю либо на условиях настоящей
|
|
||||||
Лицензии, либо на условиях одной из свободных лицензий, совместимых с
|
|
||||||
Генеральной публичной Лицензией GNU, перечисленных Фондом Свободного
|
|
||||||
Программного Обеспечения в списке под названием "Лицензии свободных программ,
|
|
||||||
совместимые с GPL".
|
|
||||||
|
|
||||||
14. Пересмотренные редакции настоящей Лицензии.
|
|
||||||
|
|
||||||
Автор настоящей Лицензии время от времени может публиковать пересмотренные
|
|
||||||
и (или) новые редакции Сетевой Публичной Лицензии Vitastor. Они будут аналогичны
|
|
||||||
по смыслу настоящей редакции, но могут отличаться от нее в деталях, направленных
|
|
||||||
на решение новых проблем или регулирование новых отношений.
|
|
||||||
|
|
||||||
Каждой редакции присваивается собственный номер. Если для Программы указано,
|
|
||||||
что к ней применима определенная редакция Сетевой Публичной Лицензии Vitastor
|
|
||||||
"или любая более поздняя редакция", у Вас есть возможность использовать термины
|
|
||||||
и условия, содержащиеся в редакции с указанным номером или любой более поздней
|
|
||||||
редакции, опубликованной автором настоящей Лицензии. Если для Программы не
|
|
||||||
указан номер редакции Сетевой Публичной Лицензии Vitastor, Вы можете выбрать
|
|
||||||
любую редакцию, опубликованную автором настоящей Лицензии.
|
|
||||||
|
|
||||||
Более поздние редакции Лицензии могут дать Вам дополнительные или принципиально
|
|
||||||
иные права. Тем не менее в результате Вашего выбора более поздней редакции на
|
|
||||||
автора или правообладателя не возлагается никаких дополнительных обязанностей.
|
|
||||||
|
|
||||||
15. Отказ от гарантий.
|
|
||||||
|
|
||||||
НА ПРОГРАММУ НЕ ПРЕДОСТАВЛЯЕТСЯ НИКАКИХ ГАРАНТИЙ ЗА ИСКЛЮЧЕНИЕМ ПРЕДУСМОТРЕННЫХ
|
|
||||||
ДЕЙСТВУЮЩИМ ЗАКОНОДАТЕЛЬСТВОМ. ЕСЛИ ИНОЕ НЕ УКАЗАНО В ПИСЬМЕННОЙ ФОРМЕ,
|
|
||||||
ПРАВООБЛАДАТЕЛИ И (ИЛИ) ТРЕТЬИ ЛИЦА ПРЕДОСТАВЛЯЮТ ПРОГРАММУ "КАК ЕСТЬ", БЕЗ
|
|
||||||
КАКИХ-ЛИБО ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ ГАРАНТИЙ, ВКЛЮЧАЯ ГАРАНТИИ ПРИГОДНОСТИ ДЛЯ
|
|
||||||
КОНКРЕТНЫХ ЦЕЛЕЙ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ. ВЕСЬ РИСК, СВЯЗАННЫЙ С КАЧЕСТВОМ И
|
|
||||||
ПРОИЗВОДИТЕЛЬНОСТЬЮ ПРОГРАММЫ, ВОЗЛАГАЕТСЯ НА ВАС. ЕСЛИ В ПРОГРАММЕ БУДУТ
|
|
||||||
ВЫЯВЛЕНЫ НЕДОСТАТКИ, ВЫ ПРИНИМАЕТЕ НА СЕБЯ СТОИМОСТЬ ВСЕГО НЕОБХОДИМОГО
|
|
||||||
ОБСЛУЖИВАНИЯ, РЕМОНТА ИЛИ ИСПРАВЛЕНИЯ.
|
|
||||||
|
|
||||||
16. Ограничение ответственности.
|
|
||||||
|
|
||||||
ЕСЛИ ИНОЕ НЕ ПРЕДУСМОТРЕНО ДЕЙСТВУЮЩИМ ЗАКОНОДАТЕЛЬСТВОМ ИЛИ СОГЛАШЕНИЕМ СТОРОН,
|
|
||||||
ЗАКЛЮЧЕННЫМ В ПИСЬМЕННОЙ ФОРМЕ, ПРАВООБЛАДАТЕЛЬ ИЛИ ИНОЕ ЛИЦО, КОТОРОЕ ВНОСИТ
|
|
||||||
ИЗМЕНЕНИЯ В ПРОГРАММУ И (ИЛИ) ПЕРЕДАЕТ ЕЁ НА УСЛОВИЯХ, СФОРМУЛИРОВАННЫХ ВЫШЕ, НЕ
|
|
||||||
МОЖЕТ НЕСТИ ОТВЕТСТВЕННОСТЬ ПЕРЕД ВАМИ ЗА ПРИЧИНЕННЫЙ УЩЕРБ, ВКЛЮЧАЯ УЩЕРБ
|
|
||||||
ОБЩЕГО ЛИБО КОНКРЕТНОГО ХАРАКТЕРА, ПРИЧИНЕННЫЙ СЛУЧАЙНО ИЛИ ЯВЛЯЮЩИЙСЯ
|
|
||||||
СЛЕДСТВИЕМ ИСПОЛЬЗОВАНИЯ ПРОГРАММЫ ЛИБО НЕВОЗМОЖНОСТИ ЕЁ ИСПОЛЬЗОВАНИЯ (В ТОМ
|
|
||||||
ЧИСЛЕ ЗА УНИЧТОЖЕНИЕ ИЛИ МОДИФИКАЦИЮ ИНФОРМАЦИИ, ЛИБО УБЫТКИ, ПОНЕСЕННЫЕ ВАМИ
|
|
||||||
ИЛИ ТРЕТЬИМИ ЛИЦАМИ, ЛИБО СБОИ ПРОГРАММЫ ПРИ ВЗАИМОДЕЙСТВИИ С ДРУГИМ ПРОГРАММНЫМ
|
|
||||||
ОБЕСПЕЧЕНИЕМ), В ТОМ ЧИСЛЕ И В СЛУЧАЯХ, КОГДА ПРАВООБЛАДАТЕЛЬ ИЛИ ТРЕТЬЕ ЛИЦО
|
|
||||||
ПРЕДУПРЕЖДЕНЫ О ВОЗМОЖНОСТИ ПРИЧИНЕНИЯ ТАКИХ УБЫТКОВ.
|
|
||||||
|
|
||||||
17. Толкование разделов 15 и 16.
|
|
||||||
|
|
||||||
Если отказ от гарантии и ограничение ответственности, представленные выше, по
|
|
||||||
закону не могут быть применены в соответствии с их условиями, суды,
|
|
||||||
рассматривающие спор, должны применить действующий закон, который в наибольшей
|
|
||||||
степени предусматривает абсолютный отказ от всей гражданской ответственности в
|
|
||||||
связи с Программой, за исключением случаев, когда гарантия или принятие на себя
|
|
||||||
ответственности за копию программы предоставляется за плату.
|
|
||||||
|
|
||||||
КОНЕЦ ОПРЕДЕЛЕНИЙ И УСЛОВИЙ
|
|
||||||
|
|
||||||
Порядок применения условий Лицензии к Вашим программам
|
|
||||||
|
|
||||||
Если Вы разрабатываете новую программу и хотите, чтобы её использование принесло
|
|
||||||
максимальную пользу обществу, наилучший способ достичь этого -- сделать её
|
|
||||||
свободной, чтобы все могли распространять и изменять её на условиях настоящей
|
|
||||||
Лицензии.
|
|
||||||
|
|
||||||
Для этого сделайте так, чтобы программа содержала в себе описанные ниже
|
|
||||||
уведомления. Самым надежным способом это сделать является включение их в начало
|
|
||||||
каждого файла исходного текста, чтобы наиболее эффективным образом сообщить об
|
|
||||||
отсутствии гарантий; каждый файл должен иметь по меньшей мере одну строку с
|
|
||||||
оповещением об авторских правах и указанием на то, где находится полный текст
|
|
||||||
уведомлений.
|
|
||||||
|
|
||||||
<Строка с названием Программы и информацией о её назначении.>
|
|
||||||
Copyright © <год выпуска программы в свет> <имя автора>
|
|
||||||
|
|
||||||
Эта программа является свободным программным обеспечением: Вы можете
|
|
||||||
распространять её и (или) изменять, соблюдая условия Сетевой Публичной
|
|
||||||
Лицензии Vitastor, опубликованной автором Vitastor, либо редакции 1.1
|
|
||||||
Лицензии, либо (на Ваше усмотрение) любой редакции, выпущенной позже.
|
|
||||||
|
|
||||||
Эта программа распространяется в расчете на то, что она окажется полезной,
|
|
||||||
но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, включая подразумеваемую гарантию КАЧЕСТВА либо
|
|
||||||
ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Ознакомьтесь с Сетевой Публичной
|
|
||||||
Лицензией Vitastor для получения более подробной информации.
|
|
||||||
|
|
||||||
Также добавьте информацию о том, как связаться с Вами посредством электронной
|
|
||||||
или обычной почты.
|
|
||||||
|
|
||||||
Если ваша программа взаимодействует с пользователями удаленно через
|
|
||||||
компьютерную сеть, Вы также должны убедиться, что обеспечили её пользователям
|
|
||||||
возможность получить её исходные тексты. Например, если Ваша программа является
|
|
||||||
веб-приложением, её интерфейс может отображать ссылку "Исходные коды", которая
|
|
||||||
указывает на архив с текстом. Существует много способов, которыми Вы можете
|
|
||||||
распространять исходные тексты, для разных программ подходят разные решения;
|
|
||||||
ознакомьтесь с разделом 13 для того, чтобы узнать конкретные требования.
|
|
|
@ -61,7 +61,7 @@ modification follow.
|
||||||
|
|
||||||
0. Definitions.
|
0. Definitions.
|
||||||
|
|
||||||
"This License" refers to version 1.1 of the Vitastor Network Public License.
|
"This License" refers to version 1 of the Vitastor Network Public License.
|
||||||
|
|
||||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||||
works, such as semiconductor masks.
|
works, such as semiconductor masks.
|
||||||
|
@ -629,7 +629,7 @@ the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the Vitastor Network Public License as published by
|
it under the terms of the Vitastor Network Public License as published by
|
||||||
the Vitastor Author, either version 1.1 of the License, or
|
the Vitastor Author, either version 1 of the License, or
|
||||||
(at your option) any later version.
|
(at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
|
|
|
@ -33,5 +33,5 @@ Vitastor Network Public License 1.1, основанная на GNU GPL 3.0 с д
|
||||||
и также на условиях GNU GPL 2.0 или более поздней версии. Так сделано в целях
|
и также на условиях GNU GPL 2.0 или более поздней версии. Так сделано в целях
|
||||||
совместимости с таким ПО, как QEMU и fio.
|
совместимости с таким ПО, как QEMU и fio.
|
||||||
|
|
||||||
Вы можете найти полный текст VNPL 1.1 на английском языке в файле [VNPL-1.1.txt](../../VNPL-1.1.txt),
|
Вы можете найти полный текст VNPL 1.1 в файле [VNPL-1.1.txt](../../VNPL-1.1.txt),
|
||||||
VNPL 1.1 на русском языке в файле [VNPL-1.1-RU.txt](../../VNPL-1.1-RU.txt), а GPL 2.0 в файле [GPL-2.0.txt](../../GPL-2.0.txt).
|
а GPL 2.0 в файле [GPL-2.0.txt](../../GPL-2.0.txt).
|
||||||
|
|
|
@ -200,7 +200,7 @@ add_executable(vitastor-dump-journal
|
||||||
|
|
||||||
# vitastor-dump-meta
|
# vitastor-dump-meta
|
||||||
add_executable(vitastor-dump-meta
|
add_executable(vitastor-dump-meta
|
||||||
dump_meta.cpp rw_blocking.cpp
|
dump_meta.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
if (${WITH_QEMU})
|
if (${WITH_QEMU})
|
||||||
|
|
|
@ -90,13 +90,13 @@
|
||||||
#include "blockstore_journal.h"
|
#include "blockstore_journal.h"
|
||||||
|
|
||||||
// "VITAstor"
|
// "VITAstor"
|
||||||
#define BLOCKSTORE_META_MAGIC_V1 0x726F747341544956l
|
#define BLOCKSTORE_META_MAGIC 0x726F747341544956l
|
||||||
#define BLOCKSTORE_META_VERSION_V1 1
|
#define BLOCKSTORE_META_VERSION 1
|
||||||
|
|
||||||
// metadata header (superblock)
|
// metadata header (superblock)
|
||||||
// FIXME: After adding the OSD superblock, add a key to metadata
|
// FIXME: After adding the OSD superblock, add a key to metadata
|
||||||
// and journal headers to check if they belong to the same OSD
|
// and journal headers to check if they belong to the same OSD
|
||||||
struct __attribute__((__packed__)) blockstore_meta_header_v1_t
|
struct __attribute__((__packed__)) blockstore_meta_header_t
|
||||||
{
|
{
|
||||||
uint64_t zero;
|
uint64_t zero;
|
||||||
uint64_t magic;
|
uint64_t magic;
|
||||||
|
|
|
@ -71,10 +71,10 @@ resume_1:
|
||||||
if (iszero((uint64_t*)metadata_buffer, bs->meta_block_size / sizeof(uint64_t)))
|
if (iszero((uint64_t*)metadata_buffer, bs->meta_block_size / sizeof(uint64_t)))
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
blockstore_meta_header_v1_t *hdr = (blockstore_meta_header_v1_t *)metadata_buffer;
|
blockstore_meta_header_t *hdr = (blockstore_meta_header_t *)metadata_buffer;
|
||||||
hdr->zero = 0;
|
hdr->zero = 0;
|
||||||
hdr->magic = BLOCKSTORE_META_MAGIC_V1;
|
hdr->magic = BLOCKSTORE_META_MAGIC;
|
||||||
hdr->version = BLOCKSTORE_META_VERSION_V1;
|
hdr->version = BLOCKSTORE_META_VERSION;
|
||||||
hdr->meta_block_size = bs->meta_block_size;
|
hdr->meta_block_size = bs->meta_block_size;
|
||||||
hdr->data_block_size = bs->block_size;
|
hdr->data_block_size = bs->block_size;
|
||||||
hdr->bitmap_granularity = bs->bitmap_granularity;
|
hdr->bitmap_granularity = bs->bitmap_granularity;
|
||||||
|
@ -103,10 +103,10 @@ resume_1:
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
blockstore_meta_header_v1_t *hdr = (blockstore_meta_header_v1_t *)metadata_buffer;
|
blockstore_meta_header_t *hdr = (blockstore_meta_header_t *)metadata_buffer;
|
||||||
if (hdr->zero != 0 ||
|
if (hdr->zero != 0 ||
|
||||||
hdr->magic != BLOCKSTORE_META_MAGIC_V1 ||
|
hdr->magic != BLOCKSTORE_META_MAGIC ||
|
||||||
hdr->version != BLOCKSTORE_META_VERSION_V1)
|
hdr->version != BLOCKSTORE_META_VERSION)
|
||||||
{
|
{
|
||||||
printf(
|
printf(
|
||||||
"Metadata is corrupt or old version.\n"
|
"Metadata is corrupt or old version.\n"
|
||||||
|
|
|
@ -3,18 +3,45 @@
|
||||||
|
|
||||||
#define _LARGEFILE64_SOURCE
|
#define _LARGEFILE64_SOURCE
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/time.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
#include <linux/fs.h>
|
||||||
|
#include <string.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "blockstore_impl.h"
|
#include "object_id.h"
|
||||||
#include "osd_id.h"
|
#include "osd_id.h"
|
||||||
#include "rw_blocking.h"
|
|
||||||
|
// "VITAstor"
|
||||||
|
#define BLOCKSTORE_META_MAGIC_V1 0x726F747341544956l
|
||||||
|
#define BLOCKSTORE_META_VERSION_V1 1
|
||||||
|
|
||||||
|
#define DIRECT_IO_ALIGNMENT 512
|
||||||
|
#define MEM_ALIGNMENT 4096
|
||||||
|
|
||||||
|
struct __attribute__((__packed__)) clean_disk_entry_v0_t
|
||||||
|
{
|
||||||
|
object_id oid;
|
||||||
|
uint64_t version;
|
||||||
|
uint8_t bitmap[];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct __attribute__((__packed__)) blockstore_meta_header_v1_t
|
||||||
|
{
|
||||||
|
uint64_t zero;
|
||||||
|
uint64_t magic;
|
||||||
|
uint64_t version;
|
||||||
|
uint32_t meta_block_size;
|
||||||
|
uint32_t data_block_size;
|
||||||
|
uint32_t bitmap_granularity;
|
||||||
|
};
|
||||||
|
|
||||||
struct meta_dumper_t
|
struct meta_dumper_t
|
||||||
{
|
{
|
||||||
|
@ -24,8 +51,6 @@ struct meta_dumper_t
|
||||||
uint64_t meta_len;
|
uint64_t meta_len;
|
||||||
uint64_t meta_pos;
|
uint64_t meta_pos;
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
int dump();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
|
@ -41,129 +66,108 @@ int main(int argc, char *argv[])
|
||||||
self.meta_block_size = strtoul(argv[b+1], NULL, 10);
|
self.meta_block_size = strtoul(argv[b+1], NULL, 10);
|
||||||
self.meta_offset = strtoull(argv[b+2], NULL, 10);
|
self.meta_offset = strtoull(argv[b+2], NULL, 10);
|
||||||
self.meta_len = strtoull(argv[b+3], NULL, 10);
|
self.meta_len = strtoull(argv[b+3], NULL, 10);
|
||||||
return self.dump();
|
if (self.meta_block_size % DIRECT_IO_ALIGNMENT)
|
||||||
}
|
|
||||||
|
|
||||||
int meta_dumper_t::dump()
|
|
||||||
{
|
|
||||||
if (this->meta_block_size % DIRECT_IO_ALIGNMENT)
|
|
||||||
{
|
{
|
||||||
printf("Invalid metadata block size\n");
|
printf("Invalid metadata block size\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
this->fd = open(this->meta_device, O_DIRECT|O_RDONLY);
|
self.fd = open(self.meta_device, O_DIRECT|O_RDONLY);
|
||||||
if (this->fd == -1)
|
if (self.fd == -1)
|
||||||
{
|
{
|
||||||
printf("Failed to open metadata device\n");
|
printf("Failed to open metadata device\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
int buf_size = 1024*1024;
|
// Read all metadata into memory
|
||||||
if (buf_size % this->meta_block_size)
|
void *data = memalign(MEM_ALIGNMENT, self.meta_len);
|
||||||
buf_size = 8*this->meta_block_size;
|
if (!data)
|
||||||
if (buf_size > this->meta_len)
|
{
|
||||||
buf_size = this->meta_len;
|
printf("Failed to allocate %lu MB of memory\n", self.meta_len/1024/1024);
|
||||||
void *data = memalign_or_die(MEM_ALIGNMENT, buf_size);
|
close(self.fd);
|
||||||
lseek64(this->fd, this->meta_offset, 0);
|
return 1;
|
||||||
read_blocking(this->fd, data, buf_size);
|
}
|
||||||
|
while (self.meta_pos < self.meta_len)
|
||||||
|
{
|
||||||
|
int r = pread(self.fd, data+self.meta_pos, self.meta_len-self.meta_pos, self.meta_offset+self.meta_pos);
|
||||||
|
assert(r > 0);
|
||||||
|
self.meta_pos += r;
|
||||||
|
}
|
||||||
|
close(self.fd);
|
||||||
// Check superblock
|
// Check superblock
|
||||||
blockstore_meta_header_v1_t *hdr = (blockstore_meta_header_v1_t *)data;
|
blockstore_meta_header_v1_t *hdr = (blockstore_meta_header_v1_t *)data;
|
||||||
if (hdr->zero == 0 &&
|
if (hdr->zero == 0 &&
|
||||||
hdr->magic == BLOCKSTORE_META_MAGIC_V1 &&
|
hdr->magic == BLOCKSTORE_META_MAGIC_V1 &&
|
||||||
hdr->version == BLOCKSTORE_META_VERSION_V1)
|
hdr->version == BLOCKSTORE_META_VERSION_V1)
|
||||||
{
|
{
|
||||||
// Vitastor 0.6-0.7 - static array of clean_disk_entry with bitmaps
|
// Vitastor 0.6-0.7 - static array of clean_disk_entry_v0_t with bitmaps
|
||||||
if (hdr->meta_block_size != this->meta_block_size)
|
if (hdr->meta_block_size != self.meta_block_size)
|
||||||
{
|
{
|
||||||
printf("Using block size of %u bytes based on information from the superblock\n", hdr->meta_block_size);
|
printf("Using block size %u bytes based on information from the superblock\n", hdr->meta_block_size);
|
||||||
this->meta_block_size = hdr->meta_block_size;
|
self.meta_block_size = hdr->meta_block_size;
|
||||||
if (buf_size % this->meta_block_size)
|
|
||||||
{
|
|
||||||
buf_size = 8*this->meta_block_size;
|
|
||||||
free(data);
|
|
||||||
data = memalign_or_die(MEM_ALIGNMENT, buf_size);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
this->meta_offset += this->meta_block_size;
|
|
||||||
this->meta_len -= this->meta_block_size;
|
|
||||||
uint64_t clean_entry_bitmap_size = hdr->data_block_size / hdr->bitmap_granularity / 8;
|
uint64_t clean_entry_bitmap_size = hdr->data_block_size / hdr->bitmap_granularity / 8;
|
||||||
uint64_t clean_entry_size = sizeof(clean_disk_entry) + 2*clean_entry_bitmap_size;
|
uint64_t clean_entry_size = sizeof(clean_disk_entry_v0_t) + 2*clean_entry_bitmap_size;
|
||||||
uint64_t block_num = 0;
|
uint64_t block_num = 0;
|
||||||
printf(
|
printf(
|
||||||
"{\"version\":\"0.6\",\"meta_block_size\":%u,\"data_block_size\":%u,\"bitmap_granularity\":%u,\"entries\":[\n",
|
"{\"version\":\"0.6\",\"meta_block_size\":%u,\"data_block_size\":%u,\"bitmap_granularity\":%u,\"entries\":[\n",
|
||||||
hdr->meta_block_size, hdr->data_block_size, hdr->bitmap_granularity
|
hdr->meta_block_size, hdr->data_block_size, hdr->bitmap_granularity
|
||||||
);
|
);
|
||||||
bool first = true;
|
bool first = true;
|
||||||
lseek64(this->fd, this->meta_offset, 0);
|
for (uint64_t meta_pos = self.meta_block_size; meta_pos < self.meta_len; meta_pos += self.meta_block_size)
|
||||||
while (this->meta_pos < this->meta_len)
|
|
||||||
{
|
{
|
||||||
uint64_t read_len = buf_size < this->meta_len-this->meta_pos ? buf_size : this->meta_len-this->meta_pos;
|
for (uint64_t ioff = 0; ioff < self.meta_block_size-clean_entry_size; ioff += clean_entry_size, block_num++)
|
||||||
read_blocking(this->fd, data, read_len);
|
|
||||||
this->meta_pos += read_len;
|
|
||||||
for (uint64_t blk = 0; blk < read_len; blk += this->meta_block_size)
|
|
||||||
{
|
{
|
||||||
for (uint64_t ioff = 0; ioff < this->meta_block_size-clean_entry_size; ioff += clean_entry_size, block_num++)
|
clean_disk_entry_v0_t *entry = (clean_disk_entry_v0_t*)(data + meta_pos + ioff);
|
||||||
|
if (entry->oid.inode)
|
||||||
{
|
{
|
||||||
clean_disk_entry *entry = (clean_disk_entry*)(data + blk + ioff);
|
printf(
|
||||||
if (entry->oid.inode)
|
|
||||||
{
|
|
||||||
printf(
|
|
||||||
#define ENTRY_FMT "{\"block\":%lu,\"pool\":%u,\"inode\":%lu,\"stripe\":%lu,\"version\":%lu,\"bitmap\":\""
|
#define ENTRY_FMT "{\"block\":%lu,\"pool\":%u,\"inode\":%lu,\"stripe\":%lu,\"version\":%lu,\"bitmap\":\""
|
||||||
(first ? ENTRY_FMT : (",\n" ENTRY_FMT)),
|
(first ? (",\n" ENTRY_FMT) : ENTRY_FMT),
|
||||||
#undef ENTRY_FMT
|
#undef ENTRY_FMT
|
||||||
block_num, INODE_POOL(entry->oid.inode), INODE_NO_POOL(entry->oid.inode),
|
block_num, INODE_POOL(entry->oid.inode), INODE_NO_POOL(entry->oid.inode),
|
||||||
entry->oid.stripe, entry->version
|
entry->oid.stripe, entry->version
|
||||||
);
|
);
|
||||||
first = false;
|
first = false;
|
||||||
for (uint64_t i = 0; i < clean_entry_bitmap_size; i++)
|
for (uint64_t i = 0; i < clean_entry_bitmap_size; i++)
|
||||||
{
|
{
|
||||||
printf("%02x", entry->bitmap[i]);
|
printf("%02x", entry->bitmap[i]);
|
||||||
}
|
|
||||||
printf("\",\"ext_bitmap\":\"");
|
|
||||||
for (uint64_t i = 0; i < clean_entry_bitmap_size; i++)
|
|
||||||
{
|
|
||||||
printf("%02x", entry->bitmap[clean_entry_bitmap_size + i]);
|
|
||||||
}
|
|
||||||
printf("\"}");
|
|
||||||
}
|
}
|
||||||
|
printf("\",\"ext_bitmap\":\"");
|
||||||
|
for (uint64_t i = 0; i < clean_entry_bitmap_size; i++)
|
||||||
|
{
|
||||||
|
printf("%02x", entry->bitmap[clean_entry_bitmap_size + i]);
|
||||||
|
}
|
||||||
|
printf("\"}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printf("\n]}\n");
|
printf("]}\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Vitastor 0.4-0.5 - static array of clean_disk_entry
|
// Vitastor 0.4-0.5 - static array of clean_disk_entry_v0_t
|
||||||
uint64_t clean_entry_size = sizeof(clean_disk_entry);
|
uint64_t clean_entry_size = sizeof(clean_disk_entry_v0_t);
|
||||||
uint64_t block_num = 0;
|
uint64_t block_num = 0;
|
||||||
printf("{\"version\":\"0.5\",\"meta_block_size\":%u,\"entries\":[\n", this->meta_block_size);
|
printf("{\"version\":\"0.5\",\"meta_block_size\":%u,\"entries\":[\n", self.meta_block_size);
|
||||||
bool first = true;
|
bool first = true;
|
||||||
while (this->meta_pos < this->meta_len)
|
for (uint64_t meta_pos = 0; meta_pos < self.meta_len; meta_pos += self.meta_block_size)
|
||||||
{
|
{
|
||||||
uint64_t read_len = buf_size < this->meta_len-this->meta_pos ? buf_size : this->meta_len-this->meta_pos;
|
for (uint64_t ioff = 0; ioff < self.meta_block_size-clean_entry_size; ioff += clean_entry_size, block_num++)
|
||||||
read_blocking(this->fd, data, read_len);
|
|
||||||
this->meta_pos += read_len;
|
|
||||||
for (uint64_t blk = 0; blk < read_len; blk += this->meta_block_size)
|
|
||||||
{
|
{
|
||||||
for (uint64_t ioff = 0; ioff < this->meta_block_size-clean_entry_size; ioff += clean_entry_size, block_num++)
|
clean_disk_entry_v0_t *entry = (clean_disk_entry_v0_t*)(data + meta_pos + ioff);
|
||||||
|
if (entry->oid.inode)
|
||||||
{
|
{
|
||||||
clean_disk_entry *entry = (clean_disk_entry*)(data + blk + ioff);
|
printf(
|
||||||
if (entry->oid.inode)
|
|
||||||
{
|
|
||||||
printf(
|
|
||||||
#define ENTRY_FMT "{\"block\":%lu,\"pool\":%u,\"inode\":%lu,\"stripe\":%lu,\"version\":%lu}"
|
#define ENTRY_FMT "{\"block\":%lu,\"pool\":%u,\"inode\":%lu,\"stripe\":%lu,\"version\":%lu}"
|
||||||
(first ? ENTRY_FMT : (",\n" ENTRY_FMT)),
|
(first ? (",\n" ENTRY_FMT) : ENTRY_FMT),
|
||||||
#undef ENTRY_FMT
|
#undef ENTRY_FMT
|
||||||
block_num, INODE_POOL(entry->oid.inode), INODE_NO_POOL(entry->oid.inode),
|
block_num, INODE_POOL(entry->oid.inode), INODE_NO_POOL(entry->oid.inode),
|
||||||
entry->oid.stripe, entry->version
|
entry->oid.stripe, entry->version
|
||||||
);
|
);
|
||||||
first = false;
|
first = false;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
printf("\n]}\n");
|
printf("]}\n");
|
||||||
}
|
}
|
||||||
free(data);
|
free(data);
|
||||||
close(this->fd);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
mat: mat.c
|
||||||
|
gcc -O3 -I/usr/include/jerasure -o mat mat.c -lJerasure
|
|
@ -0,0 +1,291 @@
|
||||||
|
#include <jerasure/reed_sol.h>
|
||||||
|
#include <jerasure.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
// Generate LRC matrix: (groups*local + global) code rows with (data_drives) columns
|
||||||
|
// w should be >= log2(data_drives + groups*local + global), but not necessary 8/16/32
|
||||||
|
int* reed_sol_vandermonde_lrc_matrix(int data_drives, int groups, int local, int global, int w)
|
||||||
|
{
|
||||||
|
if (w < 0 || w > 32 || data_drives + groups*local + global > (1<<w))
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
int *lrc_matrix = (int*)malloc(sizeof(int) * (local*groups+global));
|
||||||
|
int *matrix = reed_sol_vandermonde_coding_matrix(data_drives, local+global, w);
|
||||||
|
// Enough to transform LRC 8+2+2 GF(8) matrix into MR-LRC
|
||||||
|
//for (int i = 0; i < local+global; i++)
|
||||||
|
//{
|
||||||
|
// int t = matrix[i*data_drives + 3];
|
||||||
|
// matrix[i*data_drives + 3] = matrix[i*data_drives + 7];
|
||||||
|
// matrix[i*data_drives + 7] = t;
|
||||||
|
//}
|
||||||
|
for (int gr = 0; gr < groups; gr++)
|
||||||
|
{
|
||||||
|
for (int l = 0; l < local; l++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < data_drives; j++)
|
||||||
|
{
|
||||||
|
lrc_matrix[(gr*local+l)*data_drives + j] = (j / (data_drives/groups)) == gr ? matrix[l*data_drives + j] : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (int i = 0; i < global; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < data_drives; j++)
|
||||||
|
{
|
||||||
|
lrc_matrix[(groups*local+i)*data_drives + j] = matrix[(local+i)*data_drives + j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(matrix);
|
||||||
|
return lrc_matrix;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct lrc_test_result_t
|
||||||
|
{
|
||||||
|
int success, impossible, failures;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Check if the generated LRC with given parameters is Maximally Reconstructible (MR-LRC)
|
||||||
|
// Example of a MR-LRC: (8, 2, 1, 2, 6, 8)
|
||||||
|
struct lrc_test_result_t check_mr_lrc(int *lrc_matrix, int data_drives, int groups, int local, int global, int w, int log_level)
|
||||||
|
{
|
||||||
|
int n = data_drives;
|
||||||
|
int total_rows = n + groups*local + global;
|
||||||
|
int impossible = 0, success = 0, failures = 0;
|
||||||
|
int *lost_per_group = (int*)malloc(sizeof(int) * groups);
|
||||||
|
int *recovered_per_group = (int*)malloc(sizeof(int) * groups);
|
||||||
|
int *selected_inverted = (int*)malloc(sizeof(int) * data_drives);
|
||||||
|
// global+1 is always recoverable
|
||||||
|
for (int lost = global+2; lost <= groups*local+global; lost++)
|
||||||
|
{
|
||||||
|
int *erased_matrix = (int*)malloc(sizeof(int) * (total_rows-lost)*n);
|
||||||
|
int *inverted_matrix = (int*)malloc(sizeof(int) * (total_rows-lost)*n);
|
||||||
|
int *p = (int*)malloc(sizeof(int) * (total_rows-lost));
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
p[i] = i;
|
||||||
|
int *p2 = (int*)malloc(sizeof(int) * n);
|
||||||
|
if (total_rows-lost > n)
|
||||||
|
{
|
||||||
|
p[n-1] = n; // skip combinations with all N data disks (0..n-1)
|
||||||
|
for (int i = n; i < total_rows-lost; i++)
|
||||||
|
p[i] = i+1;
|
||||||
|
p[total_rows-lost-1]--; // will be incremented on the first step
|
||||||
|
}
|
||||||
|
int inc = total_rows-lost-1;
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
p[inc]++;
|
||||||
|
if (p[inc] >= n+groups*local+global)
|
||||||
|
{
|
||||||
|
if (inc == 0)
|
||||||
|
break;
|
||||||
|
inc--;
|
||||||
|
}
|
||||||
|
else if (inc+1 < total_rows-lost)
|
||||||
|
{
|
||||||
|
p[inc+1] = p[inc];
|
||||||
|
inc++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Check if it should be recoverable
|
||||||
|
// Calculate count of data chunks lost in each group
|
||||||
|
int nsel = 0;
|
||||||
|
for (int gr = 0; gr < groups; gr++)
|
||||||
|
{
|
||||||
|
lost_per_group[gr] = ((gr+1)*(n/groups) > n ? (n - gr*(n/groups)) : n/groups);
|
||||||
|
recovered_per_group[gr] = 0;
|
||||||
|
}
|
||||||
|
for (int j = 0; j < total_rows-lost; j++)
|
||||||
|
{
|
||||||
|
if (p[j] < n)
|
||||||
|
{
|
||||||
|
lost_per_group[(p[j] / (n/groups))]--;
|
||||||
|
selected_inverted[nsel++] = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Every local parity chunk is supposed to restore 1 missing chunk inside its group
|
||||||
|
// So, subtract local parity chunk counts from each group lost chunk count
|
||||||
|
for (int j = 0; j < total_rows-lost; j++)
|
||||||
|
{
|
||||||
|
if (p[j] >= n && p[j] < n+groups*local)
|
||||||
|
{
|
||||||
|
int gr = (p[j]-n)/local;
|
||||||
|
if (lost_per_group[gr] > recovered_per_group[gr] && nsel < n)
|
||||||
|
{
|
||||||
|
selected_inverted[nsel++] = j;
|
||||||
|
}
|
||||||
|
recovered_per_group[gr]++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Every global parity chunk is supposed to restore 1 chunk of all that are still missing
|
||||||
|
int still_missing = 0;
|
||||||
|
for (int gr = 0; gr < groups; gr++)
|
||||||
|
{
|
||||||
|
int non_fixed = lost_per_group[gr] - recovered_per_group[gr];
|
||||||
|
still_missing += (non_fixed > 0 ? non_fixed : 0);
|
||||||
|
}
|
||||||
|
for (int j = 0; j < total_rows-lost; j++)
|
||||||
|
{
|
||||||
|
if (p[j] >= n+groups*local)
|
||||||
|
{
|
||||||
|
if (still_missing > 0 && nsel < n)
|
||||||
|
{
|
||||||
|
selected_inverted[nsel++] = j;
|
||||||
|
}
|
||||||
|
still_missing--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (still_missing <= 0)
|
||||||
|
{
|
||||||
|
// We hope it can be recoverable. Try to invert it
|
||||||
|
assert(nsel == n);
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < n; j++)
|
||||||
|
{
|
||||||
|
erased_matrix[i*n+j] = lrc_matrix[p[selected_inverted[i]]*n+j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int invert_ok = jerasure_invert_matrix(erased_matrix, inverted_matrix, n, w);
|
||||||
|
if (invert_ok < 0)
|
||||||
|
{
|
||||||
|
failures++;
|
||||||
|
if (log_level > 0)
|
||||||
|
{
|
||||||
|
printf("\nFAIL: ");
|
||||||
|
for (int i = 0; i < total_rows-lost; i++)
|
||||||
|
{
|
||||||
|
printf("%d ", p[i]);
|
||||||
|
}
|
||||||
|
printf("\nDIRECT:\n");
|
||||||
|
for (int i = 0; i < total_rows-lost; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < n; j++)
|
||||||
|
printf("%d ", lrc_matrix[p[i]*n+j]);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
printf("INVERSE:\n");
|
||||||
|
for (int i = 0; i < total_rows-lost; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < n; j++)
|
||||||
|
printf("%d ", inverted_matrix[i*n+j]);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
success++;
|
||||||
|
if (log_level > 2)
|
||||||
|
{
|
||||||
|
printf("OK: ");
|
||||||
|
for (int i = 0; i < total_rows-lost; i++)
|
||||||
|
{
|
||||||
|
printf("%d ", p[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
impossible++;
|
||||||
|
if (log_level > 1)
|
||||||
|
{
|
||||||
|
printf("IMPOSSIBLE: ");
|
||||||
|
for (int i = 0; i < total_rows-lost; i++)
|
||||||
|
{
|
||||||
|
printf("%d ", p[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(p2);
|
||||||
|
free(p);
|
||||||
|
free(inverted_matrix);
|
||||||
|
free(erased_matrix);
|
||||||
|
}
|
||||||
|
free(lost_per_group);
|
||||||
|
free(recovered_per_group);
|
||||||
|
return (struct lrc_test_result_t){
|
||||||
|
.success = success,
|
||||||
|
.impossible = impossible,
|
||||||
|
.failures = failures,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int W = 8, MATRIX_W = 8;
|
||||||
|
int n = 8, groups = 2, local = 1, global = 2;
|
||||||
|
//n = 4, groups = 2, local = 1, global = 1;
|
||||||
|
int total_rows = n+groups*local+global;
|
||||||
|
int *matrix = reed_sol_vandermonde_lrc_matrix(n, groups, local, global, MATRIX_W);
|
||||||
|
int *lrc_matrix = (int*)malloc(sizeof(int) * total_rows*n);
|
||||||
|
// Fill identity+LRC matrix
|
||||||
|
for (int i = 0; i < n; i++)
|
||||||
|
for (int j = 0; j < n; j++)
|
||||||
|
lrc_matrix[i*n + j] = j == i ? 1 : 0;
|
||||||
|
memcpy(lrc_matrix + n*n, matrix, (total_rows-n)*n*sizeof(int));
|
||||||
|
free(matrix);
|
||||||
|
matrix = NULL;
|
||||||
|
// Print LRC matrix
|
||||||
|
for (int i = 0; i < total_rows; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < n; j++)
|
||||||
|
{
|
||||||
|
printf("%d ", lrc_matrix[i*n+j]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
struct lrc_test_result_t t = check_mr_lrc(lrc_matrix, n, groups, local, global, W, 1);
|
||||||
|
printf("\n%d recovered, %d impossible, %d failures\n", t.success, t.impossible, t.failures);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1 1 1 1 0 0 0 0
|
||||||
|
// 0 0 0 0 1 1 1 1
|
||||||
|
// 1 55 39 73 84 181 225 217
|
||||||
|
// 1 172 70 235 143 34 200 101
|
||||||
|
//
|
||||||
|
// Can't recover
|
||||||
|
// 1 2 4 5 8 9 10 11 -1
|
||||||
|
// 2 3 4 6 8 9 10 11 -1
|
||||||
|
// FULL:
|
||||||
|
// 1 0 0 0 0 0 0 0
|
||||||
|
// 0 1 0 0 0 0 0 0
|
||||||
|
// 0 0 1 0 0 0 0 0
|
||||||
|
// 0 0 0 1 0 0 0 0
|
||||||
|
// 0 0 0 0 1 0 0 0
|
||||||
|
// 0 0 0 0 0 1 0 0
|
||||||
|
// 0 0 0 0 0 0 1 0
|
||||||
|
// 0 0 0 0 0 0 0 1
|
||||||
|
// 1 1 1 1 0 0 0 0
|
||||||
|
// 0 0 0 0 1 1 1 1
|
||||||
|
// 1 55 39 73 84 181 225 217
|
||||||
|
// 1 172 70 235 143 34 200 101
|
||||||
|
// FIRST UNRECOVERABLE:
|
||||||
|
// 0 1 0 0 0 0 0 0
|
||||||
|
// 0 0 1 0 0 0 0 0
|
||||||
|
// 0 0 0 0 1 0 0 0
|
||||||
|
// 0 0 0 0 0 1 0 0
|
||||||
|
// 1 1 1 1 0 0 0 0
|
||||||
|
// 0 0 0 0 1 1 1 1
|
||||||
|
// 1 55 39 73 84 181 225 217
|
||||||
|
// 1 172 70 235 143 34 200 101
|
||||||
|
// SECOND UNRECOVERABLE:
|
||||||
|
// 0 0 1 0 0 0 0 0
|
||||||
|
// 0 0 0 1 0 0 0 0
|
||||||
|
// 0 0 0 0 1 0 0 0
|
||||||
|
// 0 0 0 0 0 0 1 0
|
||||||
|
// 1 1 1 1 0 0 0 0
|
||||||
|
// 0 0 0 0 1 1 1 1
|
||||||
|
// 1 55 39 73 84 181 225 217
|
||||||
|
// 1 172 70 235 143 34 200 101
|
||||||
|
// Ho ho ho
|
Loading…
Reference in New Issue