forked from vitalif/vitastor
Compare commits
4 Commits
lrc-matrix
...
master
Author | SHA1 | Date |
---|---|---|
Vitaliy Filippov | d29b5d2d04 | |
Vitaliy Filippov | 65b0e8e940 | |
Vitaliy Filippov | bce357e2a5 | |
Vitaliy Filippov | 0876ca09cd |
|
@ -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),
|
||||||
а GPL 2.0 в файле [GPL-2.0.txt](GPL-2.0.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).
|
||||||
|
|
|
@ -0,0 +1,680 @@
|
||||||
|
СЕТЕВАЯ ПУБЛИЧНАЯ ЛИЦЕНЗИЯ 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 of the Vitastor Network Public License.
|
"This License" refers to version 1.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 of the License, or
|
the Vitastor Author, either version 1.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),
|
||||||
а GPL 2.0 в файле [GPL-2.0.txt](../../GPL-2.0.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).
|
||||||
|
|
|
@ -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
|
dump_meta.cpp rw_blocking.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 0x726F747341544956l
|
#define BLOCKSTORE_META_MAGIC_V1 0x726F747341544956l
|
||||||
#define BLOCKSTORE_META_VERSION 1
|
#define BLOCKSTORE_META_VERSION_V1 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_t
|
struct __attribute__((__packed__)) blockstore_meta_header_v1_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_t *hdr = (blockstore_meta_header_t *)metadata_buffer;
|
blockstore_meta_header_v1_t *hdr = (blockstore_meta_header_v1_t *)metadata_buffer;
|
||||||
hdr->zero = 0;
|
hdr->zero = 0;
|
||||||
hdr->magic = BLOCKSTORE_META_MAGIC;
|
hdr->magic = BLOCKSTORE_META_MAGIC_V1;
|
||||||
hdr->version = BLOCKSTORE_META_VERSION;
|
hdr->version = BLOCKSTORE_META_VERSION_V1;
|
||||||
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_t *hdr = (blockstore_meta_header_t *)metadata_buffer;
|
blockstore_meta_header_v1_t *hdr = (blockstore_meta_header_v1_t *)metadata_buffer;
|
||||||
if (hdr->zero != 0 ||
|
if (hdr->zero != 0 ||
|
||||||
hdr->magic != BLOCKSTORE_META_MAGIC ||
|
hdr->magic != BLOCKSTORE_META_MAGIC_V1 ||
|
||||||
hdr->version != BLOCKSTORE_META_VERSION)
|
hdr->version != BLOCKSTORE_META_VERSION_V1)
|
||||||
{
|
{
|
||||||
printf(
|
printf(
|
||||||
"Metadata is corrupt or old version.\n"
|
"Metadata is corrupt or old version.\n"
|
||||||
|
|
|
@ -3,45 +3,18 @@
|
||||||
|
|
||||||
#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 "object_id.h"
|
#include "blockstore_impl.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
|
||||||
{
|
{
|
||||||
|
@ -51,6 +24,8 @@ 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[])
|
||||||
|
@ -66,108 +41,129 @@ 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);
|
||||||
if (self.meta_block_size % DIRECT_IO_ALIGNMENT)
|
return self.dump();
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
self.fd = open(self.meta_device, O_DIRECT|O_RDONLY);
|
this->fd = open(this->meta_device, O_DIRECT|O_RDONLY);
|
||||||
if (self.fd == -1)
|
if (this->fd == -1)
|
||||||
{
|
{
|
||||||
printf("Failed to open metadata device\n");
|
printf("Failed to open metadata device\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
// Read all metadata into memory
|
int buf_size = 1024*1024;
|
||||||
void *data = memalign(MEM_ALIGNMENT, self.meta_len);
|
if (buf_size % this->meta_block_size)
|
||||||
if (!data)
|
buf_size = 8*this->meta_block_size;
|
||||||
{
|
if (buf_size > this->meta_len)
|
||||||
printf("Failed to allocate %lu MB of memory\n", self.meta_len/1024/1024);
|
buf_size = this->meta_len;
|
||||||
close(self.fd);
|
void *data = memalign_or_die(MEM_ALIGNMENT, buf_size);
|
||||||
return 1;
|
lseek64(this->fd, this->meta_offset, 0);
|
||||||
}
|
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_v0_t with bitmaps
|
// Vitastor 0.6-0.7 - static array of clean_disk_entry with bitmaps
|
||||||
if (hdr->meta_block_size != self.meta_block_size)
|
if (hdr->meta_block_size != this->meta_block_size)
|
||||||
{
|
{
|
||||||
printf("Using block size %u bytes based on information from the superblock\n", hdr->meta_block_size);
|
printf("Using block size of %u bytes based on information from the superblock\n", hdr->meta_block_size);
|
||||||
self.meta_block_size = hdr->meta_block_size;
|
this->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_v0_t) + 2*clean_entry_bitmap_size;
|
uint64_t clean_entry_size = sizeof(clean_disk_entry) + 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;
|
||||||
for (uint64_t meta_pos = self.meta_block_size; meta_pos < self.meta_len; meta_pos += self.meta_block_size)
|
lseek64(this->fd, this->meta_offset, 0);
|
||||||
|
while (this->meta_pos < this->meta_len)
|
||||||
{
|
{
|
||||||
for (uint64_t ioff = 0; ioff < self.meta_block_size-clean_entry_size; ioff += clean_entry_size, block_num++)
|
uint64_t read_len = buf_size < this->meta_len-this->meta_pos ? buf_size : this->meta_len-this->meta_pos;
|
||||||
|
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)
|
||||||
{
|
{
|
||||||
clean_disk_entry_v0_t *entry = (clean_disk_entry_v0_t*)(data + meta_pos + ioff);
|
for (uint64_t ioff = 0; ioff < this->meta_block_size-clean_entry_size; ioff += clean_entry_size, block_num++)
|
||||||
if (entry->oid.inode)
|
|
||||||
{
|
{
|
||||||
printf(
|
clean_disk_entry *entry = (clean_disk_entry*)(data + blk + ioff);
|
||||||
|
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 ? (",\n" ENTRY_FMT) : ENTRY_FMT),
|
(first ? ENTRY_FMT : (",\n" 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");
|
printf("\n]}\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Vitastor 0.4-0.5 - static array of clean_disk_entry_v0_t
|
// Vitastor 0.4-0.5 - static array of clean_disk_entry
|
||||||
uint64_t clean_entry_size = sizeof(clean_disk_entry_v0_t);
|
uint64_t clean_entry_size = sizeof(clean_disk_entry);
|
||||||
uint64_t block_num = 0;
|
uint64_t block_num = 0;
|
||||||
printf("{\"version\":\"0.5\",\"meta_block_size\":%u,\"entries\":[\n", self.meta_block_size);
|
printf("{\"version\":\"0.5\",\"meta_block_size\":%u,\"entries\":[\n", this->meta_block_size);
|
||||||
bool first = true;
|
bool first = true;
|
||||||
for (uint64_t meta_pos = 0; meta_pos < self.meta_len; meta_pos += self.meta_block_size)
|
while (this->meta_pos < this->meta_len)
|
||||||
{
|
{
|
||||||
for (uint64_t ioff = 0; ioff < self.meta_block_size-clean_entry_size; ioff += clean_entry_size, block_num++)
|
uint64_t read_len = buf_size < this->meta_len-this->meta_pos ? buf_size : this->meta_len-this->meta_pos;
|
||||||
|
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)
|
||||||
{
|
{
|
||||||
clean_disk_entry_v0_t *entry = (clean_disk_entry_v0_t*)(data + meta_pos + ioff);
|
for (uint64_t ioff = 0; ioff < this->meta_block_size-clean_entry_size; ioff += clean_entry_size, block_num++)
|
||||||
if (entry->oid.inode)
|
|
||||||
{
|
{
|
||||||
printf(
|
clean_disk_entry *entry = (clean_disk_entry*)(data + blk + ioff);
|
||||||
|
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 ? (",\n" ENTRY_FMT) : ENTRY_FMT),
|
(first ? ENTRY_FMT : (",\n" 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");
|
printf("\n]}\n");
|
||||||
}
|
}
|
||||||
free(data);
|
free(data);
|
||||||
|
close(this->fd);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
mat: mat.c
|
|
||||||
gcc -O3 -I/usr/include/jerasure -o mat mat.c -lJerasure
|
|
291
src/lrc/mat.c
291
src/lrc/mat.c
|
@ -1,291 +0,0 @@
|
||||||
#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