Soren Schmidt 是FREEBSD核心开发人员之一,他现在是“the author and maintainer of the FreeBSD ATA driver subsystem (disk, CDROM, DVD, ZIP, LS120 etc)”,FREEBSD内核源代码 ata-raid.h 就是由他负责开发与维护的。
当他浏览 linux kernel source 2.4.10 ATA部分时,忽然发现,竟然linux源代码与他写的是那么相似——太相似了。
Soren Schmidt 说:“他们(linux 核心开发者)仅仅把我代码中的版权声明给拿掉,This is clearest with the two header files hptraid.h and pdcraid.h. Compare these with FreeBSD 's ata-raid.h, and just look at the similarities,太相似了,其中 reading of the RAID config from the disks 的代码倒是他们自己写的,但是很明显许多灵感都是来自我们的,看看头文件,他们仅仅做了个chop up,而头文件中的结构就已经是the whole story了”。
ata-raid.h 与其他相关文件是有BSD版权的,但是明显linux开发者非法剽窃了这些代码。
读者可以在http://bsdnews.com/view_story.php3?story_id=2416 与http://bsd.slashdot.org/article.pl?sid=01/09/24/1432223&mode=thread看到英文报道如下:
Soren Schmidt was browsing through the 2.4.10 linux kernel source when he saw something that looked a bit familiar. Too familiar in fact. S?ren is the principle developer of FreeBSD 's ATA drivers, including FreeBSD 's support for ATA RAID cards, and as he looked through the linux/drivers/ide/ files the sense of deja vu was overwhelming. Read on for more.
"They just took my code and filed off the copyright " said S?ren. "This is clearest with the two header files hptraid.h and pdcraid.h. Compare these with FreeBSD 's ata-raid.h, and just look at the similarities. " And it 's true that these two header files certainly look like a chopped up copy of the FreeBSD header, after a quick search-and-replace. "The reading of the RAID config from the disks is their own code, but is clearly "inspired " from our code, " said S?ren, "but that 's encouraged by the license. It 's the verbatim use of the other code without retaining the copyright that 's the problem. "
ata-raid.h, and the other files, are copyright S?ren, and released under the three clause BSD license, which includes the restriction "Redistributions of source code must retain the above copyright notice ". So using these files, or significant portions of them, in your own code, without retaining the copyright information, as has happened here, is prohibited.
You may be thinking "This is only a couple of header files, what 's the big deal? ". As S?ren says "The problem here is that the structures in the headers is the whole story. That info tells how you read the proprietary struct off the disks, and was reverse engineered and documented by me after a lot of effort. " S?ren 's intellectual property is tied up in those files.
Right now, S?ren is in discussions with the authors of the Linux ATA drivers (employed by RedHat) to ensure that his copyright notice is returned to these and other files, and to ensure that this situation does not recur. And it is hoped that an amicable solution can be reached.
Babak Farrokhi(babak@farrokhi.net)称LINUX的这种行为是代码劫持(Code hijacking),说:“Does GNU copyleft allow stealing code and removing it 's copyright notice? Is this really legal? And what REDHAT have to say about this? ”(是不是GNU copyleft 允许偷代码,然后把版权声明remove了呢?这是真的合法的吗?)
marc rassbach 说:“It is not the 1st time this kind of 'technology transfer ' has happened ”,(这不是第一次了),“If you go digging back in time RedHat Pre 7.0 used BSD 's lpr. The man pages point out lp() was from BSD, but little RedHat Advertising said 'Portions copyright University of Berkley '. And 2.0.16 kernel (I 'd have to go look....it has been mentioned here on daemonnews) has headder files where they point out they TOOK the code from BSD, yet remmoved the copyright. Glad this was reported! Kudos to Mr. Schmidt for enforcing his rights!”
为了读者便于对照阅读,特将FREEBSD与LINUX中的这几个头文件复制如下:
FREEBSD:
http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/dev/ata/ata-raid.h?rev=1.5&content-type=text/x-cvsweb-markup
/*-
* Copyright (c) 2000,2001 S鴕en Schmidt <sos@FreeBSD.org>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer,
* without modification, immediately at the beginning of the file.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS ' ' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $FreeBSD: /repoman/r/ncvs/src/sys/dev/ata/ata-raid.h,v 1.5 2001/09/20 15:25:34 sos Exp $
*/
struct ar_softc {
int lun;
int32_t magic_0;
int32_t magic_1;
int flags;
#define AR_F_RAID_0 0x0001 /* STRIPE */
#define AR_F_RAID_1 0x0002 /* MIRROR */
#define AR_F_SPAN 0x0004 /* SPAN */
#define AR_F_CONF_DONE 0x0008
int num_subdisks;
struct ad_softc *subdisk[8];
int num_mirrordisks;
struct ad_softc *mirrordisk[8];
int interleave;
int last_disk;
int32_t last_lba[8][2];
u_int16_t heads;
u_int16_t sectors;
u_int32_t cylinders;
u_int32_t total_secs;
int reserved; /* sectors that are NOT to be used */
int offset; /* offset from start of disk */
struct disk disk; /* disklabel/slice stuff */
dev_t dev; /* device place holder */
};
struct ar_buf {
struct bio bp;
struct bio *org;
int drive;
struct ar_buf *mirror;
int done;
};
struct highpoint_raid_conf {
int8_t filler1[32];
u_int32_t magic; /* 0x20 */
#define HPT_MAGIC_OK 0x5a7816f0
#define HPT_MAGIC_BAD 0x5a7816fd
u_int32_t magic_0;
u_int32_t magic_1;
u_int32_t order;
#define HPT_O_MIRROR 0x01
#define HPT_O_STRIPE 0x02
#define HPT_O_OK 0x04
u_int8_t raid_disks;
u_int8_t raid0_shift;
u_int8_t type;
#define HPT_T_RAID_0 0x00
#define HPT_T_RAID_1 0x01
#define HPT_T_RAID_01_RAID_0 0x02
#define HPT_T_SPAN 0x03
#define HPT_T_RAID_3 0x04
#define HPT_T_RAID_5 0x05
#define HPT_T_SINGLEDISK 0x06
#define HPT_T_RAID_01_RAID_1 0x07
u_int8_t disk_number;
u_int32_t total_secs;
u_int32_t disk_mode;
u_int32_t boot_mode;
u_int8_t boot_disk;
u_int8_t boot_protect;
u_int8_t error_log_entries;
u_int8_t error_log_index;
struct {
u_int32_t timestamp;
u_int8_t reason;
#define HPT_R_REMOVED 0xfe
#define HPT_R_BROKEN 0xff
u_int8_t disk;
u_int8_t status;
u_int8_t sectors;
u_int32_t lba;
} errorlog[32];
int8_t filler2[60];
};
struct promise_raid_conf {
char promise_id[24];
#define PR_MAGIC "Promise Technology, Inc. "
int32_t dummy_0;
int32_t magic_0;
int32_t dummy_1;
int32_t magic_1;
int16_t dummy_2;
int8_t filler1[470];
struct {
int32_t flags; /* 0x200 */
#define PR_F_CONFED 0x00000080
int8_t dummy_0;
int8_t disk_number;
int8_t channel;
int8_t device;
int32_t magic_0;
int32_t dummy_1;
int32_t dummy_2; /* 0x210 */
int32_t disk_secs;
int32_t dummy_3;
int16_t dummy_4;
int8_t status;
#define PR_S_DEFINED 0x01
#define PR_S_ONLINE 0x02
#define PR_S_OFFLINE 0x10
int8_t type;
#define PR_T_STRIPE 0x00
#define PR_T_MIRROR 0x01
#define PR_T_STRIPE_MIRROR 0x04
#define PR_T_SPAN 0x08
u_int8_t total_disks; /* 0x220 */
u_int8_t raid0_shift;
u_int8_t raid0_disks;
u_int8_t array_number;
u_int32_t total_secs;
u_int16_t cylinders;
u_int8_t heads;
u_int8_t sectors;
int32_t magic_1;
int32_t dummy_5; /* 0x230 */
struct {
int16_t dummy_0;
int8_t channel;
int8_t device;
int32_t magic_0;
int32_t disk_number;
} disk[8];
} raid;
int32_t filler2[346];
uint32_t checksum;
};
int ar_probe(struct ad_softc *);
LINUX:
"hptraid.h ":
struct highpoint_raid_conf
{
int8_t filler1[32];
u_int32_t magic;
#define HPT_MAGIC_OK 0x5a7816f0
#define HPT_MAGIC_BAD 0x5a7816fd
u_int32_t magic_0;
u_int32_t magic_1;
u_int32_t order;
#define HPT_O_MIRROR 0x01
#define HPT_O_STRIPE 0x02
#define HPT_O_OK 0x04
u_int8_t raid_disks;
u_int8_t raid0_shift;
u_int8_t type;
#define HPT_T_RAID_0 0x00
#define HPT_T_RAID_1 0x01
#define HPT_T_RAID_01_RAID_0 0x02
#define HPT_T_SPAN 0x03
#define HPT_T_RAID_3 0x04
#define HPT_T_RAID_5 0x05
#define HPT_T_SINGLEDISK 0x06
#define HPT_T_RAID_01_RAID_1 0x07
u_int8_t disk_number;
u_int32_t total_secs;
u_int32_t disk_mode;
u_int32_t boot_mode;
u_int8_t boot_disk;
u_int8_t boot_protect;
u_int8_t error_log_entries;
u_int8_t error_log_index;
struct
{
u_int32_t timestamp;
u_int8_t reason;
#define HPT_R_REMOVED 0xfe
#define HPT_R_BROKEN 0xff
u_int8_t disk;
u_int8_t status;
u_int8_t sectors;
u_int32_t lba;
} errorlog[32];
u_int8_t filler[60];
};
"pdcraid.h ":
struct promise_raid_conf {
char promise_id[24];
u32 dummy_0;
u32 magic_0;
u32 dummy_1;
u32 magic_1;
u16 dummy_2;
u8 filler1[470];
struct {
u32 flags; /* 0x200 */
u8 dummy_0;
u8 disk_number;
u8 channel;
u8 device;
u32 magic_0;
u32 dummy_1;
u32 dummy_2; /* 0x210 */
u32 disk_secs;
u32 dummy_3;
u16 dummy_4;
u8 status;
u8 type;
u8 total_disks; /* 0x220 */
u8 raid0_shift;
u8 raid0_disks;
u8 array_number;
u32 total_secs;
u16 cylinders;
u8 heads;
u8 sectors;
u32 magic_1;
u32 dummy_5; /* 0x230 */
struct {
u16 dummy_0;
u8 channel;
u8 device;
u32 magic_0;
u32 disk_number;
} disk[8];
} raid;
u32 filler2[346];
u32 checksum;
};
#define PR_MAGIC "Promise Technology, Inc. "
我们还应该知道的是,Soren Schmidt 指控剽窃的时间是在2001年9月,但是5年过去了,此事仍然没有结局,在2003年GNU社区采用DDOS攻击与死亡恐吓信等恐怖与流氓手段威胁SCO高层管理人员时,Soren Schmidt 本人尽管与SCO无关,但因为他的这个质疑,也受到了几次威胁,让人们不得不质疑GNU社区本身是不是黑社会。
我们还可以看到,LINUX内核开发者的剽窃手段是远远高于麒麟OS开发者的。麒麟OS开发者如果好好向LINUX内核开发者学习剽窃手段,就不会被国人耻笑了。