Commit f0deb97a authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'driver-core-next' of...

Merge branch 'driver-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6

* 'driver-core-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6:
  updated Documentation/ja_JP/SubmittingPatches
  debugfs: add documentation for debugfs_create_x64
  uio: uio_pdrv_genirq: Add OF support
  firmware: gsmi: remove sysfs entries when unload the module
  Documentation/zh_CN: Fix messy code file email-clients.txt
  driver core: add more help description for "path to uevent helper"
  driver-core: modify FIRMWARE_IN_KERNEL help message
  driver-core: Kconfig grammar corrections in firmware configuration
  DOCUMENTATION: Replace create_device() with device_create().
  DOCUMENTATION: Update overview.txt in Doc/driver-model.
  pti: pti_tty_install documentation mispelling.
parents 18447502 21d541aa
...@@ -104,4 +104,4 @@ Then in the module init function is would do: ...@@ -104,4 +104,4 @@ Then in the module init function is would do:
And assuming 'dev' is the struct device passed into the probe hook, the driver And assuming 'dev' is the struct device passed into the probe hook, the driver
probe function would do something like: probe function would do something like:
create_device(&mydriver_class, dev, chrdev, &private_data, "my_name"); device_create(&mydriver_class, dev, chrdev, &private_data, "my_name");
...@@ -30,7 +30,7 @@ management, and hot plug. In particular, the model dictated by Intel and ...@@ -30,7 +30,7 @@ management, and hot plug. In particular, the model dictated by Intel and
Microsoft (namely ACPI) ensures that almost every device on almost any bus Microsoft (namely ACPI) ensures that almost every device on almost any bus
on an x86-compatible system can work within this paradigm. Of course, on an x86-compatible system can work within this paradigm. Of course,
not every bus is able to support all such operations, although most not every bus is able to support all such operations, although most
buses support a most of those operations. buses support most of those operations.
Downstream Access Downstream Access
...@@ -46,25 +46,29 @@ struct pci_dev now looks like this: ...@@ -46,25 +46,29 @@ struct pci_dev now looks like this:
struct pci_dev { struct pci_dev {
... ...
struct device dev; struct device dev; /* Generic device interface */
...
}; };
Note first that it is statically allocated. This means only one allocation on Note first that the struct device dev within the struct pci_dev is
device discovery. Note also that it is at the _end_ of struct pci_dev. This is statically allocated. This means only one allocation on device discovery.
to make people think about what they're doing when switching between the bus
driver and the global driver; and to prevent against mindless casts between Note also that that struct device dev is not necessarily defined at the
the two. front of the pci_dev structure. This is to make people think about what
they're doing when switching between the bus driver and the global driver,
and to discourage meaningless and incorrect casts between the two.
The PCI bus layer freely accesses the fields of struct device. It knows about The PCI bus layer freely accesses the fields of struct device. It knows about
the structure of struct pci_dev, and it should know the structure of struct the structure of struct pci_dev, and it should know the structure of struct
device. Individual PCI device drivers that have been converted to the current device. Individual PCI device drivers that have been converted to the current
driver model generally do not and should not touch the fields of struct device, driver model generally do not and should not touch the fields of struct device,
unless there is a strong compelling reason to do so. unless there is a compelling reason to do so.
This abstraction is prevention of unnecessary pain during transitional phases. The above abstraction prevents unnecessary pain during transitional phases.
If the name of the field changes or is removed, then every downstream driver If it were not done this way, then when a field was renamed or removed, every
will break. On the other hand, if only the bus layer (and not the device downstream driver would break. On the other hand, if only the bus layer
layer) accesses struct device, it is only that layer that needs to change. (and not the device layer) accesses the struct device, it is only the bus
layer that needs to change.
User Interface User Interface
...@@ -73,15 +77,27 @@ User Interface ...@@ -73,15 +77,27 @@ User Interface
By virtue of having a complete hierarchical view of all the devices in the By virtue of having a complete hierarchical view of all the devices in the
system, exporting a complete hierarchical view to userspace becomes relatively system, exporting a complete hierarchical view to userspace becomes relatively
easy. This has been accomplished by implementing a special purpose virtual easy. This has been accomplished by implementing a special purpose virtual
file system named sysfs. It is hence possible for the user to mount the file system named sysfs.
whole sysfs filesystem anywhere in userspace.
Almost all mainstream Linux distros mount this filesystem automatically; you
can see some variation of the following in the output of the "mount" command:
$ mount
...
none on /sys type sysfs (rw,noexec,nosuid,nodev)
...
$
The auto-mounting of sysfs is typically accomplished by an entry similar to
the following in the /etc/fstab file:
none /sys sysfs defaults 0 0
This can be done permanently by providing the following entry into the or something similar in the /lib/init/fstab file on Debian-based systems:
/etc/fstab (under the provision that the mount point does exist, of course):
none /sys sysfs defaults 0 0 none /sys sysfs nodev,noexec,nosuid 0 0
Or by hand on the command line: If sysfs is not automatically mounted, you can always do it manually with:
# mount -t sysfs sysfs /sys # mount -t sysfs sysfs /sys
......
...@@ -73,8 +73,8 @@ the following functions can be used instead: ...@@ -73,8 +73,8 @@ the following functions can be used instead:
struct dentry *parent, u16 *value); struct dentry *parent, u16 *value);
struct dentry *debugfs_create_x32(const char *name, mode_t mode, struct dentry *debugfs_create_x32(const char *name, mode_t mode,
struct dentry *parent, u32 *value); struct dentry *parent, u32 *value);
struct dentry *debugfs_create_x64(const char *name, mode_t mode,
Note that there is no debugfs_create_x64(). struct dentry *parent, u64 *value);
These functions are useful as long as the developer knows the size of the These functions are useful as long as the developer knows the size of the
value to be exported. Some types can have different widths on different value to be exported. Some types can have different widths on different
......
...@@ -11,16 +11,18 @@ for non English (read: Japanese) speakers and is not intended as a ...@@ -11,16 +11,18 @@ for non English (read: Japanese) speakers and is not intended as a
fork. So if you have any comments or updates of this file, please try fork. So if you have any comments or updates of this file, please try
to update the original English file first. to update the original English file first.
Last Updated: 2007/10/24 Last Updated: 2011/06/09
================================== ==================================
これは、 これは、
linux-2.6.23/Documentation/SubmittingPatches の和訳 linux-2.6.39/Documentation/SubmittingPatches の和訳
です。 です。
翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ > 翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ >
翻訳日: 2007/10/17 翻訳日: 2011/06/09
翻訳者: Keiichi Kii <k-keiichi at bx dot jp dot nec dot com> 翻訳者: Keiichi Kii <k-keiichi at bx dot jp dot nec dot com>
校正者: Masanari Kobayashi さん <zap03216 at nifty dot ne dot jp> 校正者: Masanari Kobayashi さん <zap03216 at nifty dot ne dot jp>
Matsukura さん <nbh--mats at nifty dot com> Matsukura さん <nbh--mats at nifty dot com>
Takeshi Hamasaki さん <hmatrjp at users dot sourceforge dot jp>
================================== ==================================
Linux カーネルに変更を加えるための Howto Linux カーネルに変更を加えるための Howto
...@@ -97,7 +99,7 @@ Quilt: ...@@ -97,7 +99,7 @@ Quilt:
http://savannah.nongnu.org/projects/quilt http://savannah.nongnu.org/projects/quilt
Andrew Morton's patch scripts: Andrew Morton's patch scripts:
http://userweb.kernel.org/~akpm/stuff/tpp.txt http://userweb.kernel.org/~akpm/stuff/patch-scripts.tar.gz
このリンクの先のスクリプトの代わりとして、quilt がパッチマネジメント このリンクの先のスクリプトの代わりとして、quilt がパッチマネジメント
ツールとして推奨されています(上のリンクを見てください)。 ツールとして推奨されています(上のリンクを見てください)。
...@@ -109,9 +111,25 @@ http://userweb.kernel.org/~akpm/stuff/tpp.txt ...@@ -109,9 +111,25 @@ http://userweb.kernel.org/~akpm/stuff/tpp.txt
「ドライバー X に対するバグフィックス」あるいは「このパッチはサブシス 「ドライバー X に対するバグフィックス」あるいは「このパッチはサブシス
テム X に対する更新を含んでいます。どうか取り入れてください。」などです。 テム X に対する更新を含んでいます。どうか取り入れてください。」などです。
パッチの説明を Linux カーネルのソースコードマネジメントシステム「 git 」の
コミットログとして簡単に引用できる形で書けば、メンテナから感謝されるでしょう。
以下の #15 を見てください。
説明が長くなりだしたのであれば、おそらくそれはパッチを分ける必要がある 説明が長くなりだしたのであれば、おそらくそれはパッチを分ける必要がある
という兆候です。次の #3 を見てください。 という兆候です。次の #3 を見てください。
パッチ(シリーズ)を(再)投稿する時、十分なパッチの説明とそのパッチが必要な理由を
パッチに含めてください。ただ「これはパッチ(シリーズ)のバージョン N」とだけ
書かないでください。そして、パッチをマージする人にパッチの説明を探させそれを
パッチに追記させるため、過去のバージョンのパッチやそのパッチの URL を参照する
手間をかけさせないでください。
つまり、パッチシリーズとその説明は一緒にあるべきです。これはパッチをマージする
人、レビューする人、どちらのためにもなります。レビューする人の中には、おそらく
過去のバージョンのパッチを受け取ってもいない人がいます。
登録済みのバグエントリを修正するパッチであれば、そのバグエントリを示すバグ ID
や URL を明記してください。
3) パッチの分割 3) パッチの分割
意味のあるひとまとまりごとに変更を個々のパッチファイルに分けてください。 意味のあるひとまとまりごとに変更を個々のパッチファイルに分けてください。
...@@ -141,7 +159,7 @@ http://userweb.kernel.org/~akpm/stuff/tpp.txt ...@@ -141,7 +159,7 @@ http://userweb.kernel.org/~akpm/stuff/tpp.txt
拒否されるでしょう。 拒否されるでしょう。
あなたはパッチを投稿する前に最低限パッチスタイルチェッカー あなたはパッチを投稿する前に最低限パッチスタイルチェッカー
( scripts/patchcheck.pl )を利用してパッチをチェックすべきです。 ( scripts/checkpatch.pl )を利用してパッチをチェックすべきです。
もしパッチに違反がのこっているならば、それらの全てについてあなたは正当な もしパッチに違反がのこっているならば、それらの全てについてあなたは正当な
理由を示せるようにしておく必要があります。 理由を示せるようにしておく必要があります。
...@@ -192,13 +210,13 @@ VGER.KERNEL.ORG でホスティングされているメーリングリストの ...@@ -192,13 +210,13 @@ VGER.KERNEL.ORG でホスティングされているメーリングリストの
情報がマニュアルページの中に入ってくるように、変更が起きたという 情報がマニュアルページの中に入ってくるように、変更が起きたという
通知を送ってください。 通知を送ってください。
たとえ、メンテナが #4 で反応がなかったとしても、メンテナのコードに変更を たとえ、メンテナが #5 で反応がなかったとしても、メンテナのコードに変更を
加えたときには、いつもメンテナに CC するのを忘れないようにしてください。 加えたときには、いつもメンテナに CC するのを忘れないようにしてください。
小さなパッチであれば、Adrian Bunk が管理している Trivial Patch Monkey 小さなパッチであれば、Trivial Patch Monkey(ちょっとしたパッチを集めている)
(ちょっとしたパッチを集めている)<trivial@kernel.org>に CC してもいい <trivial@kernel.org>に CC してもいいです。その現管理者については MAINTAINERS
です。ちょっとしたパッチとは以下のルールのどれか1つを満たしていなけ ファイルを見てください。ちょっとしたパッチとは以下のルールのどれか1つを満たして
ればなりません。 いなければなりません。
・ドキュメントのスペルミスの修正 ・ドキュメントのスペルミスの修正
・grep(1) コマンドによる検索を困難にしているスペルの修正 ・grep(1) コマンドによる検索を困難にしているスペルの修正
・コンパイル時の警告の修正(無駄な警告が散乱することは好ましくないた ・コンパイル時の警告の修正(無駄な警告が散乱することは好ましくないた
...@@ -210,7 +228,6 @@ VGER.KERNEL.ORG でホスティングされているメーリングリストの ...@@ -210,7 +228,6 @@ VGER.KERNEL.ORG でホスティングされているメーリングリストの
・移植性のないコードから移植性のあるコードへの置き換え(小さい範囲で ・移植性のないコードから移植性のあるコードへの置き換え(小さい範囲で
あればアーキテクチャ特有のことでも他の人がコピーできます) あればアーキテクチャ特有のことでも他の人がコピーできます)
・作者やメンテナによる修正(すなわち patch monkey の再転送モード) ・作者やメンテナによる修正(すなわち patch monkey の再転送モード)
EMAIL: <trivial@kernel.org>
7) MIME やリンクや圧縮ファイルや添付ファイルではなくプレインテキストのみ 7) MIME やリンクや圧縮ファイルや添付ファイルではなくプレインテキストのみ
...@@ -233,26 +250,15 @@ MIME 形式の添付ファイルは Linus に手間を取らせることにな ...@@ -233,26 +250,15 @@ MIME 形式の添付ファイルは Linus に手間を取らせることにな
例外:お使いの電子メールクライアントがパッチをめちゃくちゃにするので 例外:お使いの電子メールクライアントがパッチをめちゃくちゃにするので
あれば、誰かが MIME 形式のパッチを再送するよう求めるかもしれません。 あれば、誰かが MIME 形式のパッチを再送するよう求めるかもしれません。
警告: Mozilla のような特定の電子メールクライアントは電子メールの 余計な変更を加えずにあなたのパッチを送信するための電子メールクライアントの設定
ヘッダに以下のものを付加して送ります。 のヒントについては Documentation/email-clients.txt を参照してください。
---- message header ----
Content-Type: text/plain; charset=us-ascii; format=flowed
---- message header ----
問題は、「 format=flowed 」が付いた電子メールを特定の受信側の電子メール
クライアントがタブをスペースに置き換えるというような変更をすることです。
したがって送られてきたパッチは壊れているように見えるでしょう。
これを修正するには、mozilla の defaults/pref/mailnews.js ファイルを
以下のように修正します。
pref("mailnews.send_plaintext_flowed", false); // RFC 2646=======
pref("mailnews.display.disable_format_flowed_support", true);
8) 電子メールのサイズ 8) 電子メールのサイズ
パッチを Linus へ送るときは常に #7 の手順に従ってください。 パッチを Linus へ送るときは常に #7 の手順に従ってください。
大きなパッチはメーリングリストやメンテナにとって不親切です。パッチが 大きなパッチはメーリングリストやメンテナにとって不親切です。パッチが
未圧縮で 40KB を超えるようであるなら、インターネット上のアクセス可能な 未圧縮で 300KB を超えるようであるなら、インターネット上のアクセス可能な
サーバに保存し、保存場所を示す URL を伝えるほうが適切です。 サーバに保存し、保存場所を示す URL を伝えるほうが適切です。
9) カーネルバージョンの明記 9) カーネルバージョンの明記
...@@ -324,7 +330,7 @@ Linus や LKML への大量の電子メールのために、サブジェクト ...@@ -324,7 +330,7 @@ Linus や LKML への大量の電子メールのために、サブジェクト
(c) 本寄与は(a)、(b)、(c)を証明する第3者から私へ直接提供された (c) 本寄与は(a)、(b)、(c)を証明する第3者から私へ直接提供された
ものであり、私はそれに変更を加えていない。 ものであり、私はそれに変更を加えていない。
(d) 私はこのプロジェクトと本寄与が公のものであることに理解及び同意す (d) 私はこのプロジェクトと本寄与が公のものであることに理解及び同意す
る。同時に、関与した記録(投稿の際の全ての個人情報と sign-off を る。同時に、関与した記録(投稿の際の全ての個人情報と sign-off を
含む)が無期限に保全されることと、当該プロジェクト又は関連する 含む)が無期限に保全されることと、当該プロジェクト又は関連する
オープンソースライセンスに沿った形で再配布されることに理解及び オープンソースライセンスに沿った形で再配布されることに理解及び
...@@ -340,7 +346,51 @@ Linus や LKML への大量の電子メールのために、サブジェクト ...@@ -340,7 +346,51 @@ Linus や LKML への大量の電子メールのために、サブジェクト
無視されますが、あなたはそのタグを社内の手続きに利用したり、sign-off に特別 無視されますが、あなたはそのタグを社内の手続きに利用したり、sign-off に特別
な情報を示したりすることができます。 な情報を示したりすることができます。
13) いつ Acked-by: を使うのか あなたがサブシステムまたはブランチのメンテナであれば、受け取ったパッチを自身の
ツリーにマージするために、わずかに変更が必要となる場合があります。なぜなら
あなたのツリーの中のコードと投稿者のツリーの中のコードは同一ではないためです。
もし、あなたが厳密に上記ルール(c)にこだわるのであれば、投稿者に再度差分を
とるよう依頼すべきです。しかし、これは時間とエネルギーを非生産的に浪費する
ことになります。ルール(b)はあなたにコードを修正する権利を与えてくれます。
しかし、投稿者のコードを修正し、その修正によるバグを投稿者に押し付けてしまう
ことはとても失礼なことです。この問題を解決するために、末尾の投稿者の
Signed-off-by とあなたがその末尾に追加する Signed-off-by の間に、修正を
加えたことを示す1行を追加することが推奨されています。
(その1行の書き方に)決まりはありませんが、大括弧の中に電子メールアドレスや氏名
と修正内容を記載するやり方は目につきやすく、最終段階での変更の責任があなたに
あることを明確にするのに十分な方法のようです。例えば、
Signed-off-by: Random J Developer <random@developer.example.org>
[lucky@maintainer.example.org: struct foo moved from foo.c to foo.h]
Signed-off-by: Lucky K Maintainer <lucky@maintainer.example.org>
あなたが安定版のブランチを管理しており、作成者のクレジット、変更の追跡、
修正のマージ、と同時に苦情からの投稿者の保護を行いたい場合、この慣習は特に
有用となります。いかなる事情があってもチェンジログに出てくる作成者の
アイデンティティ情報(From ヘッダ)は変更できないことに注意してください。
バックポートする人のための特別な注意事項。追跡を容易に行うために、コミット
メッセージのトップ(サブジェクト行のすぐ後)にパッチの起源を示す情報を記述する
ことは一般的で有用な慣習です。例えば、これは 2.6-stable ツリーでの一例です。
Date: Tue May 13 19:10:30 2008 +0000
SCSI: libiscsi regression in 2.6.25: fix nop timer handling
commit 4cf1043593db6a337f10e006c23c69e5fc93e722 upstream
そして、これは 2.4 ツリーでの一例です。
Date: Tue May 13 22:12:27 2008 +0200
wireless, airo: waitbusy() won't delay
[backport of 2.6 commit b7acbdfbd1f277c1eb23f344f899cfa4cd0bf36a]
どんな形式であれ、この情報はあなたのツリーを追跡する人やあなたのツリーのバグを
解決しようとしている人にとって価値のある支援となります。
13) いつ Acked-by: と Cc: を使うのか
「 Signed-off-by: 」タグはその署名者がパッチの開発に関わっていたことやパッチ 「 Signed-off-by: 」タグはその署名者がパッチの開発に関わっていたことやパッチ
の伝播パスにいたことを示しています。 の伝播パスにいたことを示しています。
...@@ -354,7 +404,7 @@ Linus や LKML への大量の電子メールのために、サブジェクト ...@@ -354,7 +404,7 @@ Linus や LKML への大量の電子メールのために、サブジェクト
Acked-by: は Signed-off-by: のように公式なタグではありません。それはメンテナが Acked-by: は Signed-off-by: のように公式なタグではありません。それはメンテナが
少なくともパッチをレビューし、同意を示しているという記録です。そのような 少なくともパッチをレビューし、同意を示しているという記録です。そのような
ことからパッチの統合者がメンテナの「うん、良いと思うよ」という発言を ことからパッチをマージする人がメンテナの「うん、良いと思うよ」という発言を
Acked-by: へ置き換えることがあります。 Acked-by: へ置き換えることがあります。
Acked-by: が必ずしもパッチ全体の承認を示しているわけではありません。例えば、 Acked-by: が必ずしもパッチ全体の承認を示しているわけではありません。例えば、
...@@ -364,7 +414,62 @@ Acked-by: が必ずしもパッチ全体の承認を示しているわけでは ...@@ -364,7 +414,62 @@ Acked-by: が必ずしもパッチ全体の承認を示しているわけでは
この点は、ご自分で判断してください。(その Acked-by: が)疑わしい場合は、 この点は、ご自分で判断してください。(その Acked-by: が)疑わしい場合は、
メーリングリストアーカイブの中の大元の議論を参照すべきです。 メーリングリストアーカイブの中の大元の議論を参照すべきです。
14) 標準的なパッチのフォーマット パッチにコメントする機会を持っていたが、その時にコメントしなかった人がいれば、
その人を指す「Cc:」タグを任意で追加してもかまいません。これは指定された人からの
明確なアクションなしに付与できる唯一のタグです。
このタグはパッチに関心があると思われる人達がそのパッチの議論に含まれていたこと
を明文化します。
14) Reported-by と Tested-by: と Reviewed-by: の利用
他の誰かによって報告された問題を修正するパッチであれば、問題報告者という寄与を
クレジットするために、Reported-by: タグを追加することを検討してください。
こまめにバグ報告者をクレジットしていくことで、うまくいけばその人たちが将来再び
コミュニティの力となってくれるでしょう。
ただし、報告者の許可無くこのタグを追加しないように注意してください。特に、
問題が公の場で報告されていなかったのであれば。
Tested-by: タグはタグで指定された人によって(ある環境下で)パッチのテストに成功
していることを示します。このタグはメンテナにテストが実施済みであることを
知らせ、将来の関連パッチのテスト協力者を見つける方法を提供し、テスト実施者に
対するクレジットを保証します。
Reviewed-by: タグは、それとは異なり、下記のレビューア宣言の下にレビューされ、
受け入れ可能とみなされたパッチであることを示します。
レビューアによる監督宣言
私は Reviewed-by: タグを提示することによって、以下のことを明言する。
(a) 私はメインラインカーネルへの統合に向け、その妥当性及び「即応性
(訳注)」を検証し、技術的側面からパッチをレビュー済みである。
訳注:
「即応性」の原文は "readiness"。
パッチが十分な品質を持っており、メインラインカーネルへの統合を即座に
行うことができる状態であるかどうかを "readiness" という単語で表現
している。
(b) パッチに関するあらゆる問題、懸念、あるいは、疑問は投稿者へ伝達済み
である。私はそれらのコメントに対する投稿者の返答に満足している。
(c) 投稿に伴い改良されるコードがある一方で、現時点で、私は(1)それが
カーネルにとって価値のある変更であること、そして、(2)統合に際して
議論になり得るような問題はないものと確信している。
(d) 私はパッチをレビューし適切であると確信している一方で、あらゆる
状況においてその宣言した目的や機能が正しく実現することに関して、
いかなる保証もしない(特にどこかで明示しない限り)。
Reviewd-by タグはそのパッチがカーネルに対して適切な修正であって、深刻な技術的
問題を残していないという意見の宣言です。興味のあるレビューアは誰でも(レビュー
作業を終えたら)パッチに対して Reviewed-by タグを提示できます。このタグは
レビューアの寄与をクレジットする働き、レビューの進捗の度合いをメンテナに
知らせる働きを持ちます。そのパッチの領域に詳しく、そして、しっかりとした
レビューを実施したレビューアによって提供される時、Reviewed-by: タグがあなたの
パッチをカーネルにマージする可能性を高めるでしょう。
15) 標準的なパッチのフォーマット
標準的なパッチのサブジェクトは以下のとおりです。 標準的なパッチのサブジェクトは以下のとおりです。
...@@ -396,18 +501,37 @@ Acked-by: が必ずしもパッチ全体の承認を示しているわけでは ...@@ -396,18 +501,37 @@ Acked-by: が必ずしもパッチ全体の承認を示しているわけでは
電子メールのサブジェクト内のサブシステム表記は、パッチが適用される 電子メールのサブジェクト内のサブシステム表記は、パッチが適用される
分野またはサブシステムを識別できるようにすべきです。 分野またはサブシステムを識別できるようにすべきです。
電子メールのサブジェクトの「概要の言い回し」はそのパッチの概要を正確 電子メールのサブジェクトの「summary phrase」はそのパッチの概要を正確
に表現しなければなりません。「概要の言い回し」をファイル名にしてはい に表現しなければなりません。「summary phrase」をファイル名にしてはい
けません。一連のパッチ中でそれぞれのパッチは同じ「概要の言い回し」を けません。パッチシリーズ中でそれぞれのパッチは同じ「summary phrase」を
使ってはいけません(「一連のパッチ」とは順序付けられた関連のある複数の 使ってはいけません(「パッチシリーズ」とは順序付けられた関連のある複数の
パッチ群です)。 パッチ群です)。
あなたの電子メールの「概要の言い回し」がそのパッチにとって世界で唯 あなたの電子メールの「summary phrase」がそのパッチにとって世界で唯一の識別子に
一の識別子になるように心がけてください。「概要の言い回し」は git の なるように心がけてください。「summary phrase」は git のチェンジログの中へ
チェンジログの中へずっと伝播していきます。「概要の言い回し」は、開 ずっと伝播していきます。「summary phrase」は、開発者が後でパッチを参照する
発者が後でパッチを参照するために議論の中で利用するかもしれません。 ために議論の中で利用するかもしれません。
人々はそのパッチに関連した議論を読むために「概要の言い回し」を使って 人々はそのパッチに関連した議論を読むために「summary phrase」を使って google で
google で検索したがるでしょう。 検索したがるでしょう。それはまた2、3ヶ月あとで、人々が「gitk」や
「git log --oneline」のようなツールを使用して何千ものパッチに目を通す時、
唯一目にとまる情報となるでしょう。
これらの理由のため、「summary phrase」はなぜパッチが必要であるか、パッチが何を
変更するかの2つの情報をせいぜい70〜75文字で表現していなければなりません。
「summary phrase」は簡潔であり説明的である表現を目指しつつ、うまく
まとめられている概要となるべきです。
「summary phrase」は「Subject: [PATCH tag] <summary phrase>」のように、
大括弧で閉じられたタグを接頭辞として付加してもかまいません。このタグは
「summary phrase」の一部とは考えませんが、パッチをどのように取り扱うべきかを
表現します。
一般的には「v1, v2, v3」のようなバージョン情報を表すタグ(過去のパッチに対する
コメントを反映するために複数のバージョンのパッチが投稿されているのであれば)、
「RFC」のようなコメントを要求するタグが挙げられます。パッチシリーズとして4つの
パッチがあれば、個々のパッチに「1/4, 2/4, 3/4, 4/4」のように番号を付けても
かまいません。これは開発者がパッチを適用する順番を確実に把握するためです。
そして、開発者がパッチシリーズの中のすべてのパッチをもらさずレビュー或いは
適用するのを保証するためです。
サブジェクトの例を二つ サブジェクトの例を二つ
...@@ -426,7 +550,12 @@ google で検索したがるでしょう。 ...@@ -426,7 +550,12 @@ google で検索したがるでしょう。
説明本体は無期限のソースのチェンジログにコミットされます。なので、説明 説明本体は無期限のソースのチェンジログにコミットされます。なので、説明
本体はそのパッチに至った議論の詳細を忘れているある程度の技量を持っている人 本体はそのパッチに至った議論の詳細を忘れているある程度の技量を持っている人
がその詳細を思い出すことができるものでなければなりません。 がその詳細を思い出すことができるものでなければなりません。パッチが対処する
障害の症状(カーネルログメッセージや oops メッセージ等)を記載することは問題に
対処可能なパッチを求めてコミットログを検索する人々にとって特に有用です。
パッチがコンパイル問題を解決するのであれば、そのパッチを探している人が見つける
ことができる情報だけで十分であり、コンパイル時の全てのエラーを含める必要は
ありません。「summary phrase」と同様に、簡潔であり説明的であることが重要です。
「 --- 」マーカー行はパッチ処理ツールに対して、チェンジログメッセージの終端 「 --- 」マーカー行はパッチ処理ツールに対して、チェンジログメッセージの終端
部分を認識させるという重要な役目を果たします。 部分を認識させるという重要な役目を果たします。
...@@ -436,14 +565,46 @@ google で検索したがるでしょう。 ...@@ -436,14 +565,46 @@ google で検索したがるでしょう。
追加され何行消されたかを示すものです。diffstat コマンドは特に大きなパッチに 追加され何行消されたかを示すものです。diffstat コマンドは特に大きなパッチに
おいて役立ちます。その時点でだけ又はメンテナにとってのみ関係のあるコメント おいて役立ちます。その時点でだけ又はメンテナにとってのみ関係のあるコメント
は無期限に保存されるチェンジログにとって適切ではありません。そのため、この は無期限に保存されるチェンジログにとって適切ではありません。そのため、この
ようなコメントもマーカー行の後に書かれるべきです。ファイル名はカーネルソー ようなコメントもマーカー行の後に書かれるべきです。
スツリーのトップディレクトリからの表記でリストされるため、横方向のスペース このようなコメントの良い例として、v1 と v2 のバージョン間で何が変更されたかを
をとり過ぎないように、diffstat コマンドにオプション「 -p 1 -w 70 」を指定し 表す「パッチの変更履歴」が挙げられます。
てください(インデントを含めてちょうど80列に合うでしょう)。
「 --- 」マーカー行の後に diffstat コマンドの結果を含めるのであれば、ファイル
名はカーネルソースツリーのトップディレクトリからの表記で列記されるため、横方向
のスペースをとり過ぎないように、diffstat コマンドにオプション「 -p 1 -w 70 」
を指定してください(インデントを含めてちょうど80列に合うでしょう)。
適切なパッチのフォーマットの詳細についてはセクション3の参考文献を参照して 適切なパッチのフォーマットの詳細についてはセクション3の参考文献を参照して
ください。 ください。
16) 「git pull」要求の送り方(Linus の電子メールから)
間違ったブランチから引っ張るのを防ぐために、git リポジトリのアドレスと
ブランチ名を同じ行に1行で記載してください。そうすることで、3回の連続クリック
で全て選択できます。
正しい形式は下記の通りです。
"Please pull from
git://jdelvare.pck.nerim.net/jdelvare-2.6 i2c-for-linus
to get these changes:"
その結果、アドレスを自分自身でタイピングして間違えることはなくなります(実際に、
何度か間違ったブランチから引っ張ってきてしまい、その時に diffstat の結果を
検証して間違っていることに気づいたことがあります。どこから何を引っ張るべきかを
「探したり」、正しいブランチ名かどうかを重ねてチェックしたりする必要が
なくなればより快適になるでしょう)。
diffstat の結果を生成するために「 git diff -M --stat --summary 」を使って
ください。-M オプションはファイル名の変更を検知でき、--summary オプションは
新規ファイル、削除されたファイル、名前が変更されたファイルの概要を生成します。
-M オプション(ファイル名の変更検知)を指定すると、diffstat の結果はかなり
異なってきます。git は大規模な変更(追加と削除のペア)をファイル名の変更と
判断するためです。
------------------------------------ ------------------------------------
セクション2 - ヒントとTIPSと小技 セクション2 - ヒントとTIPSと小技
------------------------------------ ------------------------------------
...@@ -459,7 +620,7 @@ google で検索したがるでしょう。 ...@@ -459,7 +620,7 @@ google で検索したがるでしょう。
も逸脱していると、レビューやコメントなしに受け取ってもらえないかもし も逸脱していると、レビューやコメントなしに受け取ってもらえないかもし
れません。 れません。
唯一の特筆すべき例外は、コードをあるファイルから別のファイルに移動 特筆すべき例外は、コードをあるファイルから別のファイルに移動
するときです。この場合、コードを移動するパッチでは、移動されるコード するときです。この場合、コードを移動するパッチでは、移動されるコード
に関して移動以外の変更を一切加えるべきではありません。これにより、 に関して移動以外の変更を一切加えるべきではありません。これにより、
コードの移動とあなたが行ったコードの修正を明確に区別できるようにな コードの移動とあなたが行ったコードの修正を明確に区別できるようにな
...@@ -553,4 +714,11 @@ Kernel Documentation/CodingStyle: ...@@ -553,4 +714,11 @@ Kernel Documentation/CodingStyle:
Linus Torvalds's mail on the canonical patch format: Linus Torvalds's mail on the canonical patch format:
<http://lkml.org/lkml/2005/4/7/183> <http://lkml.org/lkml/2005/4/7/183>
Andi Kleen, "On submitting kernel patches"
Some strategies to get difficult or controversial changes in.
http://halobates.de/on-submitting-patches.pdf
-- --
锘?Chinese translated version of Documentation/email-clients.txt Chinese translated version of Documentation/email-clients.txt
If you have any comment or update to the content, please contact the If you have any comment or update to the content, please contact the
original document maintainer directly. However, if you have a problem original document maintainer directly. However, if you have a problem
...@@ -8,203 +8,203 @@ or if there is a problem with the translation. ...@@ -8,203 +8,203 @@ or if there is a problem with the translation.
Chinese maintainer: Harry Wei <harryxiyou@gmail.com> Chinese maintainer: Harry Wei <harryxiyou@gmail.com>
--------------------------------------------------------------------- ---------------------------------------------------------------------
Documentation/email-clients.txt ???涓????缈昏?? Documentation/email-clients.txt 的中文翻译
濡??????宠??璁烘????存?版???????????瀹癸??璇风?存?ヨ??绯诲?????妗g??缁存?よ?????濡????浣?浣跨?ㄨ?辨?? 如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文
浜ゆ???????伴?剧??璇?锛?涔????浠ュ??涓???????缁存?よ??姹???┿??濡???????缈昏????存?颁???????舵?????缈? 交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻
璇?瀛???ㄩ??棰?锛?璇疯??绯讳腑??????缁存?よ????? 译存在问题,请联系中文版维护者。
涓???????缁存?よ??锛? 璐惧??濞? Harry Wei <harryxiyou@gmail.com> 中文版维护者: 贾威威 Harry Wei <harryxiyou@gmail.com>
涓???????缈昏?????锛? 璐惧??濞? Harry Wei <harryxiyou@gmail.com> 中文版翻译者: 贾威威 Harry Wei <harryxiyou@gmail.com>
涓?????????¤?????锛? Yinglin Luan <synmyth@gmail.com> 中文版校译者: Yinglin Luan <synmyth@gmail.com>
Xiaochen Wang <wangxiaochen0@gmail.com> Xiaochen Wang <wangxiaochen0@gmail.com>
yaxinsn <yaxinsn@163.com> yaxinsn <yaxinsn@163.com>
浠ヤ??涓烘?f?? 以下为正文
--------------------------------------------------------------------- ---------------------------------------------------------------------
Linux???浠跺?㈡?风?????缃?淇℃?? Linux邮件客户端配置信息
====================================================================== ======================================================================
?????????缃? 普通配置
---------------------------------------------------------------------- ----------------------------------------------------------------------
Linux?????歌ˉ涓???????杩????浠惰?????浜ょ??锛????濂芥??琛ヤ??浣?涓洪??浠朵????????宓?????????????浜?缁存?よ?? Linux内核补丁是通过邮件被提交的,最好把补丁作为邮件体的内嵌文本。有些维护者
??ユ?堕??浠讹??浣???????浠剁?????瀹规?煎??搴?璇ユ??"text/plain"?????惰??锛????浠朵????????涓?璧???????锛? 接收附件,但是附件的内容格式应该是"text/plain"。然而,附件一般是不赞成的,
???涓鸿??浼?浣胯ˉ涓????寮???ㄩ?ㄥ????ㄨ??璁鸿??绋?涓???????寰???伴?俱?? 因为这会使补丁的引用部分在评论过程中变的很困难。
??ㄦ?ュ?????Linux?????歌ˉ涓???????浠跺?㈡?风????ㄥ?????琛ヤ????跺??璇ュ??浜?????????????濮???舵?????渚?濡?锛? 用来发送Linux内核补丁的邮件客户端在发送补丁时应该处于文本的原始状态。例如,
浠?浠?涓???芥?瑰?????????????ゅ?惰〃绗???????绌烘?硷???????虫????ㄦ??涓?琛????寮?澶存?????缁?灏俱?? 他们不能改变或者删除制表符或者空格,甚至是在每一行的开头或者结尾。
涓?瑕????杩?"format=flowed"妯″????????琛ヤ?????杩???蜂??寮?璧蜂?????棰????浠ュ?????瀹崇?????琛???? 不要通过"format=flowed"模式发送补丁。这样会引起不可预期以及有害的断行。
涓?瑕?璁╀????????浠跺?㈡?风??杩?琛??????ㄦ?㈣?????杩???蜂??浼???村??浣????琛ヤ????? 不要让你的邮件客户端进行自动换行。这样也会破坏你的补丁。
???浠跺?㈡?风??涓???芥?瑰???????????瀛?绗????缂??????瑰?????瑕??????????琛ヤ???????芥??ASCII??????UTF-8缂??????瑰??锛? 邮件客户端不能改变文本的字符集编码方式。要发送的补丁只能是ASCII或者UTF-8编码方式,
濡????浣?浣跨??UTF-8缂??????瑰???????????浠讹????d??浣?灏?浼???垮??涓?浜??????藉????????瀛?绗???????棰???? 如果你使用UTF-8编码方式发送邮件,那么你将会避免一些可能发生的字符集问题。
???浠跺?㈡?风??搴?璇ュ舰???骞朵??淇???? References: ?????? In-Reply-To: ???棰?锛???d?? 邮件客户端应该形成并且保持 References: 或者 In-Reply-To: 标题,那么
???浠惰??棰?灏变??浼?涓??????? 邮件话题就不会中断。
澶???剁??甯?(?????????璐寸??甯?)???甯镐????界?ㄤ??琛ヤ??锛????涓哄?惰〃绗?浼?杞????涓虹┖??笺??浣跨??xclipboard, xclip 复制粘帖(或者剪贴粘帖)通常不能用于补丁,因为制表符会转换为空格。使用xclipboard, xclip
??????xcutsel涔?璁稿??浠ワ??浣???????濂芥??璇?涓?涓?????????垮??浣跨?ㄥ????剁??甯???? 或者xcutsel也许可以,但是最好测试一下或者避免使用复制粘帖。
涓?瑕???ㄤ娇???PGP/GPG缃插????????浠朵腑??????琛ヤ?????杩???蜂??浣垮??寰?澶???????涓???借?诲??????????ㄤ??浣????琛ヤ????? 不要在使用PGP/GPG署名的邮件中包含补丁。这样会使得很多脚本不能读取和适用于你的补丁。
锛?杩?涓????棰?搴?璇ユ?????浠ヤ慨澶????锛? (这个问题应该是可以修复的)
??ㄧ???????搁??浠跺??琛ㄥ?????琛ヤ??涔????锛?缁????宸卞?????涓?涓?琛ヤ?????涓?涓???????涓绘??锛?淇?瀛???ユ?跺?扮?? 在给内核邮件列表发送补丁之前,给自己发送一个补丁是个不错的主意,保存接收到的
???浠讹??灏?琛ヤ?????'patch'??戒护???涓?锛?濡??????????浜?锛????缁??????搁??浠跺??琛ㄥ???????? 邮件,将补丁用'patch'命令打上,如果成功了,再给内核邮件列表发送。
涓?浜????浠跺?㈡?风?????绀? 一些邮件客户端提示
---------------------------------------------------------------------- ----------------------------------------------------------------------
杩????缁???轰??浜?璇?缁????MUA???缃????绀猴?????浠ョ?ㄤ??缁?Linux?????稿?????琛ヤ?????杩?浜?骞朵???????虫?? 这里给出一些详细的MUA配置提示,可以用于给Linux内核发送补丁。这些并不意味是
?????????杞?浠跺?????缃???荤????? 所有的软件包配置总结。
璇存??锛? 说明:
TUI = 浠ユ?????涓哄?虹???????ㄦ?锋?ュ?? TUI = 以文本为基础的用户接口
GUI = ??惧舰?????㈢?ㄦ?锋?ュ?? GUI = 图形界面用户接口
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Alpine (TUI) Alpine (TUI)
???缃????椤癸?? 配置选项:
???"Sending Preferences"??ㄥ??锛? 在"Sending Preferences"部分:
- "Do Not Send Flowed Text"蹇?椤诲????? - "Do Not Send Flowed Text"必须开启
- "Strip Whitespace Before Sending"蹇?椤诲?抽?? - "Strip Whitespace Before Sending"必须关闭
褰???????浠舵?讹????????搴?璇ユ?惧?ㄨˉ涓?浼???虹?扮????版?癸????跺?????涓?CTRL-R缁???????锛?浣挎??瀹???? 当写邮件时,光标应该放在补丁会出现的地方,然后按下CTRL-R组合键,使指定的
琛ヤ?????浠跺????ュ?伴??浠朵腑??? 补丁文件嵌入到邮件中。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Evolution (GUI) Evolution (GUI)
涓?浜?寮????????????????浣跨?ㄥ????????琛ヤ?? 一些开发者成功的使用它发送补丁
褰??????╅??浠堕??椤癸??Preformat 当选择邮件选项:Preformat
浠?Format->Heading->Preformatted (Ctrl-7)??????宸ュ?锋?? 从Format->Heading->Preformatted (Ctrl-7)或者工具栏
??跺??浣跨??锛? 然后使用:
Insert->Text File... (Alt-n x)?????ヨˉ涓????浠躲?? Insert->Text File... (Alt-n x)插入补丁文件。
浣?杩????浠?"diff -Nru old.c new.c | xclip"锛???????Preformat锛???跺??浣跨?ㄤ腑??撮??杩?琛?绮?甯???? 你还可以"diff -Nru old.c new.c | xclip",选择Preformat,然后使用中间键进行粘帖。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Kmail (GUI) Kmail (GUI)
涓?浜?寮????????????????浣跨?ㄥ????????琛ヤ????? 一些开发者成功的使用它发送补丁。
榛?璁よ?剧疆涓?涓?HTML??煎??????????????锛?涓?瑕??????ㄥ????? 默认设置不为HTML格式是合适的;不要启用它。
褰?涔????涓?灏????浠剁????跺??锛???ㄩ??椤逛?????涓?瑕??????╄????ㄦ?㈣????????涓????缂虹?瑰氨???浣???ㄩ??浠朵腑杈???ョ??浠讳???????? 当书写一封邮件的时候,在选项下面不要选择自动换行。唯一的缺点就是你在邮件中输入的任何文本
??戒??浼?琚??????ㄦ?㈣??锛????姝や??蹇?椤诲?ㄥ?????琛ヤ??涔?????????ㄦ?㈣????????绠?????????规??灏辨???????ㄨ????ㄦ?㈣????ヤ功??????浠讹?? 都不会被自动换行,因此你必须在发送补丁之前手动换行。最简单的方法就是启用自动换行来书写邮件,
??跺?????瀹?淇?瀛?涓鸿??绋裤??涓????浣???ㄨ??绋夸腑???娆℃??寮?瀹?锛?瀹?宸茬????ㄩ?ㄨ????ㄦ?㈣??浜?锛???d??浣???????浠惰?界?舵病??? 然后把它保存为草稿。一旦你在草稿中再次打开它,它已经全部自动换行了,那么你的邮件虽然没有
?????╄????ㄦ?㈣??锛?浣????杩?涓?浼?澶卞?诲凡???????????ㄦ?㈣????? 选择自动换行,但是还不会失去已有的自动换行。
??ㄩ??浠剁??搴????锛??????ヨˉ涓?涔????锛???句??甯哥?ㄧ??琛ヤ??瀹????绗?锛?涓?涓?杩?瀛????(---)??? 在邮件的底部,插入补丁之前,放上常用的补丁定界符:三个连字号(---)。
??跺?????"Message"????????$??锛??????╂????ユ??浠讹????ョ????????浣????琛ヤ?????浠躲??杩????涓?涓?棰?澶???????椤癸??浣????浠? 然后在"Message"菜单条目,选择插入文件,接着选取你的补丁文件。还有一个额外的选项,你可以
???杩?瀹????缃?浣???????浠跺缓绔?宸ュ?锋????????锛?杩????浠ュ甫涓?"insert file"??炬????? 通过它配置你的邮件建立工具栏菜单,还可以带上"insert file"图标。
浣????浠ュ????ㄥ?伴??杩?GPG???璁伴??浠讹??浣???????宓?琛ヤ?????濂戒??瑕?浣跨??GPG???璁板??浠????浣?涓哄??宓??????????绛惧??琛ヤ??锛? 你可以安全地通过GPG标记附件,但是内嵌补丁最好不要使用GPG标记它们。作为内嵌文本的签发补丁,
褰?浠?GPG涓???????7浣?缂??????朵??浣夸??浠?????????村??澶??????? 当从GPG中提取7位编码时会使他们变的更加复杂。
濡????浣????瑕?浠ラ??浠剁??褰㈠????????琛ヤ??锛???d??灏卞?抽????瑰?婚??浠讹????跺?????涓?灞???э??绐????"Suggest automatic 如果你非要以附件的形式发送补丁,那么就右键点击附件,然后选中属性,突出"Suggest automatic
display"锛?杩???峰??宓????浠舵?村?规??璁╄?昏???????般?? display",这样内嵌附件更容易让读者看到。
褰?浣?瑕?淇?瀛?灏?瑕?????????????宓???????琛ヤ??锛?浣????浠ヤ??娑???????琛ㄧ????奸????╁?????琛ヤ????????浠讹????跺????冲?婚????? 当你要保存将要发送的内嵌文本补丁,你可以从消息列表窗格选择包含补丁的邮件,然后右击选择
"save as"???浣????浠ヤ娇??ㄤ??涓?娌℃????存?圭????????琛ヤ????????浠讹??濡????瀹????浠ユ?g‘???褰㈠??缁???????褰?浣?姝g????ㄥ?? "save as"。你可以使用一个没有更改的包含补丁的邮件,如果它是以正确的形式组成。当你正真在它
???宸辩??绐???d??涓?瀵????锛???f?舵病??????椤瑰??浠ヤ??瀛????浠?--宸茬?????涓?涓?杩???风??bug琚?姹???ュ?颁??kmail???bugzilla 自己的窗口之下察看,那时没有选项可以保存邮件--已经有一个这样的bug被汇报到了kmail的bugzilla
骞朵??甯????杩?灏?浼?琚?澶??????????浠舵??浠ュ?????瀵规??涓???ㄦ?峰??璇诲???????????琚?淇?瀛????锛????浠ュ?????浣???虫?????浠跺????跺?板?朵????版?癸?? 并且希望这将会被处理。邮件是以只针对某个用户可读写的权限被保存的,所以如果你想把邮件复制到其他地方,
浣?涓?寰?涓????浠?浠????????????逛负缁?????????翠?????璇汇?? 你不得不把他们的权限改为组或者整体可读。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lotus Notes (GUI) Lotus Notes (GUI)
涓?瑕?浣跨?ㄥ????? 不要使用它。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Mutt (TUI) Mutt (TUI)
寰?澶?Linux寮????浜哄??浣跨??mutt瀹㈡?风??锛????浠ヨ?????瀹????瀹?宸ヤ????????甯告??浜???? 很多Linux开发人员使用mutt客户端,所以证明它肯定工作的非常漂亮。
Mutt涓????甯?缂?杈????锛????浠ヤ??绠′??浣跨?ㄤ??涔?缂?杈???ㄩ?戒??搴?璇ュ甫????????ㄦ??琛????澶у????扮??杈???ㄩ?藉甫??? Mutt不自带编辑器,所以不管你使用什么编辑器都不应该带有自动断行。大多数编辑器都带有
涓?涓?"insert file"???椤癸??瀹????浠ラ??杩?涓???瑰?????浠跺??瀹圭????瑰???????ユ??浠躲?? 一个"insert file"选项,它可以通过不改变文件内容的方式插入文件。
'vim'浣?涓?mutt???缂?杈????锛? 'vim'作为mutt的编辑器:
set editor="vi" set editor="vi"
濡????浣跨??xclip锛???插?ヤ互涓???戒护 如果使用xclip,敲入以下命令
:set paste :set paste
???涓????涔??????????shift-insert??????浣跨?? 按中键之前或者shift-insert或者使用
:r filename :r filename
濡??????宠?????琛ヤ??浣?涓哄??宓?????????? 如果想要把补丁作为内嵌文本。
(a)ttach宸ヤ?????寰?濂斤??涓?甯????"set paste"??? (a)ttach工作的很好,不带有"set paste"。
???缃????椤癸?? 配置选项:
瀹?搴?璇ヤ互榛?璁よ?剧疆???褰㈠??宸ヤ????? 它应该以默认设置的形式工作。
??惰??锛????"send_charset"璁剧疆涓?"us-ascii::utf-8"涔????涓?涓?涓???????涓绘????? 然而,把"send_charset"设置为"us-ascii::utf-8"也是一个不错的主意。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Pine (TUI) Pine (TUI)
Pine杩???绘??涓?浜?绌烘?煎????????棰?锛?浣????杩?浜???板?ㄥ??璇ラ?借??淇?澶?浜???? Pine过去有一些空格删减问题,但是这些现在应该都被修复了。
濡???????浠ワ??璇蜂娇???alpine(pine???缁ф?胯??) 如果可以,请使用alpine(pine的继承者)
???缃????椤癸?? 配置选项:
- ???杩?????????????瑕?娑???ゆ??绋??????? - 最近的版本需要消除流程文本
- "no-strip-whitespace-before-send"???椤逛????????瑕??????? - "no-strip-whitespace-before-send"选项也是需要的。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sylpheed (GUI) Sylpheed (GUI)
- ???宓??????????浠ュ??濂界??宸ヤ??锛???????浣跨?ㄩ??浠讹????? - 内嵌文本可以很好的工作(或者使用附件)。
- ???璁镐娇??ㄥ????ㄧ??缂?杈???ㄣ?? - 允许使用外部的编辑器。
- 瀵逛?????褰?杈?澶???堕??甯告????? - 对于目录较多时非常慢。
- 濡???????杩?non-SSL杩???ワ?????娉?浣跨??TLS SMTP????????? - 如果通过non-SSL连接,无法使用TLS SMTP授权。
- ??ㄧ?????绐???d腑???涓?涓?寰??????ㄧ??ruler bar??? - 在组成窗口中有一个很有用的ruler bar。
- 缁???板?????涓?娣诲????板??灏变??浼?姝g‘???浜?瑙f?剧ず?????? - 给地址本中添加地址就不会正确的了解显示名。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Thunderbird (GUI) Thunderbird (GUI)
榛?璁ゆ????典??锛?thunderbird寰?瀹规??????????????锛?浣????杩????涓?浜???规?????浠ュ己??跺?????寰???村ソ??? 默认情况下,thunderbird很容易损坏文本,但是还有一些方法可以强制它变得更好。
- ??ㄧ?ㄦ?峰????疯?剧疆???锛?缁???????瀵诲??锛?涓?瑕???????"Compose messages in HTML format"??? - 在用户帐号设置里,组成和寻址,不要选择"Compose messages in HTML format"。
- 缂?杈?浣????Thunderbird???缃?璁剧疆??ヤ娇瀹?涓?瑕????琛?浣跨??锛?user_pref("mailnews.wraplength", 0); - 编辑你的Thunderbird配置设置来使它不要拆行使用:user_pref("mailnews.wraplength", 0);
- 缂?杈?浣????Thunderbird???缃?璁剧疆锛?浣垮??涓?瑕?浣跨??"format=flowed"??煎??锛?user_pref("mailnews. - 编辑你的Thunderbird配置设置,使它不要使用"format=flowed"格式:user_pref("mailnews.
send_plaintext_flowed", false); send_plaintext_flowed", false);
- 浣????瑕?浣?Thunderbird???涓洪???????煎????瑰??锛? - 你需要使Thunderbird变为预先格式方式:
濡????榛?璁ゆ????典??浣?涔??????????HTML??煎??锛???d?????寰???俱??浠?浠?浠????棰???????涓????妗?涓???????"Preformat"??煎????? 如果默认情况下你书写的是HTML格式,那不是很难。仅仅从标题栏的下拉框中选择"Preformat"格式。
濡????榛?璁ゆ????典??浣?涔??????????????????煎??锛?浣?涓?寰????瀹???逛负HTML??煎??锛?浠?浠?浣?涓轰??娆℃?х??锛???ヤ功?????扮??娑????锛? 如果默认情况下你书写的是文本格式,你不得把它改为HTML格式(仅仅作为一次性的)来书写新的消息,
??跺??寮哄?朵娇瀹??????版???????煎??锛???????瀹?灏变?????琛????瑕?瀹???板??锛???ㄥ??淇$????炬??涓?浣跨??shift?????ヤ娇瀹????涓?HTML 然后强制使它回到文本格式,否则它就会拆行。要实现它,在写信的图标上使用shift键来使它变为HTML
??煎??锛???跺?????棰???????涓????妗?涓???????"Preformat"??煎????? 格式,然后标题栏的下拉框中选择"Preformat"格式。
- ???璁镐娇??ㄥ????ㄧ??缂?杈????锛? - 允许使用外部的编辑器:
???瀵?Thunderbird???琛ヤ?????绠?????????规??灏辨??浣跨?ㄤ??涓?"external editor"??╁??锛???跺??浣跨?ㄤ????????娆㈢?? 针对Thunderbird打补丁最简单的方法就是使用一个"external editor"扩展,然后使用你最喜欢的
$EDITOR??ヨ?诲???????????骞惰ˉ涓???版?????涓????瑕?瀹???板??锛????浠ヤ??杞藉苟涓?瀹?瑁?杩?涓???╁??锛???跺??娣诲??涓?涓?浣跨?ㄥ????? $EDITOR来读取或者合并补丁到文本中。要实现它,可以下载并且安装这个扩展,然后添加一个使用它的
??????View->Toolbars->Customize...??????褰?浣?涔????淇℃???????跺??浠?浠???瑰?诲??灏卞??浠ヤ????? 按键View->Toolbars->Customize...最后当你书写信息的时候仅仅点击它就可以了。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TkRat (GUI) TkRat (GUI)
???浠ヤ娇??ㄥ?????浣跨??"Insert file..."??????澶???ㄧ??缂?杈???ㄣ?? 可以使用它。使用"Insert file..."或者外部的编辑器。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Gmail (Web GUI) Gmail (Web GUI)
涓?瑕?浣跨?ㄥ????????琛ヤ????? 不要使用它发送补丁。
Gmail缃?椤靛?㈡?风???????ㄥ?版????惰〃绗?杞????涓虹┖??笺?? Gmail网页客户端自动地把制表符转换为空格。
??界?跺?惰〃绗?杞????涓虹┖??奸??棰????浠ヨ??澶???ㄧ??杈???ㄨВ??筹???????跺??杩?浼?浣跨?ㄥ??杞???㈣?????姣?琛???????涓?78涓?瀛?绗???? 虽然制表符转换为空格问题可以被外部编辑器解决,同时它还会使用回车换行把每行拆分为78个字符。
???涓?涓????棰????Gmail杩?浼????浠讳??涓????ASCII???瀛?绗????淇℃????逛负base64缂???????瀹????涓?瑗垮????????娆ф床浜虹?????瀛???? 另一个问题是Gmail还会把任何不是ASCII的字符的信息改为base64编码。它把东西变的像欧洲人的名字。
### ###
...@@ -16,6 +16,11 @@ config UEVENT_HELPER_PATH ...@@ -16,6 +16,11 @@ config UEVENT_HELPER_PATH
that it creates a high system load, or on smaller systems that it creates a high system load, or on smaller systems
it is known to create out-of-memory situations during bootup. it is known to create out-of-memory situations during bootup.
To disable user space helper program execution at early boot
time specify an empty string here. This setting can be altered
via /proc/sys/kernel/hotplug or via /sys/kernel/uevent_helper
later at runtime.
config DEVTMPFS config DEVTMPFS
bool "Maintain a devtmpfs filesystem to mount at /dev" bool "Maintain a devtmpfs filesystem to mount at /dev"
depends on HOTPLUG depends on HOTPLUG
...@@ -65,17 +70,17 @@ config PREVENT_FIRMWARE_BUILD ...@@ -65,17 +70,17 @@ config PREVENT_FIRMWARE_BUILD
default y default y
help help
Say yes to avoid building firmware. Firmware is usually shipped Say yes to avoid building firmware. Firmware is usually shipped
with the driver, and only when updating the firmware a rebuild with the driver and only when updating the firmware should a
should be made. rebuild be made.
If unsure say Y here. If unsure, say Y here.
config FW_LOADER config FW_LOADER
tristate "Userspace firmware loading support" if EXPERT tristate "Userspace firmware loading support" if EXPERT
default y default y
---help--- ---help---
This option is provided for the case where no in-kernel-tree modules This option is provided for the case where none of the in-tree modules
require userspace firmware loading support, but a module built outside require userspace firmware loading support, but a module built
the kernel tree does. out-of-tree does.
config FIRMWARE_IN_KERNEL config FIRMWARE_IN_KERNEL
bool "Include in-kernel firmware blobs in kernel binary" bool "Include in-kernel firmware blobs in kernel binary"
...@@ -83,22 +88,22 @@ config FIRMWARE_IN_KERNEL ...@@ -83,22 +88,22 @@ config FIRMWARE_IN_KERNEL
default y default y
help help
The kernel source tree includes a number of firmware 'blobs' The kernel source tree includes a number of firmware 'blobs'
which are used by various drivers. The recommended way to that are used by various drivers. The recommended way to
use these is to run "make firmware_install" and to copy the use these is to run "make firmware_install", which, after
resulting binary files created in usr/lib/firmware directory converting ihex files to binary, copies all of the needed
of the kernel tree to the /lib/firmware on your system so binary files in firmware/ to /lib/firmware/ on your system so
that they can be loaded by userspace helpers on request. that they can be loaded by userspace helpers on request.
Enabling this option will build each required firmware blob Enabling this option will build each required firmware blob
into the kernel directly, where request_firmware() will find into the kernel directly, where request_firmware() will find
them without having to call out to userspace. This may be them without having to call out to userspace. This may be
useful if your root file system requires a device which uses useful if your root file system requires a device that uses
such firmware, and do not wish to use an initrd. such firmware and do not wish to use an initrd.
This single option controls the inclusion of firmware for This single option controls the inclusion of firmware for
every driver which uses request_firmware() and ships its every driver that uses request_firmware() and ships its
firmware in the kernel source tree, to avoid a proliferation firmware in the kernel source tree, which avoids a
of 'Include firmware for xxx device' options. proliferation of 'Include firmware for xxx device' options.
Say 'N' and let firmware be loaded from userspace. Say 'N' and let firmware be loaded from userspace.
...@@ -106,27 +111,27 @@ config EXTRA_FIRMWARE ...@@ -106,27 +111,27 @@ config EXTRA_FIRMWARE
string "External firmware blobs to build into the kernel binary" string "External firmware blobs to build into the kernel binary"
depends on FW_LOADER depends on FW_LOADER
help help
This option allows firmware to be built into the kernel, for the This option allows firmware to be built into the kernel for the case
cases where the user either cannot or doesn't want to provide it from where the user either cannot or doesn't want to provide it from
userspace at runtime (for example, when the firmware in question is userspace at runtime (for example, when the firmware in question is
required for accessing the boot device, and the user doesn't want to required for accessing the boot device, and the user doesn't want to
use an initrd). use an initrd).
This option is a string, and takes the (space-separated) names of the This option is a string and takes the (space-separated) names of the
firmware files -- the same names which appear in MODULE_FIRMWARE() firmware files -- the same names that appear in MODULE_FIRMWARE()
and request_firmware() in the source. These files should exist under and request_firmware() in the source. These files should exist under
the directory specified by the EXTRA_FIRMWARE_DIR option, which is the directory specified by the EXTRA_FIRMWARE_DIR option, which is
by default the firmware/ subdirectory of the kernel source tree. by default the firmware subdirectory of the kernel source tree.
So, for example, you might set CONFIG_EXTRA_FIRMWARE="usb8388.bin", For example, you might set CONFIG_EXTRA_FIRMWARE="usb8388.bin", copy
copy the usb8388.bin file into the firmware/ directory, and build the the usb8388.bin file into the firmware directory, and build the kernel.
kernel. Then any request_firmware("usb8388.bin") will be Then any request_firmware("usb8388.bin") will be satisfied internally
satisfied internally without needing to call out to userspace. without needing to call out to userspace.
WARNING: If you include additional firmware files into your binary WARNING: If you include additional firmware files into your binary
kernel image which are not available under the terms of the GPL, kernel image that are not available under the terms of the GPL,
then it may be a violation of the GPL to distribute the resulting then it may be a violation of the GPL to distribute the resulting
image -- since it combines both GPL and non-GPL work. You should image since it combines both GPL and non-GPL work. You should
consult a lawyer of your own before distributing such an image. consult a lawyer of your own before distributing such an image.
config EXTRA_FIRMWARE_DIR config EXTRA_FIRMWARE_DIR
...@@ -136,10 +141,9 @@ config EXTRA_FIRMWARE_DIR ...@@ -136,10 +141,9 @@ config EXTRA_FIRMWARE_DIR
help help
This option controls the directory in which the kernel build system This option controls the directory in which the kernel build system
looks for the firmware files listed in the EXTRA_FIRMWARE option. looks for the firmware files listed in the EXTRA_FIRMWARE option.
The default is the firmware/ directory in the kernel source tree, The default is firmware/ in the kernel source tree, but by changing
but by changing this option you can point it elsewhere, such as this option you can point it elsewhere, such as /lib/firmware/ or
the /lib/firmware/ directory or another separate directory some other directory containing the firmware files.
containing firmware files.
config DEBUG_DRIVER config DEBUG_DRIVER
bool "Driver Core verbose debug messages" bool "Driver Core verbose debug messages"
......
...@@ -869,8 +869,6 @@ static __init int gsmi_init(void) ...@@ -869,8 +869,6 @@ static __init int gsmi_init(void)
goto out_err; goto out_err;
} }
printk(KERN_INFO "gsmi version " DRIVER_VERSION " loaded\n");
/* Register in the firmware directory */ /* Register in the firmware directory */
ret = -ENOMEM; ret = -ENOMEM;
gsmi_kobj = kobject_create_and_add("gsmi", firmware_kobj); gsmi_kobj = kobject_create_and_add("gsmi", firmware_kobj);
...@@ -890,12 +888,13 @@ static __init int gsmi_init(void) ...@@ -890,12 +888,13 @@ static __init int gsmi_init(void)
ret = sysfs_create_files(gsmi_kobj, gsmi_attrs); ret = sysfs_create_files(gsmi_kobj, gsmi_attrs);
if (ret) { if (ret) {
printk(KERN_INFO "gsmi: Failed to add attrs"); printk(KERN_INFO "gsmi: Failed to add attrs");
goto out_err; goto out_remove_bin_file;
} }
if (register_efivars(&efivars, &efivar_ops, gsmi_kobj)) { ret = register_efivars(&efivars, &efivar_ops, gsmi_kobj);
if (ret) {
printk(KERN_INFO "gsmi: Failed to register efivars\n"); printk(KERN_INFO "gsmi: Failed to register efivars\n");
goto out_err; goto out_remove_sysfs_files;
} }
register_reboot_notifier(&gsmi_reboot_notifier); register_reboot_notifier(&gsmi_reboot_notifier);
...@@ -903,9 +902,15 @@ static __init int gsmi_init(void) ...@@ -903,9 +902,15 @@ static __init int gsmi_init(void)
atomic_notifier_chain_register(&panic_notifier_list, atomic_notifier_chain_register(&panic_notifier_list,
&gsmi_panic_notifier); &gsmi_panic_notifier);
printk(KERN_INFO "gsmi version " DRIVER_VERSION " loaded\n");
return 0; return 0;
out_err: out_remove_sysfs_files:
sysfs_remove_files(gsmi_kobj, gsmi_attrs);
out_remove_bin_file:
sysfs_remove_bin_file(gsmi_kobj, &eventlog_bin_attr);
out_err:
kobject_put(gsmi_kobj); kobject_put(gsmi_kobj);
gsmi_buf_free(gsmi_dev.param_buf); gsmi_buf_free(gsmi_dev.param_buf);
gsmi_buf_free(gsmi_dev.data_buf); gsmi_buf_free(gsmi_dev.data_buf);
...@@ -925,6 +930,8 @@ static void __exit gsmi_exit(void) ...@@ -925,6 +930,8 @@ static void __exit gsmi_exit(void)
&gsmi_panic_notifier); &gsmi_panic_notifier);
unregister_efivars(&efivars); unregister_efivars(&efivars);
sysfs_remove_files(gsmi_kobj, gsmi_attrs);
sysfs_remove_bin_file(gsmi_kobj, &eventlog_bin_attr);
kobject_put(gsmi_kobj); kobject_put(gsmi_kobj);
gsmi_buf_free(gsmi_dev.param_buf); gsmi_buf_free(gsmi_dev.param_buf);
gsmi_buf_free(gsmi_dev.data_buf); gsmi_buf_free(gsmi_dev.data_buf);
......
...@@ -445,9 +445,9 @@ static void pti_tty_driver_close(struct tty_struct *tty, struct file *filp) ...@@ -445,9 +445,9 @@ static void pti_tty_driver_close(struct tty_struct *tty, struct file *filp)
} }
/** /**
* pti_tty_intstall()- Used to set up specific master-channels * pti_tty_install()- Used to set up specific master-channels
* to tty ports for organizational purposes when * to tty ports for organizational purposes when
* tracing viewed from debuging tools. * tracing viewed from debuging tools.
* *
* @driver: tty driver information. * @driver: tty driver information.
* @tty: tty struct containing pti information. * @tty: tty struct containing pti information.
......
...@@ -23,6 +23,10 @@ ...@@ -23,6 +23,10 @@
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/of.h>
#include <linux/of_platform.h>
#include <linux/of_address.h>
#define DRIVER_NAME "uio_pdrv_genirq" #define DRIVER_NAME "uio_pdrv_genirq"
struct uio_pdrv_genirq_platdata { struct uio_pdrv_genirq_platdata {
...@@ -97,6 +101,27 @@ static int uio_pdrv_genirq_probe(struct platform_device *pdev) ...@@ -97,6 +101,27 @@ static int uio_pdrv_genirq_probe(struct platform_device *pdev)
int ret = -EINVAL; int ret = -EINVAL;
int i; int i;
if (!uioinfo) {
int irq;
/* alloc uioinfo for one device */
uioinfo = kzalloc(sizeof(*uioinfo), GFP_KERNEL);
if (!uioinfo) {
ret = -ENOMEM;
dev_err(&pdev->dev, "unable to kmalloc\n");
goto bad2;
}
uioinfo->name = pdev->dev.of_node->name;
uioinfo->version = "devicetree";
/* Multiple IRQs are not supported */
irq = platform_get_irq(pdev, 0);
if (irq == -ENXIO)
uioinfo->irq = UIO_IRQ_NONE;
else
uioinfo->irq = irq;
}
if (!uioinfo || !uioinfo->name || !uioinfo->version) { if (!uioinfo || !uioinfo->name || !uioinfo->version) {
dev_err(&pdev->dev, "missing platform_data\n"); dev_err(&pdev->dev, "missing platform_data\n");
goto bad0; goto bad0;
...@@ -180,6 +205,10 @@ static int uio_pdrv_genirq_probe(struct platform_device *pdev) ...@@ -180,6 +205,10 @@ static int uio_pdrv_genirq_probe(struct platform_device *pdev)
kfree(priv); kfree(priv);
pm_runtime_disable(&pdev->dev); pm_runtime_disable(&pdev->dev);
bad0: bad0:
/* kfree uioinfo for OF */
if (pdev->dev.of_node)
kfree(uioinfo);
bad2:
return ret; return ret;
} }
...@@ -193,6 +222,10 @@ static int uio_pdrv_genirq_remove(struct platform_device *pdev) ...@@ -193,6 +222,10 @@ static int uio_pdrv_genirq_remove(struct platform_device *pdev)
priv->uioinfo->handler = NULL; priv->uioinfo->handler = NULL;
priv->uioinfo->irqcontrol = NULL; priv->uioinfo->irqcontrol = NULL;
/* kfree uioinfo for OF */
if (pdev->dev.of_node)
kfree(priv->uioinfo);
kfree(priv); kfree(priv);
return 0; return 0;
} }
...@@ -219,6 +252,15 @@ static const struct dev_pm_ops uio_pdrv_genirq_dev_pm_ops = { ...@@ -219,6 +252,15 @@ static const struct dev_pm_ops uio_pdrv_genirq_dev_pm_ops = {
.runtime_resume = uio_pdrv_genirq_runtime_nop, .runtime_resume = uio_pdrv_genirq_runtime_nop,
}; };
#ifdef CONFIG_OF
static const struct of_device_id __devinitconst uio_of_genirq_match[] = {
{ /* empty for now */ },
};
MODULE_DEVICE_TABLE(of, uio_of_genirq_match);
#else
# define uio_of_genirq_match NULL
#endif
static struct platform_driver uio_pdrv_genirq = { static struct platform_driver uio_pdrv_genirq = {
.probe = uio_pdrv_genirq_probe, .probe = uio_pdrv_genirq_probe,
.remove = uio_pdrv_genirq_remove, .remove = uio_pdrv_genirq_remove,
...@@ -226,6 +268,7 @@ static struct platform_driver uio_pdrv_genirq = { ...@@ -226,6 +268,7 @@ static struct platform_driver uio_pdrv_genirq = {
.name = DRIVER_NAME, .name = DRIVER_NAME,
.owner = THIS_MODULE, .owner = THIS_MODULE,
.pm = &uio_pdrv_genirq_dev_pm_ops, .pm = &uio_pdrv_genirq_dev_pm_ops,
.of_match_table = uio_of_genirq_match,
}, },
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment