1c40487d4SMatt Macy# Contributing to OpenZFS 2c40487d4SMatt Macy<p align="center"> 3c40487d4SMatt Macy <img alt="OpenZFS Logo" 4c40487d4SMatt Macy src="https://openzfs.github.io/openzfs-docs/_static/img/logo/480px-Open-ZFS-Secondary-Logo-Colour-halfsize.png"/> 5c40487d4SMatt Macy</p> 6c40487d4SMatt Macy 7c40487d4SMatt Macy*First of all, thank you for taking the time to contribute!* 8c40487d4SMatt Macy 9c40487d4SMatt MacyBy using the following guidelines, you can help us make OpenZFS even better. 10c40487d4SMatt Macy 11c40487d4SMatt Macy## Table Of Contents 12c40487d4SMatt Macy[What should I know before I get 13c40487d4SMatt Macystarted?](#what-should-i-know-before-i-get-started) 14c40487d4SMatt Macy 15c40487d4SMatt Macy * [Get ZFS](#get-zfs) 16c40487d4SMatt Macy * [Debug ZFS](#debug-zfs) 17c40487d4SMatt Macy * [Where can I ask for help?](#where-can-I-ask-for-help) 18c40487d4SMatt Macy 19c40487d4SMatt Macy[How Can I Contribute?](#how-can-i-contribute) 20c40487d4SMatt Macy 21c40487d4SMatt Macy * [Reporting Bugs](#reporting-bugs) 22c40487d4SMatt Macy * [Suggesting Enhancements](#suggesting-enhancements) 23c40487d4SMatt Macy * [Pull Requests](#pull-requests) 24c40487d4SMatt Macy * [Testing](#testing) 25c40487d4SMatt Macy 26c40487d4SMatt Macy[Style Guides](#style-guides) 27c40487d4SMatt Macy 28c40487d4SMatt Macy * [Coding Conventions](#coding-conventions) 29c40487d4SMatt Macy * [Commit Message Formats](#commit-message-formats) 30c40487d4SMatt Macy * [New Changes](#new-changes) 31c40487d4SMatt Macy * [OpenZFS Patch Ports](#openzfs-patch-ports) 32c40487d4SMatt Macy * [Coverity Defect Fixes](#coverity-defect-fixes) 33c40487d4SMatt Macy * [Signed Off By](#signed-off-by) 34c40487d4SMatt Macy 35c40487d4SMatt MacyHelpful resources 36c40487d4SMatt Macy 37c40487d4SMatt Macy * [OpenZFS Documentation](https://openzfs.github.io/openzfs-docs/) 38c40487d4SMatt Macy * [OpenZFS Developer Resources](http://open-zfs.org/wiki/Developer_resources) 39c40487d4SMatt Macy * [Git and GitHub for beginners](https://openzfs.github.io/openzfs-docs/Developer%20Resources/Git%20and%20GitHub%20for%20beginners.html) 40c40487d4SMatt Macy 41c40487d4SMatt Macy## What should I know before I get started? 42c40487d4SMatt Macy 43c40487d4SMatt Macy### Get ZFS 44c40487d4SMatt MacyYou can build zfs packages by following [these 45c40487d4SMatt Macyinstructions](https://openzfs.github.io/openzfs-docs/Developer%20Resources/Building%20ZFS.html), 46c40487d4SMatt Macyor install stable packages from [your distribution's 47c40487d4SMatt Macyrepository](https://openzfs.github.io/openzfs-docs/Getting%20Started/index.html). 48c40487d4SMatt Macy 49c40487d4SMatt Macy### Debug ZFS 50c40487d4SMatt MacyA variety of methods and tools are available to aid ZFS developers. 51c40487d4SMatt MacyIt's strongly recommended that when developing a patch the `--enable-debug` 52c40487d4SMatt Macyconfigure option should be set. This will enable additional correctness 53c40487d4SMatt Macychecks and all the ASSERTs to help quickly catch potential issues. 54c40487d4SMatt Macy 55c40487d4SMatt MacyIn addition, there are numerous utilities and debugging files which 56c40487d4SMatt Macyprovide visibility into the inner workings of ZFS. The most useful 57c40487d4SMatt Macyof these tools are discussed in detail on the [Troubleshooting 58c40487d4SMatt Macypage](https://openzfs.github.io/openzfs-docs/Basic%20Concepts/Troubleshooting.html). 59c40487d4SMatt Macy 60c40487d4SMatt Macy### Where can I ask for help? 61c40487d4SMatt MacyThe [zfs-discuss mailing 62c40487d4SMatt Macylist](https://openzfs.github.io/openzfs-docs/Project%20and%20Community/Mailing%20Lists.html) 63c40487d4SMatt Macyor IRC are the best places to ask for help. Please do not file 64c40487d4SMatt Macysupport requests on the GitHub issue tracker. 65c40487d4SMatt Macy 66c40487d4SMatt Macy## How Can I Contribute? 67c40487d4SMatt Macy 68c40487d4SMatt Macy### Reporting Bugs 69c40487d4SMatt Macy*Please* contact us via the [zfs-discuss mailing 70c40487d4SMatt Macylist](https://openzfs.github.io/openzfs-docs/Project%20and%20Community/Mailing%20Lists.html) 71c40487d4SMatt Macyor IRC if you aren't certain that you are experiencing a bug. 72c40487d4SMatt Macy 73c40487d4SMatt MacyIf you run into an issue, please search our [issue 74c40487d4SMatt Macytracker](https://github.com/openzfs/zfs/issues) *first* to ensure the 75c40487d4SMatt Macyissue hasn't been reported before. Open a new issue only if you haven't 76c40487d4SMatt Macyfound anything similar to your issue. 77c40487d4SMatt Macy 78c40487d4SMatt MacyYou can open a new issue and search existing issues using the public [issue 79c40487d4SMatt Macytracker](https://github.com/openzfs/zfs/issues). 80c40487d4SMatt Macy 81c40487d4SMatt Macy#### When opening a new issue, please include the following information at the top of the issue: 82c40487d4SMatt Macy* What distribution (with version) you are using. 83c40487d4SMatt Macy* The spl and zfs versions you are using, installation method (repository 84c40487d4SMatt Macyor manual compilation). 85c40487d4SMatt Macy* Describe the issue you are experiencing. 86c40487d4SMatt Macy* Describe how to reproduce the issue. 87c40487d4SMatt Macy* Including any warning/errors/backtraces from the system logs. 88c40487d4SMatt Macy 89c40487d4SMatt MacyWhen a new issue is opened, it is not uncommon for developers to request 90c40487d4SMatt Macyadditional information. 91c40487d4SMatt Macy 92c40487d4SMatt MacyIn general, the more detail you share about a problem the quicker a 93c40487d4SMatt Macydeveloper can resolve it. For example, providing a simple test case is always 94c40487d4SMatt Macyexceptionally helpful. 95c40487d4SMatt Macy 96c40487d4SMatt MacyBe prepared to work with the developers investigating your issue. Your 97c40487d4SMatt Macyassistance is crucial in providing a quick solution. They may ask for 98c40487d4SMatt Macyinformation like: 99c40487d4SMatt Macy 100c40487d4SMatt Macy* Your pool configuration as reported by `zdb` or `zpool status`. 101c40487d4SMatt Macy* Your hardware configuration, such as 102c40487d4SMatt Macy * Number of CPUs. 103c40487d4SMatt Macy * Amount of memory. 104c40487d4SMatt Macy * Whether your system has ECC memory. 105c40487d4SMatt Macy * Whether it is running under a VMM/Hypervisor. 106c40487d4SMatt Macy * Kernel version. 107c40487d4SMatt Macy * Values of the spl/zfs module parameters. 108c40487d4SMatt Macy* Stack traces which may be logged to `dmesg`. 109c40487d4SMatt Macy 110c40487d4SMatt Macy### Suggesting Enhancements 111c40487d4SMatt MacyOpenZFS is a widely deployed production filesystem which is under active 112c40487d4SMatt Macydevelopment. The team's primary focus is on fixing known issues, improving 113c40487d4SMatt Macyperformance, and adding compelling new features. 114c40487d4SMatt Macy 115c40487d4SMatt MacyYou can view the list of proposed features 116c40487d4SMatt Macyby filtering the issue tracker by the ["Type: Feature" 117c40487d4SMatt Macylabel](https://github.com/openzfs/zfs/issues?q=is%3Aopen+is%3Aissue+label%3A%22Type%3A+Feature%22). 118c40487d4SMatt MacyIf you have an idea for a feature first check this list. If your idea already 119c40487d4SMatt Macyappears then add a +1 to the top most comment, this helps us gauge interest 120c40487d4SMatt Macyin that feature. 121c40487d4SMatt Macy 122c40487d4SMatt MacyOtherwise, open a new issue and describe your proposed feature. Why is this 123c40487d4SMatt Macyfeature needed? What problem does it solve? 124c40487d4SMatt Macy 125c40487d4SMatt Macy### Pull Requests 126c40487d4SMatt Macy 127c40487d4SMatt Macy#### General 128c40487d4SMatt Macy 1297877fdebSMatt Macy* All pull requests, except backports and releases, must be based on the current master branch 1307877fdebSMatt Macyand should apply without conflicts. 131c40487d4SMatt Macy* Please attempt to limit pull requests to a single commit which resolves 132c40487d4SMatt Macyone specific issue. 133c40487d4SMatt Macy* Make sure your commit messages are in the correct format. See the 134c40487d4SMatt Macy[Commit Message Formats](#commit-message-formats) section for more information. 135c40487d4SMatt Macy* When updating a pull request squash multiple commits by performing a 136c40487d4SMatt Macy[rebase](https://git-scm.com/docs/git-rebase) (squash). 137c40487d4SMatt Macy* For large pull requests consider structuring your changes as a stack of 138c40487d4SMatt Macylogically independent patches which build on each other. This makes large 139c40487d4SMatt Macychanges easier to review and approve which speeds up the merging process. 140c40487d4SMatt Macy* Try to keep pull requests simple. Simple code with comments is much easier 141c40487d4SMatt Macyto review and approve. 142c40487d4SMatt Macy* All proposed changes must be approved by an OpenZFS organization member. 143c40487d4SMatt Macy* If you have an idea you'd like to discuss or which requires additional testing, consider opening it as a draft pull request. 144c40487d4SMatt MacyOnce everything is in good shape and the details have been worked out you can remove its draft status. 145c40487d4SMatt MacyAny required reviews can then be finalized and the pull request merged. 146c40487d4SMatt Macy 147c40487d4SMatt Macy#### Tests and Benchmarks 148*7a7741afSMartin Matuska* Every pull request is tested using a GitHub Actions workflow on multiple platforms by running the [zfs-tests.sh and zloop.sh]( 149c40487d4SMatt Macyhttps://openzfs.github.io/openzfs-docs/Developer%20Resources/Building%20ZFS.html#running-zloop-sh-and-zfs-tests-sh) test suites. 150*7a7741afSMartin Matuska`.github/workflows/scripts/generate-ci-type.py` is used to determine whether the pull request is nonbehavior, i.e., not introducing behavior changes of any code, configuration or tests. If so, the CI will run on fewer platforms and only essential sanity tests will run. You can always override this by adding `ZFS-CI-Type` line to your commit message: 151*7a7741afSMartin Matuska * If your last commit (or `HEAD` in git terms) contains a line `ZFS-CI-Type: quick`, quick mode is forced regardless of what files are changed. 152*7a7741afSMartin Matuska * Otherwise, if any commit in a PR contains a line `ZFS-CI-Type: full`, full mode is forced. 153c40487d4SMatt Macy* To verify your changes conform to the [style guidelines]( 154c40487d4SMatt Macyhttps://github.com/openzfs/zfs/blob/master/.github/CONTRIBUTING.md#style-guides 155c40487d4SMatt Macy), please run `make checkstyle` and resolve any warnings. 156*7a7741afSMartin Matuska* Code analysis is performed by [CodeQL](https://codeql.github.com/) for each pull request. 157*7a7741afSMartin Matuska* Test cases should be provided when appropriate. This includes making sure new features have adequate code coverage. 158c40487d4SMatt Macy* If your pull request improves performance, please include some benchmarks. 159*7a7741afSMartin Matuska* The pull request must pass all CI checks before being accepted. 160c40487d4SMatt Macy 161c40487d4SMatt Macy### Testing 162c40487d4SMatt MacyAll help is appreciated! If you're in a position to run the latest code 163c40487d4SMatt Macyconsider helping us by reporting any functional problems, performance 164c40487d4SMatt Macyregressions or other suspected issues. By running the latest code to a wide 165c40487d4SMatt Macyrange of realistic workloads, configurations and architectures we're better 166c40487d4SMatt Macyable quickly identify and resolve potential issues. 167c40487d4SMatt Macy 168c40487d4SMatt MacyUsers can also run the [ZFS Test 169c40487d4SMatt MacySuite](https://github.com/openzfs/zfs/tree/master/tests) on their systems 170c40487d4SMatt Macyto verify ZFS is behaving as intended. 171c40487d4SMatt Macy 172c40487d4SMatt Macy## Style Guides 173c40487d4SMatt Macy 174c40487d4SMatt Macy### Repository Structure 175c40487d4SMatt Macy 176c40487d4SMatt MacyOpenZFS uses a standardised branching structure. 177c40487d4SMatt Macy- The "development and main branch", is the branch all development should be based on. 178c40487d4SMatt Macy- "Release branches" contain the latest released code for said version. 179c40487d4SMatt Macy- "Staging branches" contain selected commits prior to being released. 180c40487d4SMatt Macy 181c40487d4SMatt Macy**Branch Names:** 182c40487d4SMatt Macy- Development and Main branch: `master` 183c40487d4SMatt Macy- Release branches: `zfs-$VERSION-release` 184c40487d4SMatt Macy- Staging branches: `zfs-$VERSION-staging` 185c40487d4SMatt Macy 186c40487d4SMatt Macy`$VERSION` should be replaced with the `major.minor` version number. 187c40487d4SMatt Macy_(This is the version number without the `.patch` version at the end)_ 188c40487d4SMatt Macy 189c40487d4SMatt Macy### Coding Conventions 190c40487d4SMatt MacyWe currently use [C Style and Coding Standards for 191c40487d4SMatt MacySunOS](http://www.cis.upenn.edu/%7Elee/06cse480/data/cstyle.ms.pdf) as our 192c40487d4SMatt Macycoding convention. 193c40487d4SMatt Macy 194c40487d4SMatt MacyThis repository has an `.editorconfig` file. If your editor [supports 195c40487d4SMatt Macyeditorconfig](https://editorconfig.org/#download), it will 196c40487d4SMatt Macyautomatically respect most of this project's whitespace preferences. 197c40487d4SMatt Macy 198c40487d4SMatt MacyAdditionally, Git can help warn on whitespace problems as well: 199c40487d4SMatt Macy 200c40487d4SMatt Macy``` 201c40487d4SMatt Macygit config --local core.whitespace trailing-space,space-before-tab,indent-with-non-tab,-tab-in-indent 202c40487d4SMatt Macy``` 203c40487d4SMatt Macy 204c40487d4SMatt Macy### Commit Message Formats 205c40487d4SMatt Macy#### New Changes 206c40487d4SMatt MacyCommit messages for new changes must meet the following guidelines: 207c40487d4SMatt Macy* In 72 characters or less, provide a summary of the change as the 208c40487d4SMatt Macyfirst line in the commit message. 209c40487d4SMatt Macy* A body which provides a description of the change. If necessary, 210c40487d4SMatt Macyplease summarize important information such as why the proposed 211c40487d4SMatt Macyapproach was chosen or a brief description of the bug you are resolving. 212c40487d4SMatt MacyEach line of the body must be 72 characters or less. 213c40487d4SMatt Macy* The last line must be a `Signed-off-by:` tag. See the 214c40487d4SMatt Macy[Signed Off By](#signed-off-by) section for more information. 215c40487d4SMatt Macy 216c40487d4SMatt MacyAn example commit message for new changes is provided below. 217c40487d4SMatt Macy 218c40487d4SMatt Macy``` 219c40487d4SMatt MacyThis line is a brief summary of your change 220c40487d4SMatt Macy 221c40487d4SMatt MacyPlease provide at least a couple sentences describing the 222c40487d4SMatt Macychange. If necessary, please summarize decisions such as 223c40487d4SMatt Macywhy the proposed approach was chosen or what bug you are 224c40487d4SMatt Macyattempting to solve. 225c40487d4SMatt Macy 226c40487d4SMatt MacySigned-off-by: Contributor <contributor@email.com> 227c40487d4SMatt Macy``` 228c40487d4SMatt Macy 229c40487d4SMatt Macy#### Coverity Defect Fixes 230c40487d4SMatt MacyIf you are submitting a fix to a 231c40487d4SMatt Macy[Coverity defect](https://scan.coverity.com/projects/zfsonlinux-zfs), 232c40487d4SMatt Macythe commit message should meet the following guidelines: 233c40487d4SMatt Macy* Provides a subject line in the format of 234c40487d4SMatt Macy`Fix coverity defects: CID dddd, dddd...` where `dddd` represents 235c40487d4SMatt Macyeach CID fixed by the commit. 236c40487d4SMatt Macy* Provides a body which lists each Coverity defect and how it was corrected. 237c40487d4SMatt Macy* The last line must be a `Signed-off-by:` tag. See the 238c40487d4SMatt Macy[Signed Off By](#signed-off-by) section for more information. 239c40487d4SMatt Macy 240c40487d4SMatt MacyAn example Coverity defect fix commit message is provided below. 241c40487d4SMatt Macy``` 242c40487d4SMatt MacyFix coverity defects: CID 12345, 67890 243c40487d4SMatt Macy 244c40487d4SMatt MacyCID 12345: Logically dead code (DEADCODE) 245c40487d4SMatt Macy 246c40487d4SMatt MacyRemoved the if(var != 0) block because the condition could never be 247c40487d4SMatt Macysatisfied. 248c40487d4SMatt Macy 249c40487d4SMatt MacyCID 67890: Resource Leak (RESOURCE_LEAK) 250c40487d4SMatt Macy 251c40487d4SMatt MacyEnsure free is called after allocating memory in function(). 252c40487d4SMatt Macy 253c40487d4SMatt MacySigned-off-by: Contributor <contributor@email.com> 254c40487d4SMatt Macy``` 255c40487d4SMatt Macy 256c40487d4SMatt Macy#### Signed Off By 257c40487d4SMatt MacyA line tagged as `Signed-off-by:` must contain the developer's 258c40487d4SMatt Macyname followed by their email. This is the developer's certification 259c40487d4SMatt Macythat they have the right to submit the patch for inclusion into 260c40487d4SMatt Macythe code base and indicates agreement to the [Developer's Certificate 261c40487d4SMatt Macyof Origin](https://www.kernel.org/doc/html/latest/process/submitting-patches.html#sign-your-work-the-developer-s-certificate-of-origin). 262c40487d4SMatt MacyCode without a proper signoff cannot be merged. 263c40487d4SMatt Macy 264c40487d4SMatt MacyGit can append the `Signed-off-by` line to your commit messages. Simply 265c40487d4SMatt Macyprovide the `-s` or `--signoff` option when performing a `git commit`. 266c40487d4SMatt MacyFor more information about writing commit messages, visit [How to Write 267c40487d4SMatt Macya Git Commit Message](https://chris.beams.io/posts/git-commit/). 268c40487d4SMatt Macy 269c40487d4SMatt Macy#### Co-authored By 270c40487d4SMatt MacyIf someone else had part in your pull request, please add the following to the commit: 271c40487d4SMatt Macy`Co-authored-by: Name <gitregistered@email.address>` 272c40487d4SMatt MacyThis is useful if their authorship was lost during squashing, rebasing, etc., 273c40487d4SMatt Macybut may be used in any situation where there are co-authors. 274c40487d4SMatt Macy 275c40487d4SMatt MacyThe email address used here should be the same as on the GitHub profile of said user. 276c40487d4SMatt MacyIf said user does not have their email address public, please use the following instead: 277c40487d4SMatt Macy`Co-authored-by: Name <[username]@users.noreply.github.com>` 278