Linux: 2.6.8 Followed By 2.6.8.1

Submitted by Jeremy
on August 15, 2004 - 1:42pm

Linus Torvalds released the official 2.6.8 kernel noting, "the major patches since -rc4 [story] were some sparc64 and parsic updates, but there's some network driver and SATA updates and a few ARM patches too. And a use-after-free fix in MTD." The latest Linux kernel can always be obtained from a kernel.org mirror.

Shortly after the release, an easily reproducible Oops was reported from accessing a mounted NFS filesystem. Linus acknowledged the bug, and decided to release a quick 2.6.8.1, "to make it usable for people with NFS." When asked why it was named this instead of 2.6.9 using the long-standing three-digit kernel versioning, Linus explained:

"Well, we've been discussing the 2.6.x.y format for a while [story], so I see this as an opportunity to actually do it... Will it break automated scripts? Maybe. But on the other hand, we'll never even find out unless we try it some time."



From: Linus Torvalds [email blocked]
To: Kernel Mailing List [email blocked]
Subject: Linux v2.6.8
Date: 	Fri, 13 Aug 2004 23:05:43 -0700 (PDT)



The major patches since -rc4 were some sparc64 and parsic updates, but 
there's some network driver and SATA updates and a few ARM patches too. 
And a use-after-free fix in MTD.

		Linus


Summary of changes from v2.6.8-rc4 to v2.6.8
============================================

<jwboyer:infradead.org>:
  o Restore physmap configure-time settings according to user requests

<sm0407:nurfuerspam.de>:
  o cdrom: MO-drive open write fix

Aaron Grothe:
  o [CRYPTO]: Add Khazad algorithm

Andrew Chew:
  o [libata sata_nv] support for hardware, bug fixes
  o [libata] unmap MMIO region _after_ last possible usage

Andrew Morton:
  o bk-netdev-axnet_cs-fix
  o bk-netdev-hp-plus-fix

Catalin Marinas:
  o [ARM PATCH] 2012/1: Use -malignment-traps instead of
    -mshort-load-bytes if gcc supports it

Dave Hansen:
  o 4kstacks: fix compile with gcc 2.95

David S. Miller:
  o [SPARC64]: Eliminate costly sdivx from gettimeofday
  o [SPARC64]: Implement tlb flush batching just like ppc64
  o [SPARC64]: Need flush_tlb_pending() in switch_to()
  o [SPARC64]: Kill TLB rtrap debug code
  o [SPARC64]: Update defconfig
  o [SPARC64]: Always record actual PC when kernel profiling
  o [SPARC64]: Make clear_user_page more leight weight
  o [SPARC64]: Fix up copy_page just like clear_page
  o [SPARC64]: Remove memcpy Ultra3 PCACHE patching trick
  o [SPARC64]: Use saner local label names in Ultra3 copies
  o [SPARC64]: More entropy in add_timer_randomness
  o [SPARC64]: Fix spitfire bugs in tlb flush and copy_page changes
  o [SPARC64]: Kill swapper_space test in arch/sparc64/mm/tlb.c
  o [SPARC64]: Change TIF_BLKCOMMIT into a fault code
  o [SPARC64]: Update defconfig
  o [SPARC64]: Fix non-SMP build

David Woodhouse:
  o Fix use-after-free bug in MTD partitioning code
  o Cosmetic MTD changes -- update email address and idents
  o M-Systems DiskOnChip driver update
  o RedBoot flash partitioning: use vmalloc for buffer
  o Export new mtd_erase_callback() function
  o Fix MTD partitioning modular build

Eugene Surovegin:
  o [IPSEC]: Add missing flow_cache_genid update to
    xfrm_policy_delete()

Jens Axboe:
  o export kblockd_schedule_work()
  o setup queue before elevator_init()

Linus Torvalds:
  o Be a bit more anal about allowing SCSI commands to be sent
  o Pass done file pointer to block device ioctl's
  o Allow non-root users certain raw commands if they are deemed safe
  o Linux 2.6.8

Marc Singer:
  o [ARM PATCH] 2001/1: lh7a40x IDE cleanup
  o [ARM PATCH] 2002/1: lh7a40x Timer fixup

Margit Schubert-While:
  o prism54 Clarification to Viro's patch
  o prism54 URGENT - Fix IRQ handling
  o prism54 Fix memory leaks
  o prism54 Fix supported rates reporting

Martin Devera:
  o [PKT_SCHED]: Fix borrowing fairness in htb

Mathieu LESNIAK:
  o wrong mac address with netgear FA311 ethernet card

Matthew Wilcox:
  o Remove fcntl f_op
  o PA-RISC update
  o lasi_82596 update

Neil Brown:
  o Fix unsigned underflow in xdr decoding

Patrick McHardy:
  o [PKT_SCHED]: Disable local bh's when grabbing qdisc_tree_lock in
    tc_dump_tfilter

Pawel Sikora:
  o [NET]: Kill stray NET_FASTROUTE references

Roger Luethi:
  o via-rhine: Really call rhine_power_init()

Russell King:
  o [PCMCIA] pd6729: add MODULE_DESCRIPTION and MODULE_AUTHOR, fix
    comment style

Simon Kelley:
  o Atmel wireless bigendian fix

Stephen Hemminger:
  o [VLAN]: Propagate ethtool/mii ioctls to the real device
  o [VLAN]: Mirror real devices carrier and hotplug state
  o [VLAN]: Use RCU for group operations
  o [VLAN]: Fix device refcount bug
  o [BRIDGE]: Fix problems with filtering and defragmentation

Tom Rini:
  o Remove CONFIG_SERIAL_8250_MANY_PORTS from Ebony / Ocotea
  o ppc32: Fix warning on CONFIG_PPC32 && CONFIG_6xx


From: Willy Tarreau [email blocked] Subject: Re: Linux v2.6.8 - Oops on NFSv3 Date: Sat, 14 Aug 2004 12:10:39 +0200 Hi Linus & All, I've just compiled and booted 2.6.8 on my dual athlon. Everything went OK before I logged in as a non-root user whose home is mounted from another linux box over NFSv3/UDP. I got this oops : <----------- Unable to handle kernel NULL pointer dereference at virtual address 00000014 printing eip: c01f1e76 *pde = 00000000 Oops: 0002 [#1] PREEMPT SMP Modules linked in: usbmouse ohci_hcd usbcore e1000 snd_seq_midi snd_emu10k1_synth snd_emux_synth snd_seq_virmidi snd_seq_midi_emul snd_emu10k1 snd_rawmidi snd_ac97_codec snd_util_mem snd_hwdep snd_seq_oss snd_seq_midi_event snd_seq snd_seq_device snd_pcm_oss snd_pcm snd_page_alloc snd_timer snd_mixer_oss snd soundcore w83781d i2c_sensor i2c_amd756 i2c_core bsd_comp ppp_generic slhc CPU: 1 EIP: 0060:[<c01f1e76>] Not tainted EFLAGS: 00010296 (2.6.8) EIP is at nfs3_request_init+0x16/0x20 eax: 00000000 ebx: d5496620 ecx: 00000000 edx: df614880 esi: dc262000 edi: dbb4bd68 ebp: 00000000 esp: dc263c44 ds: 007b es: 007b ss: 0068 Process bash (pid: 460, threadinfo=dc262000 task=dfc3d730) Stack: dff96e00 c01ea7e8 d5496620 df614880 00000174 dbb4bd68 c12bd3c0 dc263cb0 d5496620 c01ed162 df614880 dbb4bd68 c12bd3c0 00000000 00000174 c12bd3d8 c12bd3c0 dc263dd0 dc263cb0 c014170c dc263d20 c12bd3c0 dc263d28 dc263d28 Call Trace: [<c01ea7e8>] nfs_create_request+0xd8/0xf0 [<c01ed162>] readpage_async_filler+0x52/0x100 [<c014170c>] read_cache_pages+0xac/0x160 [<c011e6b0>] autoremove_wake_function+0x0/0x40 [<c012985e>] recalc_sigpending+0xe/0x10 [<c03e3923>] rpc_call_sync+0x93/0xb0 [<c01ed29c>] nfs_readpages+0x8c/0xc0 [<c01ed110>] readpage_async_filler+0x0/0x100 [<c01417f5>] read_pages+0x35/0x130 [<c013eac4>] __alloc_pages+0xc4/0x320 [<c013ed0f>] __alloc_pages+0x30f/0x320 [<c0141cf2>] do_page_cache_readahead+0x1b2/0x1e0 [<c0141e5b>] page_cache_readahead+0x13b/0x1c0 [<c013ae88>] do_generic_mapping_read+0xb8/0x410 [<c013b488>] __generic_file_aio_read+0x1d8/0x200 [<c013b1e0>] file_read_actor+0x0/0xd0 [<c013b4f5>] generic_file_aio_read+0x45/0x50 [<c01e6128>] nfs_file_read+0xb8/0xd0 [<c0157e6a>] do_sync_read+0x7a/0xb0 [<c0157f55>] vfs_read+0xb5/0xf0 [<c0158170>] sys_read+0x40/0x70 [<c01059e3>] syscall_call+0x7/0xb Code: f0 ff 40 14 89 43 18 5b c3 90 8b 4c 24 04 8b 51 0c 3b 54 24 >>EIP; c01f1e76 <nfs3_request_init+16/20> <===== Code; c01f1e76 <nfs3_request_init+16/20> 00000000 <_EIP>: Code; c01f1e76 <nfs3_request_init+16/20> <===== 0: f0 ff 40 14 lock incl 0x14(%eax) <===== Code; c01f1e7a <nfs3_request_init+1a/20> 4: 89 43 18 mov %eax,0x18(%ebx) Code; c01f1e7d <nfs3_request_init+1d/20> 7: 5b pop %ebx Code; c01f1e7e <nfs3_request_init+1e/20> 8: c3 ret Code; c01f1e7f <nfs3_request_init+1f/20> 9: 90 nop Code; c01f1e80 <nfs3_request_compatible+0/60> a: 8b 4c 24 04 mov 0x4(%esp,1),%ecx Code; c01f1e84 <nfs3_request_compatible+4/60> e: 8b 51 0c mov 0xc(%ecx),%edx Code; c01f1e87 <nfs3_request_compatible+7/60> 11: 3b 54 24 00 cmp 0x0(%esp,1),%edx -----------> Extracts from the functions where the oops occured : void nfs3_request_init(struct nfs_page *req, struct file *filp) { req->wb_cred = get_rpccred(nfs_cred(req->wb_inode, filp)); } static inline struct rpc_cred * get_rpccred(struct rpc_cred *cred) { atomic_inc(&cred->cr_count); return cred; } static struct rpc_cred * nfs_cred(struct inode *inode, struct file *filp) { struct rpc_cred *cred = NULL; if (filp) cred = (struct rpc_cred *)filp->private_data; if (!cred) cred = NFS_I(inode)->mm_cred; return cred; } static inline struct nfs_inode *NFS_I(struct inode *inode) { return container_of(inode, struct nfs_inode, vfs_inode); } So it seems to me that both (filp or filp->private_data) and NFS_I(req->wb_inode)->mm_cred were NULL. I don't know if this is a permitted situation, but directly calling get_rpccred() from this leads to this oops. Last 2.6 kernel I tried on this machine was 2.6.7, and I did not notice this oops. Unfortunately, I don't have enough time to dig through the large patch (19MB uncompressed), nor to try different configurations. But this seems reproducible anytime I try to access a file over NFSv3. Directory listings seem OK at the moment. I've not tested other combinations of NFS/config either (I'm typing this mail from the machine, so I don't want to risk retyping everything). Since it's reproducible on a single request, I don't think that PREEMPT/SMP has anything to do with this. I can send other informations if needed. If anyone wants to suggest a patch, I can give it a try, but I won't have much time to help debugging this, unfortunately. Cheers, Willy .config used : [config]
From: Jeff Garzik [email blocked] Subject: Re: Linux v2.6.8 - Oops on NFSv3 Date: Sat, 14 Aug 2004 06:34:42 -0400 Willy Tarreau wrote: > Hi Linus & All, > > I've just compiled and booted 2.6.8 on my dual athlon. Everything went > OK before I logged in as a non-root user whose home is mounted from > another linux box over NFSv3/UDP. > > I got this oops : Already solved in another thread... http://marc.theaimsgroup.com/?l=linux-kernel&m=109247958302409&w=2
From: Linus Torvalds [email blocked] Subject: Re: Linux v2.6.8 - Oops on NFSv3 Date: Sat, 14 Aug 2004 03:41:58 -0700 (PDT) On Sat, 14 Aug 2004, Willy Tarreau wrote: > > I've just compiled and booted 2.6.8 on my dual athlon. Everything went > OK before I logged in as a non-root user whose home is mounted from > another linux box over NFSv3/UDP. Damn. I think the stupid typo in fs/nfs/file.c from the fcntl f_op removal patch is the problem. Andrew, since I'm gone in another hour, how about you try to make a 2.6.8.1 with this, since this is clearly a good reason for one? Linus --- 1.40/fs/nfs/file.c 2004-08-09 11:58:00 -07:00 +++ edited/fs/nfs/file.c 2004-08-14 03:35:11 -07:00 @@ -89,7 +89,7 @@ int res; res = nfs_check_flags(filp->f_flags); - if (!res) + if (res) return res; lock_kernel();
From: Linus Torvalds [email blocked] Subject: Re: Linux v2.6.8 - Oops on NFSv3 Date: Sat, 14 Aug 2004 03:49:00 -0700 (PDT) On Sat, 14 Aug 2004, Linus Torvalds wrote: > > Andrew, since I'm gone in another hour, how about you try to make a > 2.6.8.1 with this, since this is clearly a good reason for one? Ahh. Jeff posted the right one, obviously. Pushed to BK. I'll make a 2.6.8.1 myself, to make it usable for people with NFS. Linus
From: Christoph Hellwig [email blocked] Subject: Re: Linux v2.6.8 - Oops on NFSv3 Date: Sat, 14 Aug 2004 11:55:48 +0100 On Sat, Aug 14, 2004 at 03:49:00AM -0700, Linus Torvalds wrote: > > > On Sat, 14 Aug 2004, Linus Torvalds wrote: > > > > Andrew, since I'm gone in another hour, how about you try to make a > > 2.6.8.1 with this, since this is clearly a good reason for one? > > Ahh. Jeff posted the right one, obviously. Pushed to BK. > > I'll make a 2.6.8.1 myself, to make it usable for people with NFS. Cane we make this 2.6.9 to avoid breaking all kinds of scripts expecting three-digit kernel versions?
From: Linus Torvalds [email blocked] Subject: Re: Linux v2.6.8 - Oops on NFSv3 Date: Sat, 14 Aug 2004 04:05:56 -0700 (PDT) On Sat, 14 Aug 2004, Christoph Hellwig wrote: > > Cane we make this 2.6.9 to avoid breaking all kinds of scripts expecting > three-digit kernel versions? Well, we've been discussing the 2.6.x.y format for a while, so I see this as an opportunity to actually do it... Will it break automated scripts? Maybe. But on the other hand, we'll never even find out unless we try it some time. Linus
From: Arjan van de Ven [email blocked] Subject: Re: Linux v2.6.8 - Oops on NFSv3 Date: Sat, 14 Aug 2004 13:18:32 +0200 On Sat, 2004-08-14 at 13:05, Linus Torvalds wrote: > On Sat, 14 Aug 2004, Christoph Hellwig wrote: > > > > Cane we make this 2.6.9 to avoid breaking all kinds of scripts expecting > > three-digit kernel versions? > > Well, we've been discussing the 2.6.x.y format for a while, so I see this > as an opportunity to actually do it... Will it break automated scripts? > Maybe. But on the other hand, we'll never even find out unless we try it > some time. well... I'll volunteer to keep a 2.6.X-postY series.. this fix could be part of that. For me the -post series should be * Only patches that are in later head kernels (maybe lightly touched to resolve patch conflicts) * Only patches that fix something critical/important (where critical is of course a gray area but I'm sure a decent balance will be found)
From: Al Viro [email blocked] Subject: Re: Linux v2.6.8 - Oops on NFSv3 Date: Sat, 14 Aug 2004 12:31:38 +0100 On Sat, Aug 14, 2004 at 01:18:32PM +0200, Arjan van de Ven wrote: > On Sat, 2004-08-14 at 13:05, Linus Torvalds wrote: > > On Sat, 14 Aug 2004, Christoph Hellwig wrote: > > > > > > Cane we make this 2.6.9 to avoid breaking all kinds of scripts expecting > > > three-digit kernel versions? > > > > Well, we've been discussing the 2.6.x.y format for a while, so I see this > > as an opportunity to actually do it... Will it break automated scripts? > > Maybe. But on the other hand, we'll never even find out unless we try it > > some time. > > well... I'll volunteer to keep a 2.6.X-postY series.. this fix could be > part of that. > > For me the -post series should be > * Only patches that are in later head kernels (maybe lightly touched to > resolve patch conflicts) > * Only patches that fix something critical/important > (where critical is of course a gray area but I'm sure a decent balance > will be found) 2.6.X-paperbagY? Said that, if you start doing that - count on my help.

Related Links:

:)

Anonymous
on
August 15, 2004 - 3:35pm

Damn you guys are slow....

Funny, that patch-2.6.8.1

Anonymous
on
August 15, 2004 - 5:19pm

There's something funny with the patch. One part of it is this:

- if (flags & (O_APPEND | O_DIRECT))
+ if ((flags & (O_APPEND | O_DIRECT)) == (O_APPEND | O_DIRECT))

(flags & (O_APPEND | O_DIRECT)) == (O_APPEND | O_DIRECT)
simplifies to
(flags & P) == P #Substituted (O_APPEND | O_DIRECT) for P
which, in turn, simplifies to
flags == P #Simple bitwise logic: flags and P must be identical to yield P when AND is applied on them.

Too much coffee for either the kernel developers or me, perhaps?

Too much coffee for you :-)

on
August 15, 2004 - 5:27pm

Too much coffee for you :-)
What you are describing is bool (?) logic not bitwise.

Example:
If O_APPEND bit is set and O_DIRECT is not (and vice versa), first condition will be true, second wont.

My head hurts

Anonymous
on
August 16, 2004 - 12:45pm

Maybe I'm just not too familiar with bitwise logic, but I find the second version very confusing to read. After some thought, I've determined it says "If both O_APPEND and O_DIRECT are set, then ..."

In that case, I'd write:

if ((flags & O_APPEND) && (flags & O_DIRECT)) {

In my opinion that says exactly what it means, instead of obfuscating the meaning with unusual coding. However, maybe that is a standard way of doing it and I've just never seen it done that way before.

They're logically equivalent

on
August 17, 2004 - 11:10am

The two are logically equivalent. The former is idiomatic, and is more "optimized."


You see, the && operator implies "short circuit evaluation." That is, if the left side of && evaluates as false, the right side is not evaluated. This is important if the right half has side effects. For instance, consider:

   if (ptr && *ptr == 3)


In this example, if the pointer ptr is NULL, it will not get dereferenced. In other words, it is equivalent to this nested if statement, along with the extra branches it implies:

   if (ptr)
   {
       if (*ptr == 3)
       {
           /*... */
       }
   }


Compilers are required to implement the short-circuit semantics. They can optimize them away when it they can prove that there are no unwanted side effects. In this case, the compiler may be able to prove that.


When the compiler can prove there are no side effects due to the right-hand side of a logical operator, it may optimize a sequence such your sequence above to something slightly less pessimistic:

   if (((flags & O_APPEND) != 0) & ((flags & O_DIRECT) != 0))


It's less clear whether the compiler would succeed in seeing through this and optimize the expression down to the single test that the original code has.


For grins, I tried this on a couple compilers. I specifically tried this test code:

#define O_APPEND 02000
#define O_DIRECT 040000

extern void bar();
extern void baz();

void foo1(unsigned int flags)
{
    if ((flags & (O_APPEND | O_DIRECT)) == (O_APPEND | O_DIRECT))
        bar();
    else
        baz();
}
void foo2(unsigned int flags)
{
    if ((flags & O_APPEND) && (flags & O_DIRECT))
        bar();
    else
        baz();
}


Here's what GCC 3.4.0 for x86 output w/ -O6 -fomit-frame-pointer:

    .globl foo1
    .type   foo1, @function
foo1:
    movl    4(%esp), %eax
    andl    $17408, %eax
    cmpl    $17408, %eax
    je  .L5
    jmp baz
.L5:
    jmp bar
    .size   foo1, .-foo1
.globl foo2
    .type   foo2, @function
foo2:
    movl    4(%esp), %eax
    testb   $4, %ah
    je  .L7
    testb   $64, %ah
    jne .L9
.L7:
    jmp baz
.L9:
    jmp bar


Notice that for the first one, there's a single test/branch. For the second one, there are two tests, two branches. Ick. Branching sucks on modern CPUs. Like I said, I tried a couple compilers. I tried a TI DSP compiler for the C62x, just to see what it'd do.

_foo1:
;** --------------------------------------------------------------------------*
           MVK     .S1     17408,A3          ; |10|
||         MVK     .S2     17408,B4          ; |10|

           AND     .L1     A3,A4,A3          ; |10|
           CMPEQ   .L2X    A3,B4,B0          ; |10|
   [ B0]   B       .S1     $C$L2             ; |10|
   [!B0]   CALLRET .S1     _baz              ; |13|
   [ B0]   CALLRET .S1     _bar              ; |11|
           NOP             3
           ; BRANCHCC OCCURS {$C$L2}         ; |10|
;** 
           NOP             1
$C$RL2:    ; CALL-RETURN OCCURS {_baz}       ; |13|
$C$L2:
           NOP             2
$C$RL3:    ; CALL-RETURN OCCURS {_bar}       ; |11|

_foo2:
;** --------------------------------------------------------------------------*
$C$DW$4 
           SHR     .S1     A4,4,A3           ; |18|
           AND     .L1     A4,A3,A3          ; |18|
           EXTU    .S1     A3,21,31,A0       ; |18|
   [ A0]   B       .S1     $C$L1             ; |18|
   [!A0]   CALLRET .S1     _baz              ; |21|
   [ A0]   CALLRET .S1     _bar              ; |19|
           NOP             3
           ; BRANCHCC OCCURS {$C$L1}         ; |18|
;** 
           NOP             1
$C$RL0:    ; CALL-RETURN OCCURS {_baz}       ; |21|
;** 
$C$L1:

           NOP             2
$C$RL1:    ; CALL-RETURN OCCURS {_bar}       ; |19|


This one is interesting--if quite a bit harder to follow due to the delayed branches on the C62x architecture. (Quick primer below.) This compiler was able to at least get as far as the && to & conversion, so that there is only one actual "branch" that isn't a function call. They end up being the same speed.


So caveat emptor. Under GCC, this coding strategy actually ends up producing better object code. (At least, on x86.) Under the TI DSP compiler on C62x, it doesn't.


How many programmer cycles does it steal? Unknown. It's a common idiom, but its popularity may be due to the popularity of premature microoptimization.


Incidentally, looking at the TI compiler's output, I see that it can be optimized further.... I'll have to let the compiler guys here know. :-)





Quick primer on reading C62x code:


  • There are 32 registers, A0..A15, B0..B15.
  • The "||" operator puts the instruction explicitly in parallel with the previous instruction. Up to 8 instructions can be placed in parallel. Parallel instructions execute on the same cycle.
  • Branches (shown here as "B" and "CALLRET") have 5 "delay slots." That means the CPU will execute the next 5 cycles worth of code before the branch target.
  • The "[B0]" and "[!B0]" notation conditionalizes an instruction. It's equivalent to putting "if (B0)" or "if (!B0)" in front of the instruction. So, "[!B0] B $C$L2" means "if B0 is zero, branch to label $C$L2."
  • The designations ".S1", ".L2", etc. refer to the various functional units on the device. (There are 8 of them.) They aren't important to this discussion.

Jeremy: Ugly style!

on
August 17, 2004 - 11:16am

Just a side comment for Jeremy: The "indent every paragraph" style's ugly and dated. Just look at what it does to the hanging indents on the bulleted list! Everyone block-formats their paragraphs these days.

Ah, just my 0x02 cents. :-)

Funny, that patch-2.6.8.1

Anonymous
on
August 15, 2004 - 5:20pm

There's something funny with the patch. One part of it is this beauty:

- if (flags & (O_APPEND | O_DIRECT))
+ if ((flags & (O_APPEND | O_DIRECT)) == (O_APPEND | O_DIRECT))

(flags & (O_APPEND | O_DIRECT)) == (O_APPEND | O_DIRECT)
simplifies to
(flags & P) == P #Substituted (O_APPEND | O_DIRECT) for P
which, in turn, simplifies to
flags == P #Simple bitwise logic: flags and P must be identical to yield P when AND is applied on them.

Too much coffee for either the kernel developers or me, perhaps?

wrong

Anonymous
on
August 15, 2004 - 6:11pm

let's talk using an example:

flags = 7
p = 3

(flags & p) == p

translates to

(7 & 3) == 3

3 == 3

yet, 7 != 3. Therefore, your reasoning seems to have a fault.

I stand corrected

Anonymous
on
August 16, 2004 - 6:37am

Thanks for correcting me. I wonder how on Earth I managed to forget about upper bits. This proves, once again, that one can be wrong while being completely confident on being correct if something fundamental is overlooked.

Funny, that patch-2.6.8.1

Anonymous
on
August 17, 2004 - 11:16am

This code is correct, I believe if fixes a bug because:
- if (flags & (O_APPEND | O_DIRECT))
means that, if flags has O_APPEND or O_DIRECT is set
while
+ if ((flags & (O_APPEND | O_DIRECT)) == (O_APPEND | O_DIRECT))
means that if flags has O_APPEND and O_DIRECT are set

so they are diffrent...
Previously, if one of these flags are set, the condition will be true, the correction is that both should be set to be true...
Hope it helped

Ibrahim

finally .y

Anonymous
on
August 15, 2004 - 8:26pm

I love it. This makes so much more sense and allows people to measure all of those bk and rc snapshots. I hope this leads to a furthore measurement in version numbering of kernel work so that as much as possible can be documented and tracked.

The new attitude to "stability"

Anonymous
on
August 16, 2004 - 7:09am

The kernel developers have gone to great pains to prevent interface incompatibility to user space where possible between kernels (ie. system calls). Why the hell can't they do likewise for scripts?

Is this another "stability of production systems matters less now than it used to, as that's a vendor issue", and the attitude implied by the "new" development model? I now remember the days of Alan Cox's *stable* kernels with even more gratitude than I did before.

Re: The new attitude to "stability"

on
August 16, 2004 - 8:21am

Ditto. Please come back, AC. We need you.

flexible

Anonymous
on
August 16, 2004 - 8:01pm

Scripting languages are created in the sense they should be flexible, scalable and quick tools. I think scripting languages can catch up to this extra .y, if they can't I don't think it would be useful to continue using said language.

Matrox Framebuffer problems

Anonymous
on
August 17, 2004 - 7:51am

I cannot use 2.6.8 because i get machine freeze sometimes when i switch from X (with mga driver) and mga fb.
Is this problem still annoyng this last release?
I had this problem in 2.6.7.
Thanks

2.6.8.1 only fixes NFS

Anonymous
on
August 17, 2004 - 1:43pm

the only change in 2.6.8.1 from 2.6.8 was the NFS oops.

Matrox Framebuffer problems

Anonymous
on
August 19, 2004 - 5:17am

I get my screen go completely blank every time I try 3D screensavers for a few seconds. I think this bug surfaced in 2.6.7.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.