--- /dev/null
+
+Lustre requires changes to the core kernel before it can be compiled against
+hte core kernel source tree. We use Andrew Morton's 'patch-scripts' utilties
+to keep the complexity of managing changes across multiple kernel targets down.
+They handle the ordering metadata, application, refreshing, and removal of
+patches for us. Please read scripts/docco.txt for a more thorough explanation
+of what 'patch-scripts' do.
+
+We create a thin wrapper around patchscripts with our ./prepare_tree.sh. It
+exports two environment variables. PATCHSCRIPTS is a relative path from the
+kernel source tree to the checked-out patchscripts repository. It is requires
+for patchscripts to operate on data outside the kernel source tree. It also
+puts the absolute path to the scripts/ directory at the front of PATH.
+Finally, it creates a 'series' link from the kernel tree back to the proper
+series file for that kernel tree. More on that below.
+
+prepare_tree.sh and the patch-scripts commands are the only interface we should
+use on a daily basis. We should never have to manage the patches by hand.
+This will save us heart-ache once we're good with the tools. I promise.
+
+Data to be aware of:
+
+patches/
+ contains all the patch files themselves. We should have a patch per
+ functional change.
+
+series/
+ the text files that patch-utils use to define the ordering of patches
+ that are applied to a tree. We have a series file for each kernel
+ tree variant that requires wildly different patches. (architecture
+ differences, stock vs. redhat, etc)
+
+pc/
+ control files for patch-utils. These are per tree and should never
+ be in cvs.
+
+txt/
+ text descriptions of the patches. Nice, but not functionally required.
+
+First, before anything happens, you need to prep a tree for use with
+patch-utils. This means putting a series link in the file and setting the
+environment variable:
+
+ $ eval `./prepare_tree.sh -t /tmp/kernels/linux-2.4.18 -r stock-2.4`
+
+prepare-tree.sh is careful to output variable assignments to stdout and
+everything else to stderr so the eval won't go awry. It also is clever about
+resolving the series name, so tab-completed relative paths to the series files
+can be used with -r. (it assumes that series/ is under where prepare_tree.sh
+was executed from). The series link that is created from the tree back into
+the cvs repository is created by force. Don't re-run the command with a
+different role. (this should probably be fixed)
+
+With this in place, the shell that did the eval is ready to wield patch-utils.
+
+] To apply all the patches to a given tree:
+
+ $ eval `./prepare_tree.sh -t /tmp/kernels/linux-2.4.18 -r stock-2.4`
+ $ cd /tmp/kernels/linux-2.4.18
+ $ pushpatch 100000
+ ( the huge number just serves to iterate through the patches )
+
+] To refresh the patches against a newer kernel that the series applies to.
+
+Say the series file 'rh-8.0-dev' corresponds to a CFS policy of tracking the
+most recent red hat 8.0 distro kernel. It used to be 2.4.18-14, say, and RH
+has now released RH 2.4.18-17.8.0 and CFS has decided to move to it. We
+want to update the patches in cvs HEAD to be against 2.4.18-17.8.0
+
+ $ eval `./prepare_tree.sh -t /tmp/linux-2.4.18-17.8.0 -r rh-8.0-dev`
+ $ cd /tmp/linux-2.4.18-17.8.0
+ $ for a in $NUM_PATCHES_HAVE ; do
+ pushpatch;
+ refpatch;
+ done
+
+] To add a new series
+
+Simply add a new empty file to the series/ directory, choosing a descriptive
+name for the series.
+
+] To add a patch into a series
+
+Ideally a patch can be added to the end of the series. This is most easily
+done with patch-utils import_patch. After the patch is imported it still needs
+to be applied and refreshed with 'pushpatch' and 'refpatch'. ___remember to
+cvs add the patch with -ko___ so that tags in the context of the diff aren't
+change by CVS, rendering the patch unusable.
+
+It is considered valuable to have a common HEAD which can be checked out to
+patch a kernel and build lustre across lots of targets. This creates some
+friction in the desire to keep a single canonical set of patches in CVS. We
+solve this with the patch-utils scripts by having well-named patches that are
+bound to the different series. Say alpha and ia64 kernel trees both need a
+common lustre patch. Ideally they'd both have our-funcionality.patch in their
+series, but perhaps the code path we want to alter is different in the trees
+and not in the architecture-dependant part of the kernel. For this we'd want
+our-functionality-ia64.patch in the ia64 series file, and
+our-functionality-alpha.patch in the alpha. This split becomes irritating to
+manage as shared changes want to be pushed to all the patches. This will be a
+pain as long as the kernel's we're receiving don't share revision control
+somehow. At least the patch utils make it relatively painless to 'pushpatch'
+the source patch, clean up rejects, test, and 'refpatch' to generate the new
+patch for that series.