677 lines
27 KiB
ReStructuredText
677 lines
27 KiB
ReStructuredText
Developer's FAQ
|
||
===============
|
||
|
||
Contributor's FAQ
|
||
-----------------
|
||
|
||
The term *contributor* is broader and does not only mean contribution of code.
|
||
The documentation is a significant part and this is where non-technical people
|
||
add value. The user's POV brings different questions than the developers' and
|
||
explaining things in human language is a good thing.
|
||
|
||
Sending patches to documentation follows the same practices as for the code.
|
||
|
||
The documentation referred here is of the userspace tools (btrfs-progs), the
|
||
manual pages or the documentation that's part of the tool help strings.
|
||
|
||
The fixes range from rewording unclear sections, fixing formatting, spelling,
|
||
or adding more examples.
|
||
|
||
Documentation patches have high chance of getting merged and released quickly.
|
||
|
||
Developer's FAQ
|
||
---------------
|
||
|
||
By the term *developer* is meant somebody who's working on the code.
|
||
|
||
This section assumes basics of working with *git*, sending patches via mail and
|
||
aims to cover the current practices.
|
||
|
||
Patch tags
|
||
~~~~~~~~~~
|
||
|
||
The practice of tagging patches in linux kernel community is documented in
|
||
https://www.kernel.org/doc/html/latest/process/submitting-patches.html, we'll
|
||
highlight the most frequently used tags and their expected meaning. This only
|
||
briefly mentions the commonly used tags. You're encouraged to read the whole
|
||
document and get familiar with it.
|
||
|
||
Signed-off-by:
|
||
^^^^^^^^^^^^^^
|
||
|
||
This tag may appear multiple times, the first one denotes the patch author.
|
||
(The common abbreviation in free text is S-O-B or just sob line.) The patch
|
||
author is also recorded in git log history.
|
||
|
||
Then, each maintainer that processed the patch adds his sob line.
|
||
|
||
*Reference:* `Section of SubmittingPatches <https://docs.kernel.org/process/submitting-patches.html#sign-your-work-the-developer-s-certificate-of-origin>`__.
|
||
|
||
**Do**: Always send a patch with at least one such line with your name and email.
|
||
If more people contributed to the patch, add their names and addresses too.
|
||
|
||
**Don't**: Add a sob line under patch that you have no authoring relation to, e.g.
|
||
as a reply to the mailinglist after you've reviewed a patch. See below.
|
||
|
||
Reviewed-by:
|
||
^^^^^^^^^^^^
|
||
|
||
The patch has been reviewed and the singed person is putting his hand into
|
||
fire. If there's a bug found in this patch, the person is usually a good
|
||
candidate for a CC: of the bugreport.
|
||
|
||
*Reference:* `Section of SubmittingPatches <https://docs.kernel.org/process/submitting-patches.html#using-reported-by-tested-by-reviewed-by-suggested-by-and-fixes>`__.
|
||
|
||
**Do**: talk to the maintainer if he forgot to add this tag to the final patch.
|
||
Reviews do take time and the patches land in various branches early after
|
||
they're sent to the mailingslist for testing, but the reviews are always
|
||
welcome.
|
||
|
||
**Do**: collect the Reviewed-by tags for patches that get resent unchanged e.g.
|
||
within a larger patch series
|
||
|
||
Acked-by:
|
||
^^^^^^^^^
|
||
|
||
A more lightweight form of *Reviewed-by*, acknowledging that the patch is going
|
||
the right direction, but that the person has not done a deeper examination of
|
||
the patch. Asking for an ACK can be expressed by a *CC:* tag in the patch.
|
||
|
||
Tested-by:
|
||
^^^^^^^^^^
|
||
|
||
Indicates that the patch has been successfully tested in some environment,
|
||
usually follows a proposed fix and closes the feedback loop.
|
||
|
||
*Reference:* `Section of SubmittingPatches <https://docs.kernel.org/process/submitting-patches.html#using-reported-by-tested-by-reviewed-by-suggested-by-and-fixes>`_.
|
||
|
||
**Do**: or rather you're encouraged to add this tag to a patch that you've
|
||
tested.
|
||
|
||
CC:
|
||
^^^
|
||
|
||
Add this tag to the patch if you feel that the person should be aware of the
|
||
patch.
|
||
|
||
Ordering
|
||
^^^^^^^^
|
||
|
||
The order of the tags can track the flow of the patches through various trees,
|
||
namely the Signed-off-by tag. Ordering of the other tags is not strict so you
|
||
can find patches with randomly mixed tags. A common practice we find kind of
|
||
useful is to sort them how things happened. It would be good to use that,
|
||
namely the references to stable trees and original reports.
|
||
|
||
- how it happened
|
||
|
||
#. (optional) Bugzilla:
|
||
#. (optional) Link:
|
||
#. **Reported-by:**
|
||
|
||
- where it should be backported, relevant references
|
||
|
||
#. **Fixes:**
|
||
#. **CC:** stable\@vger.kernel.org # 4.4+
|
||
|
||
- other tags
|
||
|
||
#. **CC:**
|
||
#. **Suggested-by:**
|
||
|
||
- quality control by non-authors
|
||
|
||
#. **Reviewed-by:**
|
||
#. **Tested-by:**
|
||
|
||
- author(s)
|
||
|
||
#. **Signed-off-by:**
|
||
|
||
- maintainer(s)
|
||
|
||
#. **Reviewed-by:**
|
||
#. **Signed-off-by:**
|
||
|
||
Patch flow
|
||
~~~~~~~~~~
|
||
|
||
Simple patch
|
||
^^^^^^^^^^^^
|
||
|
||
#. developer works on the patch, self-reviews, tests, adds the formal tags,
|
||
writes changelog
|
||
#. patch lands in the mailinglist
|
||
#. patch is commented, reviewed
|
||
|
||
- several iterations of updates may follow
|
||
|
||
#. maintainer adds the patch into a branch
|
||
#. when the right time comes, a branch with selected patches is pushed up the
|
||
merge chain
|
||
#. a release milestone that contains the patch is released, everybody is happy
|
||
|
||
Controversial changes
|
||
^^^^^^^^^^^^^^^^^^^^^
|
||
|
||
This happens, not every patch gets merged. In the worst case there are not even
|
||
any comments under the patch and it's silently ignored. This depends on many
|
||
factors, most notably \*cough*time*cough*. Examining potential drawbacks or
|
||
forseeing disasters is not an easy job.
|
||
|
||
Let's be more positive, you manage to attract the attention of some developer
|
||
and he says, he does not like the approach of the patch(es). Better than
|
||
nothing, isn't it? Depending on the feedback, try to understand the objections
|
||
and try to find a solution or insist on your approach but possibly back it by
|
||
good arguments (performance gain, expected use case) or a better explanation
|
||
*why* the change is needed.
|
||
|
||
Repeated submissions
|
||
^^^^^^^^^^^^^^^^^^^^
|
||
|
||
If you got feedback for a patch that pointed out changes that should be done
|
||
before the patch can be merged, please do apply the changes or give a reason
|
||
why they're wrong or not needed. (You can try to pinkie-swear to implement them
|
||
later, but do not try this too often.)
|
||
|
||
For the next iteration, add a short description of the changes made, under the
|
||
first **---** (triple dash) marker in the patch. For example (see also Example
|
||
3):
|
||
|
||
.. code-block::
|
||
|
||
---
|
||
V3: renamed variable
|
||
V2: fixed typo
|
||
|
||
Keep all previous changelogs. Larger patchsets should contain the incremental
|
||
changelogs in the cover letter.
|
||
|
||
Patch completeness, RFC
|
||
~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
||
A patch does not necessarily have to implement the whole feature or idea. You
|
||
can send an early version, use a *[RFC]* string somewhere in the subject. This
|
||
means *request for comments*. Be prepared to get comments.
|
||
|
||
Please describe the level of completeness, e.g. what tests it does or does not
|
||
pass or what type of use cases is not yet implemented. The purpose is to get
|
||
feedback from other developers about the direction or implementation approach.
|
||
This may save you hours of coding.
|
||
|
||
Patchsets
|
||
~~~~~~~~~
|
||
|
||
Related patches, patch dependency
|
||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||
|
||
Group the patches by feature or by topic. Implementing a particular feature may
|
||
need to prepare other parts of the code for the main patch. Applying the
|
||
patches out of order will not succeed, so it's pointless to send them as
|
||
unrelated and separate mails. The git tool is helpful here, see
|
||
*git-format-patch*.
|
||
|
||
An example of grouping by topic is cleanups, or small bugfixes that are quite
|
||
independent but it would be better to processes them in one go.
|
||
|
||
Sometimes a patch from a series is self-contained enough that it might get
|
||
applied ahead of the whole series. You may also submit it separately as this
|
||
will decrease the work needed to keep the patch series up to date with the
|
||
moving development base.
|
||
|
||
**Do:** make sure that each patch compiles and does not deliberately introduce
|
||
a bug, this is a good practice that makes *bisecting* go smooth
|
||
|
||
**Do:** send the cover letter (i.e. the non-patch mail) with brief description
|
||
of the series, this is a place where feedback to the whole patchset will be
|
||
sent rather than comments to the individual patches. To generate the series
|
||
with cover letter use *git format-patch --cover-letter --thread*.
|
||
|
||
Good practices, contribution hints
|
||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
||
- if you feel that you understand some area of code enough to stick your
|
||
*Reviewed-by* to submitted patches, please do. Even for small patches.
|
||
- don't hesitate to be vocal if you see that a wrong patch has been committed
|
||
- be patient if your patch is not accepted immediately, try to send a gentle
|
||
ping if there's a significant time without any action
|
||
- if you want to start contributing but are not sure about how to do that,
|
||
lurk in the mailingist or on the IRC channel
|
||
- every patch should implement one thing -- this is vaguely defined, you may
|
||
receive comments about patch splitting or merging with other
|
||
- every patch must be compilable when applied, possibly with all related
|
||
CONFIG\_ variable values
|
||
- send a new patch as a new mail, not within another thread, it might get
|
||
missed
|
||
- use *git-format-patch* and *git-send-email*
|
||
|
||
Sample patches
|
||
~~~~~~~~~~~~~~
|
||
|
||
There are some formalities expected, like subject line formatting, or the tags.
|
||
Although you may find them annoying at first, they help to classify the patches
|
||
among the rest of mails.
|
||
|
||
Subject:
|
||
^^^^^^^^
|
||
|
||
| For kernel patches add the prefix **btrfs:**
|
||
| for userspace tools add **btrfs-progs:**
|
||
|
||
Example 1
|
||
^^^^^^^^^
|
||
|
||
.. code-block:: none
|
||
|
||
From: John Doe <john@doe.org>
|
||
Subject: [PATCH] btrfs: merge common code into a helper
|
||
|
||
The code for creating a new tree is open-coded in a few places, add a helper
|
||
and remove the duplicate code.
|
||
|
||
Signed-off-by: John Doe <john@doe.org>
|
||
---
|
||
fs/btrfs/volumes.c | 5 +++--
|
||
1 files changed, 3 insertions(+), 2 deletions(-)
|
||
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
|
||
index e138af710de2..3f0cc12ec488 100644
|
||
--- a/fs/btrfs/volumes.c
|
||
+++ b/fs/btrfs/volumes.c
|
||
(rest of the patch)
|
||
|
||
Example 2
|
||
^^^^^^^^^
|
||
|
||
.. code-block:: none
|
||
|
||
From: Jane Doe <jane@doe.org>
|
||
Subject: [PATCH] btrfs-progs: enhance documentation of balance
|
||
|
||
Add examples of typical balance use, common problems and how to resolve them.
|
||
|
||
Signed-off-by: Jane Doe <jane@doe.org>
|
||
---
|
||
Documentation/btrfs-balance.txt | 20 +++++++++++++++++++-
|
||
1 files changed, 3 insertions(+), 2 deletions(-)
|
||
diff --git a/Documentation/btrfs-balance.txt b/Documentation/btrfs-balance.txt
|
||
index e138af710de2..3f0cc12ec488 100644
|
||
--- a/Documentation/btrfs-balance.txt
|
||
+++ b/Documentation/btrfs-balance.txt
|
||
(rest of the patch)
|
||
|
||
Example 3
|
||
^^^^^^^^^
|
||
|
||
.. code-block:: none
|
||
|
||
From: John Doe <john@doe.org>
|
||
Subject: [PATCH v3] btrfs: merge common code into a helper
|
||
|
||
The code for creating a new tree is open-coded in a few places, add a helper
|
||
and remove the duplicate code.
|
||
|
||
Signed-off-by: John Doe <john@doe.org>
|
||
---
|
||
V3: add helper prototype into header file
|
||
V2: found one more open-coded instance
|
||
|
||
fs/btrfs/ctree.h | 1 +
|
||
fs/btrfs/volumes.c | 5 +++--
|
||
2 files changed, 4 insertions(+), 2 deletions(-)
|
||
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
|
||
index e138af710de2..3f0cc12ec488 100644
|
||
--- a/fs/btrfs/volumes.c
|
||
+++ b/fs/btrfs/volumes.c
|
||
(rest of the patch)
|
||
|
||
Pull requests vs patches to mailinglist
|
||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
||
By default, all patches should be sent as mails to the mailinglist. The
|
||
discussions or reviews happen there. Putting a patch series to a git branch may
|
||
be convenient, but does not mean the exact unchanged branch will be pulled.
|
||
|
||
There are some criteria that have to be met before this happens. The patches
|
||
should meet/have:
|
||
|
||
- no coding style violations
|
||
- good quality of implementation, should not exhibit trivial mistakes, lack of
|
||
comments
|
||
- unspecified number of other things that usually get pointed out in review
|
||
comments
|
||
|
||
- this knowledge can be demonstrated by doing reviews of other developers'
|
||
patches
|
||
- doing reviews of other developers' patches is strongly recommended
|
||
|
||
- good changelogs and subject lines
|
||
- the base point of the git branch is well-defined (i.e. a stable release point
|
||
or last development point, that will not get rebased)
|
||
|
||
The third point is vague, mostly refers to preferred coding patterns that we
|
||
discover and use over time. This may also explain why the pull-based workflow
|
||
is not used often. Both parties, developers and maintainers, need to know that
|
||
the code to be pulled will be satisfactory in this regard.
|
||
|
||
It should be considered normal to send more than one round of a patchset, based
|
||
on review comments that hopefully do not need to point out issues in anything
|
||
of the above. Rather focus on design or potential uses and other impact.
|
||
|
||
Kernel patches
|
||
^^^^^^^^^^^^^^
|
||
|
||
If you think you're able to provide the expected quality of patches and are
|
||
familiar with a bit more advanced git use, ask the maintainers. If you're a
|
||
long-term developer, the maintainers can also ask you to start the pull-based
|
||
workflow. The main point for the workflow is to make maintainers' life easier.
|
||
|
||
Suggested branch names for patchsets for current development cycle:
|
||
|
||
- **base** -- the last commit of the last pull (could be in branch
|
||
named something like **misc-next**), or some older
|
||
head of pull request
|
||
|
||
Patches for next development cycle:
|
||
|
||
- **base** -- the last release candidate tag in Linus' tree, be sure
|
||
not to be ahead of the integration branches that will become the pull
|
||
requests for the next development cycle.
|
||
- **for-next** -- patches should be in a good state, i.e. don't
|
||
complicate testing too much, workarounds or known problems should be
|
||
documented (e.g. in the patchset cover letter)
|
||
- other names, for example a patchset for a given feature as a topic
|
||
branch: **feature-live-repair**
|
||
|
||
Experimental, unsafe or unreviewed patchsets are good candidates for topic
|
||
branches as they could be added or removed from the for-next branches easily
|
||
(compared to manually removing the patches from a long series).
|
||
|
||
Btrfs-progs patches
|
||
^^^^^^^^^^^^^^^^^^^
|
||
|
||
The first paragraph from previous section applies here as well.
|
||
|
||
Unlike the kernel, there are no release candidates during development. If a
|
||
patchset is independent, the *master* branch is a suitable point. In case
|
||
there are other patches in *devel*, a non-rebased development branch needs to
|
||
be created. As this is not needed most of the time, this will happen only
|
||
on-demand.
|
||
|
||
Copyright notices in files, SPDX
|
||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
||
**License information in files is using the SPDX standard.**
|
||
|
||
Quoting https://spdx.dev/about/:
|
||
|
||
SPDX is an open standard for communicating software bill of material
|
||
information, including provenance, license, security, and other
|
||
related information. SPDX reduces redundant work by providing common
|
||
formats for organizations and communities to share important data,
|
||
thereby streamlining and improving compliance, security, and
|
||
dependability. The SPDX specification is recognized as the
|
||
international open standard for security, license compliance, and
|
||
other software supply chain artifacts as ISO/IEC 5962:2021.
|
||
|
||
The initiative started in 2017 https://lwn.net/Articles/739183/ aims to
|
||
unify licensing information in all files using **SPDX** tags, this is driven by
|
||
the Linux Foundation. Therefore it's not necessary to repeat the license header
|
||
(GPL) in each file, the licensing rules are documented in
|
||
https://docs.kernel.org/process/license-rules.html (also available in linux git
|
||
tree in Documentation/process/license-rules.rst which is the source file of the
|
||
linked document).
|
||
|
||
Complete information with history about contributors of changes in a particular
|
||
file is recorded in **git** using **Signed-off-by** tags that are documented
|
||
and widely understood (Developer's certificate of origin). For more information
|
||
please see
|
||
https://docs.kernel.org/process/submitting-patches.html#sign-your-work-the-developer-s-certificate-of-origin
|
||
.
|
||
|
||
**Copyright notices in files.** This delves into the legal territory and
|
||
there's no easy answer about the recommended practice. This paragraph could
|
||
help you to answer some questions regarding that but is not by any means
|
||
complete and refers to known and documented practices:
|
||
|
||
- All code merged into the mainline kernel retains its original
|
||
ownership (https://docs.kernel.org/process/1.Intro.html#licensing)
|
||
- Removing the copyright from existing files is not trivial and would
|
||
require asking the original authors or current copyright holders.
|
||
- In btrfs code, adding copyright notices is not mandatory
|
||
- In btrfs code, there are some copyright notices present from years
|
||
before 2017
|
||
- In btrfs code, the copyright notices are inconsistent and incomplete
|
||
(please refer to git history to look up the cod change authors)
|
||
- If not sure, please consult your lawyers
|
||
|
||
**Btrfs developer community perspective, not legally binding.**
|
||
|
||
The copyright notices are not required and are discouraged for reasons that are
|
||
practical rather than legal. The files do not track all individual contributors
|
||
nor companies (this can be found in git), so the inaccurate and incomplete
|
||
information gives a very skewed if not completely wrong idea about the
|
||
copyright holders of changes in a given file. The code is usually heavily
|
||
changed over time in smaller portions, slowly morphing into something that does
|
||
not resemble the original code anymore though it shares a lot of the core ideas
|
||
and implemented logic. A copyright notice by a company that does not exist
|
||
anymore from 10 years ago is a clear example of uselesness for the developers.
|
||
|
||
When code is moved verbatim from a file to another file, in the new file it
|
||
appears to be contributed by a single author while it is in most cases code
|
||
resulting from many previous contributions from other people. This is most
|
||
obvious when splitting code from big files to new ones, because this is
|
||
considered a good development practice, but somehow goes against the meaning of
|
||
the copyright notices, unless a complete list of original code authors and
|
||
copyright holders is also copied.
|
||
|
||
The current copyright notices will not be removed but at least new
|
||
contributions won't continue adding new ones. The change history is recorded in
|
||
git using Signed-off-by tags that are documented
|
||
(https://docs.kernel.org/process/submitting-patches.html#sign-your-work-the-developer-s-certificate-of-origin)
|
||
and widely understood. Unless there's a blessed practice regarding the
|
||
copyright notices that significantly improves the situation, the current way is
|
||
considered sufficient for practical development purposes.
|
||
|
||
Given all the above, we don't want the copyright notices in individual files
|
||
that are new, renamed or split. This applies to all new changes in all btrfs
|
||
related code changes. Obviously lawyers may disagree and/or may require
|
||
additional refinements to the process, which is fine but beyond the scope of
|
||
this section.
|
||
|
||
You may also read a perspective from Linux Foundation that shares a similar
|
||
view:
|
||
https://www.linuxfoundation.org/blog/copyright-notices-in-open-source-software-projects/
|
||
|
||
.. _devfaq-development-schedule:
|
||
|
||
Development schedule
|
||
--------------------
|
||
|
||
A short overview of the development phases of linux kernel and what this means
|
||
for developers regarding sending patches etc.
|
||
|
||
Major release
|
||
~~~~~~~~~~~~~
|
||
|
||
*Overall:* a major release is done by Linus, the version bumps in the 2nd
|
||
position of the version, e.g. it's *4.6*. This usually means distributions
|
||
start to adopt the sources, the stable kernels are going to be released.
|
||
|
||
*Developers:* expect bug reports based on this version, this usually does not
|
||
have other significance regarding development of new features or bugfixes
|
||
|
||
Merge window
|
||
~~~~~~~~~~~~
|
||
|
||
*Overall:* the time when pull requests from 1st level maintainers get sent to
|
||
Linus, the merge window starts after the major release and usually takes two
|
||
weeks
|
||
|
||
*Developers:* get ready with any bugfixes that were not part of the patches in
|
||
the pull requests but are still relevant for the upcoming kernel
|
||
|
||
There are usually one or two pull requests sent by the maintainer so it's OK to
|
||
send the bugfixes to the mailinglist even during the merge window period. If
|
||
the "deadline" is not met, the patches get merged in the next *rc*.
|
||
|
||
Sending big patchsets during this period is not discouraged, but feedback may
|
||
be delayed.
|
||
|
||
The amount of changes that go to *master* branch from the rest of the kernel is
|
||
high, things can break due to reasons unrelated to btrfs changes. Testing is
|
||
welcome, but the bugs could turn out not to be relevant to us.
|
||
|
||
The rc1
|
||
~~~~~~~
|
||
|
||
*Overall:* most of the kernel changes are now merged, no new features are
|
||
allowed to be added, the following period until the major release is expected
|
||
to fix only regressions
|
||
|
||
*Developers:* it's a good time to test extensively, changes in VFS, MM,
|
||
scheduler, debugging features and other subsystems could introduce bugs or
|
||
misbehaviour
|
||
|
||
From now on until the late release candidates, it's a good time to post big
|
||
patchsets that are supposed to land in the next kernel. There's time to let
|
||
others to do review, discuss design goals, do patchset revisions based on
|
||
feedback.
|
||
|
||
Depending on the proposed changes, the patchset could be queued for the next
|
||
release within that time. If the patchset is intrusive, it could stay in the
|
||
*for-next* branches for some time.
|
||
|
||
The late rcX (rc5 and up)
|
||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
||
*Overall:* based on past experience, there are at least 5 release candidates,
|
||
done on a weekly basis, so you can estimate the amount of time before the full
|
||
release or merge window. The 5 seems like am minimum, usually there are 2 or 3
|
||
more release candidates.
|
||
|
||
*Developers:* new code for the upcoming kernel is supposed to be reviewed and
|
||
tested, can be found in the *for-next* branch
|
||
|
||
Sending intrusive changes at this point is not guaranteed to be reviewed or
|
||
tested in time so it gets queued for the next kernel. This highly depends on the
|
||
nature of the changes. Patch count should not be an issue if the patches are
|
||
revieweable or do not do intrusive changes.
|
||
|
||
Last rcX before major release (rc7 or rc8)
|
||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
||
The releases typically take 3 months, which means that rc7 or rc8 are the
|
||
last ones, followed by a release and the merge window opens. Before that the
|
||
development is effectively frozen or continues in parallel. Up to date list of
|
||
release dates is at https://en.wikipedia.org/wiki/Linux_kernel_version_history .
|
||
|
||
Major release
|
||
~~~~~~~~~~~~~
|
||
|
||
``goto 1;``
|
||
|
||
Development phase, linux-next, for-next
|
||
---------------------------------------
|
||
|
||
Patches and patchsets that are supposed to be merged in the next merge cycle
|
||
are usually collected in the linux-next git tree. This gives an overview about
|
||
potential conflicts and provides a central point for testing various patches.
|
||
The btrfs patches for linux-next tree are hosted at
|
||
https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git in branch
|
||
*for-next*. The update period is irregular, usually a few times per week.
|
||
|
||
Patches are added to for-next when they get a basic review and do not seriously
|
||
decrease stability. Some level of breakage is allowed and inevitable so there's
|
||
a possibility to get a tree for early testing. Also there are external
|
||
services that provide compilation coverage for various arches and
|
||
configurations.
|
||
|
||
The for-next branch is rebased and rebuilt from scratch and cannot be used as
|
||
base for patch development. Independent patches should use last -rc tag.
|
||
|
||
- https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
|
||
-- daily snapshots
|
||
- https://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git --
|
||
for-next
|
||
|
||
Misc information and hints
|
||
--------------------------
|
||
|
||
This section collects random pieces of advice from mailinglist that are given
|
||
to newcomers.
|
||
|
||
How to get started - development
|
||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
|
||
- Build and install the latest kernel from Linus's git repository.
|
||
- Create one or several btrfs filesystems with different configurations
|
||
and learn how they work in userspace -- what are the features, what
|
||
are the problems you see? Actually use at least one of the
|
||
filesystems you created for real data in daily use (with backups)
|
||
- Build the userspace tools from git
|
||
- Project ideas used to be tracked on the wiki
|
||
(https://archive.kernel.org/oldwiki/btrfs.wiki.kernel.org/index.php/Project_ideas.html)
|
||
but this contains outdated information and will be moved elsewhere eventually.
|
||
If you pick the right one(s), you'll have to
|
||
learn about some of the internal structures of the filesystem anyway. Compile
|
||
and test your patch. If you're adding a new feature, write an
|
||
automated fstests case for it as well.
|
||
- Get that patch accepted. This will probably involve a sequence of
|
||
revisions to it, multiple versions over a period of several weeks or
|
||
more, with a review process. You should also send your test to
|
||
fstests and get that accepted.
|
||
- Do the above again, until you get used to the processes involved, and
|
||
have demonstrated that you can work well with the other people in the
|
||
subsystem, and are generally producing useful and sane code. It's all
|
||
about trust -- can you be trusted to mostly do the right thing?
|
||
- Developer documentation is listed in a section on the main documentation page.
|
||
- Output of *btrfs inspect-internal dump-tree* can be helpful to understand
|
||
the internal structure of the filesystem.
|
||
|
||
How not to start
|
||
~~~~~~~~~~~~~~~~
|
||
|
||
It might be tempting to look for coding style violations and send patches to
|
||
fix them. This happens from time to time and the community does not welcome
|
||
that. The following text reflects our stance:
|
||
|
||
If you want to contribute and do something useful for others and yourself, just
|
||
don't keep sending these patches to fix whitespace/style issues reported by
|
||
checkpatch.pl. Think about it:
|
||
|
||
#. You don't learn anything by doing them. You don't learn nothing about btrfs
|
||
internals, filesystems in general, kernel programming in general, general
|
||
programming in C, etc. It ends up being only a waste of time for you;
|
||
#. You're not offering any benefit to users - not fixing a bug, not adding a
|
||
new feature, not doing any performance/efficiency improvement, not making
|
||
the code more reliable, etc;
|
||
#. You're not offering a benefit for other developers either, like doing a
|
||
cleanup that simplifies a complex algorithm for example.
|
||
|
||
If you care so much about the whitespace/style issues, just fix them while
|
||
doing a useful change as mentioned above that happens to touch the same code.
|
||
It takes time to read and understand code, it can be a big investment of time,
|
||
but it ends up being worth it. There's plenty of bug reports and performance
|
||
issues in the mailing list or bugzilla, so there's no shortage of things to do.
|
||
|
||
Same advice applies to any other kernel subsystem or open source project in
|
||
general. Also before jumping into such a storm of useless patches, observe
|
||
first what a community does for at least a month, and learn from other
|
||
contributors - what they do, how they do it, the flow of development and
|
||
releases, etc. Don't rush into a sending patch just for the sake of sending it
|
||
and having your name in the git history.
|
||
|
||
References
|
||
----------
|
||
|
||
- `Kernel maintainersip: an oral
|
||
tradition <https://events.linuxfoundation.org/sites/events/files/slides/clement-kernel-maintainership-oral-tradition.pdf>`__
|
||
(pdf) a nice presentation from ELCE 2015 what does it mean to be a
|
||
maintainer and what the developers can expect.
|
||
- https://www.kernel.org/doc/html/latest/process/submitting-patches.html
|
||
(must read)
|
||
- https://www.kernel.org/doc/html/latest/process/coding-style.html
|
||
(must read)
|
||
- Pro Git by Scott Chacon http://progit.org/book/
|
||
- Git project main page http://git-scm.com
|