Atenção: Preste atenção nos lugares marcados com a palavra "Atenção"

Em desenvolvimento de software, é bastante normal quando duas pessoas estão editando um mesmo arquivo, haverem conflitos de edição: ambas modificam a mesma versão do arquivo, e ao tentar juntar as duas, a atualização é impossível. Gerenciamento de conflitos é algo que sempre deve ser feito manualmente, pois em última análise, só os programadores tem condição de decidir entre versões conflitantes.

Lembrando sempre que engenharia de software se faz com boas práticas, e não com diagramas com bonecos e documentos de 6 mil páginas, aproveito a oportunidade para uma dica: Se você estruturar seu código em funções, ou classes, pequenas (você já sabia disso), e separar logicamente essas funções em arquivos diferentes, vai minimizar a quantidade de conflitos existentes quando muitos programadores trabalham em paralelo.

Agora, alguns conceitos úteis. Vou tentar cobrir o máximo de informação possível para os iniciantes. Os outros, sintam-se a vontade para ir pulando seções

Nem comecei a fazer o trabalho. O que eu faço?

Baixe o arquivo islenefs-v2.c, salve ele como islenefs.c, e ignore todo o resto, exceto por curiosidade, e para usar em problemas futuros.

Já comecei a fazer o trabalho. O que eu faço?

Você vai aplicar o patch chamado v2.patch no arquivo islenefs.c

Um patch é como um chiclete nas mãos do McGyver. Ele basicamente serve para indicar mudanças a serem realizadas em um arquivo texto, mas é uma coisa flexível o suficiente, talvez para desarmar bombas nucleares. Um exemplo é:

--- islenefs-v1.c	2008-04-24 17:20:30.000000000 -0300
+++ islenefs.c	2008-04-24 17:21:31.000000000 -0300
@@ -132,6 +132,8 @@ static int islenefs_create (struct inode
 {
 	struct inode *inode;
 	struct file_contents *file = kmalloc(sizeof(*file), GFP_KERNEL);	
+	struct page *page;
+
 	if (!file)
 		return -EAGAIN;
 
@@ -148,10 +150,11 @@ static int islenefs_create (struct inode
 	inode->i_fop = &islenefs_file_operations;
 
 	file->inode = inode;
-	file->conts = alloc_page(GFP_KERNEL);
-	if (!file->conts)
+	page = alloc_page(GFP_KERNEL);
+	if (!page)
 		goto cleanup;
 
+	file->conts = page_address(page);
 	INIT_LIST_HEAD(&file->list);
 	list_add_tail(&contents_list, &file->list); 
 	d_add(dentry, inode);
Vamos analisa-lo:
1: --- islenefs-v1.c	2008-04-24 17:20:30.000000000 -0300
2: +++ islenefs.c	2008-04-24 17:21:31.000000000 -0300
3: @@ -132,6 +132,8 @@ static int islenefs_create (struct inode

As linhas 1 e 2, dizem quais os arquivos utilizados. O comando patch buscará um desses arquivos em sua estrutura de diretórios. A linha 1 começa com ---, indicando que as linhas que estavam originalmente neste arquivo, foram removidas. A linha 2 começa com +++, e você consegue adivinhar o resto ;-). A linha 3 dá informações sobre aonde no arquivo espera-se encontrar um determinado pedaço de código, e qual a função que foi modificada (islenefs_create)

 	inode->i_fop = &islenefs_file_operations;
 
 	file->inode = inode;
-	file->conts = alloc_page(GFP_KERNEL);
-	if (!file->conts)
+	page = alloc_page(GFP_KERNEL);
+	if (!page)
 		goto cleanup;
 
+	file->conts = page_address(page);
 	INIT_LIST_HEAD(&file->list);
 	list_add_tail(&contents_list, &file->list); 
 	d_add(dentry, inode);

Não há mistério aqui: As linhas que começam com - foram retiradas, e as linhas que começam com + foram adicionadas. As outras, se mantém como estão, e são usadas pelo utilitário patch para achar onde se deve aplicar este patch.

Atenção Caso você não tenha modificado as linhas em volta das regiões que serão mexidas pelo comando patch, há grandes chances de o patch aplicar sem problemas.

Aplicando um patch

Para aplicar um patch, usamos o comando.... patch! Para saber como, comece analisando o cabeçalho do patch, e comparando com a sua hierarquia de diretórios:

1: --- dir1/dir2/dir3/file-old.c 2008-04-24 17:20:30.000000000 -0300
2: +++ dir1/dir2/dir3/file.c	 2008-04-24 17:21:31.000000000 -0300

O comando patch aceita uma opção -p, que quer dizer: Quantos níveis de diretório eu devo simplesmente ignorar até chegar no arquivo? Dessa forma, se você não disser nada, o comando patch vai procurar o arquivo dir1/dir2/dir3/file.c. Isso só funciona, se você estiver no toplevel de dir1.

Se você já está em dir1, vai querer que o comando ignore essa entrada. Então, -p1. Se você está em dir3, adivinhe? -p3

No caso de vocês, para o islenefs, o patch foi gerado já dentro do diretório fs/ do kernel. Então, vocês devem fazer:

Atenção: Essa é a única parte que importa do texto todo
cd linux-2.6.24.2
cd fs
cp islenefs.c copia-de-seguranca-do-islenefs.c
patch -p0 < /tmp/v2.patch

Se você teve mensagens de FAILED... o processo, digamos, falhou. Restaure a cópia de segurança e aplique as modificações manualmente.

Quaisquer dúvidas, entrem em contato