6 years agoutimes: synch sys_utimensat syscall with the upstream master
Konstantin Khlebnikov [Mon, 10 Nov 2008 13:06:56 +0000]
utimes: synch sys_utimensat syscall with the upstream

6 years agoubc: Fix compilation when CONFIG_UBC_DEBUG_KMEM enabled
Konstantin Ozerkov [Tue, 28 Oct 2008 11:28:07 +0000]
ubc: Fix compilation when CONFIG_UBC_DEBUG_KMEM enabled

6 years agoFix OOPS while stopping VE after binfmt_misc.ko loaded,
Konstantin Ozerkov [Mon, 29 Sep 2008 16:05:08 +0000]
Fix OOPS while stopping VE after binfmt_misc.ko loaded,

ve_binfmt_fini() should check if current VE has registered binfmt_misc fs.
(Properly handling situation while stopping VE which started before
binfmt_misc.ko loaded)

6 years agoFix broken kernel compilation after previous patch.
Konstantin Ozerkov [Fri, 26 Sep 2008 11:27:51 +0000]
Fix broken kernel compilation after previous patch.

Replace unknown type bool with int, true with 1 and false with 0.

Signed-off-by: Konstanit Ozerkov <>
Signed-off-by: Pavel Emelyanov <>

6 years agovfs: fix lock inversion in drop_pagecache_sb()
Pavel Emelyanov [Wed, 24 Sep 2008 12:53:06 +0000]
vfs: fix lock inversion in drop_pagecache_sb()

Backport mainstream commit: eccb95cee4f0d56faa46ef22fb94dd4a3578d3eb
originally done by Dmitry Monakhov.

 Fix longstanding lock inversion in drop_pagecache_sb by dropping inode_lock
 before calling __invalidate_mapping_pages().  We just have to make sure inode
 won't go away from under us by keeping reference to it and putting the
 reference only after we have safely resumed the scan of the inode list.  A bit
 tricky but not too bad...

Signed-off-by: Jan Kara <>
Cc: Fengguang Wu <>
Cc: David Chinner <>
Signed-off-by: Andrew Morton <>
Signed-off-by: Linus Torvalds <>

I also merged here one of rhel5 patches called

 From: Larry Woodman <>
 Subject: [mm] prevent cpu lockups in invalidate_mapping_pages
 Invalidate_mapping_pages() can take long long enough to incur
      cpu lockup messages.
 Bugzilla: 427798

 invalidate_mapping_pages() loops through every page between start and
 end without rescheduling.  This can cause the cpu lockup to occur if
 there are enough pages when called from the drop_caches code.  The
 attached upstream patch calls cond_resched() after each pvec is
 processed to prevent the cpu lockup.

 Fixes RHEL5-U2 blocker BZ427798

Acked-by: Rik van Riel <>


Signed-off-by: Pavel Emelyanov <>

6 years agoFix the possibility to mount nfs inside CT without appropriate feature
Marat Stanichenko [Tue, 23 Sep 2008 14:53:53 +0000]
Fix the possibility to mount nfs inside CT without appropriate feature

It's possible to mount nfs from inside the VE without nfs feature to be on.
The bug only affected vanilla kernels not rhel5 based ones.

6 years agolinux-2.6.18-028stab056.1 released v2.6.18-028stab056.1
OpenVZ team [Mon, 18 Aug 2008 09:52:55 +0000]
linux-2.6.18-028stab056.1 released

6 years agoVE: move /proc/vz/veinfo from vznetdev to vzmon
Konstantin Khlebnikov [Wed, 16 Jul 2008 07:19:28 +0000]
VE: move /proc/vz/veinfo from vznetdev to vzmon

Since some people wish to run openvz w/o venet device, but
vzlist tool relies on /proc/vz/veinfo file presence, vzmon
module is a better place for this file.

venet part of changes

Signed-off-by: Konstantin Khlebnikov <>

6 years agoVE: move /proc/vz/veinfo from vznetdev to vzmon Since some people wish to run openvz...
Konstantin Khlebnikov [Wed, 16 Jul 2008 07:16:24 +0000]
VE: move /proc/vz/veinfo from vznetdev to vzmon Since some people wish to run openvz w/o venet device, but vzlist tool relies on /proc/vz/veinfo file presence, vzmon module is a better place for this file.

Signed-off-by: Konstantin Khlebnikov <>

6 years agosysfs: add kernel.dummy-pde to prevent invisible /proc/sys/kernel #112482
Alexey Dobriyan [Wed, 16 Jul 2008 07:12:11 +0000]
sysfs: add kernel.dummy-pde to prevent invisible /proc/sys/kernel #112482

This is a mess.

There are global and VE0-local sysctl trees.

They are populated on-demand: creating creates necessary directories
if needed, removing removes directories if they become empty.

It can very well happen that VE0-local tree is empty before first module
registers sysctl.

Now, if someone instantiates /proc/sys/kernel inode while VE0-local sysctl tree
doesn't contain /proc/sys/kernel, its LPDE will be NULL.

Now module registers sysctl, proc entry is created in local list, but nobody
cares. Inode is in memory, and lookup and readdir won't find new shiny sysctl,
because they both see LPDE=NULL and thus won't iterate over local list.

Net effect -- sysctl registered but invisible in /proc

In case of BUG112482 they're kernel.vzprivrange and kernel.ve_allow_kthreads .

One solution is to make sure that /proc/sys/kernel exists in both trees before
first register. But we can't just add directory -- first "service vz stop" can
remove it due to garbage-collecting nature of sysctl removal and situation will

So, add dummy kernel/.dummy-pde which nobody removes.

Signed-off-by: Alexey Dobriyan <>

6 years agoVE: decrease ve_struct size in case of huge NR_CPUS #97575
Denis Lunev [Tue, 15 Jul 2008 14:33:48 +0000]
VE: decrease ve_struct size in case of huge NR_CPUS #97575

kstat_lat_pcpu_struct contains array of NR_CPUS elements.
Replace it with alloc_percpu data which helps to keep ve_struct
relatively small and prevents allocation fails of huge order.

Mostly relevant to IA64, where NR_CPUS=1024

Signed-off-by: Denis Lunev <>

6 years agoNFS: NFS super blocks in different VEs should be different
Denis V. Lunev [Tue, 15 Jul 2008 12:24:04 +0000]
NFS: NFS super blocks in different VEs should be different

Teach nfs_compare_super to this.

Signed-off-by: Denis V. Lunev <>
Signed-off-by: Pavel Emelyanov <>

6 years agoIOACCT: Fix read accounting discrepancy #111808
Pavel Emelianov [Mon, 14 Jul 2008 11:57:21 +0000]
IOACCT: Fix read accounting discrepancy #111808

Two places changed since we ported Andrew's patches
till he submitted them to mainline:

1. ll_rw_block doesn't need to call acct since it
   calls submit_bio, which does this
2. read_cache_pages should not acct read bytes in case
   of error

Signed-off-by: Pavel Emelianov <>

6 years agoquota: Produce correct nlink count for /proc/vz/vzaquota #115343
Konstantin Khlebnikov [Mon, 14 Jul 2008 11:56:09 +0000]
quota: Produce correct nlink count for /proc/vz/vzaquota #115343

Use count mounpoints accessible from VE as upper estimate for
count subdirectories inside /proc/vz/vzaquot.
Concept stolen from vzdq_aquotd_readdir.

Disable enumation in VE0 for performance reason (like in _readdir and _lookup)

Signed-off-by: Konstantin Khlebnikov <>

6 years agoVE: add ve mem class to sysfs Create in VE sysfs mem class and some its devices:...
Konstantin Khlebnikov [Mon, 14 Jul 2008 11:52:34 +0000]
VE: add ve mem class to sysfs Create in VE sysfs mem class and some its devices: null, zero, full, random, urandom #99897

Required for Ubuntu 8.04 and maybe some other new distro udev package.

Signed-off-by: Konstantin Khlebnikov <>

6 years agons: sys_getpriority() should return ESRCH in case global PID is used sys_getpriority...
Kirill Shileev [Mon, 14 Jul 2008 11:22:20 +0000]
ns: sys_getpriority() should return ESRCH in case global PID is used sys_getpriority(..., pid) must return ESRCH in case pid is real one and the invocation is done in CT (and not CT0) This is needed to avoid false-positive detection of root exploits by chkrootkits package.

Signed-off-by: Kirill Shileev <>

6 years agoproc: Fix proc root entry nlink count
Konstantin Khlebnikov [Mon, 14 Jul 2008 11:21:06 +0000]
proc: Fix proc root entry nlink count

* Add entries from local tree, similar as in proc_getattr;
* Use per-ve process count for VE's root, rather than the
  total number of processes in the system.

All of the above is an upper estimation, that is perfectly
fine with 'find' utlity.

Signed-off-by: Konstantin Khlebnikov <>

6 years agoproc: Fix proc entires' nlink during VE systsem startup
Konstantin Khlebnikov [Mon, 14 Jul 2008 11:20:17 +0000]
proc: Fix proc entires' nlink during VE systsem startup

Correct nlink counters on proc_dir_entry-es at thei initial tossing
around local and global trees.

Signed-off-by: Konstantin Khlebnikov <>

6 years agoproc: Fix i_nlink for proc files in getattr #114644
Konstantin Khlebnikov [Mon, 14 Jul 2008 11:18:39 +0000]
proc: Fix i_nlink for proc files in getattr #114644

Move the nlink correction from proc_lookup to proc_getattr
and change it right in the stat buffer insted of inode nlink.

Signed-off-by: Konstantin Khlebnikov <>

6 years agoProc: add empty /proc/devices to CT #114847
Vitaliy Gusev [Mon, 14 Jul 2008 11:17:49 +0000]
Proc: add empty /proc/devices to CT #114847

Maik said that some fancy tools are disappointed by
its absence on the one hand, but do not care for its
content on the other.

Signed-off-by: Vitaliy Gusev <>

6 years agonfs: fix macro in ve_nfs.h compilation when CONFIG_VE=n
Konstantin Khlebnikov [Mon, 14 Jul 2008 11:17:14 +0000]
nfs: fix macro in ve_nfs.h compilation when CONFIG_VE=n

Signed-off-by: Konstantin Khlebnikov <>

6 years agonetlink: Fix oops in netlink conntrack module If we load conntrack modules after...
Pavel Emelyanov [Mon, 14 Jul 2008 11:15:56 +0000]
netlink: Fix oops in netlink conntrack module If we load conntrack modules after ve start one pointer on ve_struct is NULL and accessing it causes an oops.

This is handled in most of the places, but the netlink
interface. Fix this one as well.

Signed-off-by: Pavel Emelyanov <>

6 years agoNETFILTER: Conntrack sysctl mess fix
Konstantin Khlebnikov [Mon, 14 Jul 2008 11:15:20 +0000]
NETFILTER: Conntrack sysctl mess fix

The ip_conntrack_checksum sysctls were added in middle of table shift
 indexies (somethere between 2.6.9 and 2.6.18).

As a result sysctl initialization in ip_conntrack_sysctl_init
become broken, and sysctl net.ipv4.netfilter.* showed strange values.

(In 2.6.24-ovz all ok)

Signed-off-by: Konstantin Khlebnikov <>

6 years agosit: Virtualize sit device #115411
Pavel Emelianov [Mon, 14 Jul 2008 11:13:23 +0000]
sit: Virtualize sit device #115411

This mostly looks as sit netnsization patches I did for
mainstream, but have some pecularities:
1. sit is builtin in ipv6 module in this kernel
2. VE_FEATURE_SIT controlls the sit availability in VE

Signed-off-by: Pavel Emelianov <>

6 years agoipv4: Use per-VE ipv4_devconf_dflt for new devices Otherwise, setting sys.ipv4.conf...
Pavel Emelianov [Mon, 14 Jul 2008 11:12:33 +0000]
ipv4: Use per-VE ipv4_devconf_dflt for new devices Otherwise, setting sys.ipv4.conf.default inside VE won't have any effect and will confuse userspace.

Signed-off-by: Pavel Emelianov <>

6 years agoIGMP: IGMP packets should be sent in the context of correct VE.
Denis V. Lunev [Mon, 14 Jul 2008 11:11:43 +0000]
IGMP: IGMP packets should be sent in the context of correct VE.

Timers by default are processed in the context of VE0. Obtain the context
from device and send the packet inside it.

(Add 2 more timers after tangaldi's patch).

Signed-off-by: Denis V. Lunev <>
Cc: Denis Tangalitchev <>

6 years agoCompilation fixes
Pavel Emelyanov [Mon, 14 Jul 2008 11:11:01 +0000]
Compilation fixes

Signed-off-by: Pavel Emelyanov <>

6 years agoNET: Re-register sysfs entry when moving netdevice into VE Seems like we only have...
Pavel Emelyanov [Mon, 14 Jul 2008 11:09:12 +0000]
NET: Re-register sysfs entry when moving netdevice into VE Seems like we only have to call netdev_(un)register_sysfs() in correct order with proper locking #98423

The only problem we may have is when register sysfs fails - there
is not way to gracefully handle this case, since this may be on
netdev_del or ve_stop action when returning error is not an option
and trying to register this thing back may fail as well.

Known side effect after this patch - the /sys/class/net/<dev>/device
symlink is broken (maybe some others will be too), but we can't
pull all that required stuff into VE...

The salt is in kernel/ve/vecall.c only, all the rest in this patch
are hunks to make that all compile.

Signed-off-by: Pavel Emelyanov <>

6 years agoVE: virtualize binfmt_misc #99599
Pavel Emelyanov [Mon, 14 Jul 2008 11:06:36 +0000]
VE: virtualize binfmt_misc #99599

Nothing special. SUN jdk complains since can't use binfmt.
Not serious and java surely works fine w/o it, but just to
make it and its users happy let's virtualize binfmt_misc.

1. register ve start-stop hook
2. register per-ve filesystem
3. make status variable per-ve
4. make list of entries per-ve
5. make vfsmnt per-ve (for simple_pin/release_fs)
6. don't forget to genocide the entries on VE stop

Signed-off-by: Pavel Emelyanov <>

6 years agoub: dentry->dentry_bc.d_ub is unreliable after the sleep #116095
Denis Lunev [Mon, 14 Jul 2008 11:05:51 +0000]
ub: dentry->dentry_bc.d_ub is unreliable after the sleep #116095

d_kill can sleep inside. In this case dentry->dentry_bc.d_ub saved before
is unreliable as we can have dcache accounting on event during sleep. In this
case we'll have saved ub == NULL and OOPS/leak inside dcache_uncharge.

Another problem here is that we should decrement inuse count on the
dentry appropriately.

Signed-off-by: Denis Lunev <>

6 years agoubc: uncharging too much for TCPSNDBUF
Denis V. Lunev [Mon, 14 Jul 2008 11:04:29 +0000]
ubc: uncharging too much for TCPSNDBUF

It is not allowed to go to the label wait_for_memory with chargesize != 0
when this space is already placed to the skb.

Signed-off-by: Denis V. Lunev <>

6 years agoub: Set correct permissions on beancounters' proc files
Pavel Emelyanov [Mon, 14 Jul 2008 11:03:57 +0000]
ub: Set correct permissions on beancounters' proc files

All these files allow to read from them only for root,
but the mode mask is r--r--r--, which sometimes confuses
the user.

Set the r-------- mask for all the bc proc files and the
r-x------ for directories.

Signed-off-by: Pavel Emelyanov <>

6 years agoUBC: fix ub proc link count
Konstantin Khlebnikov [Mon, 14 Jul 2008 10:59:34 +0000]
UBC: fix ub proc link count

Override getattr callback on /proc/bc and ubc entries to get correct nlink.

Signed-off-by: Konstantin Khlebnikov <>

6 years agoFix pte allocation OOPS on ppc64 box
Pavel Emelianov [Mon, 14 Jul 2008 10:58:40 +0000]
Fix pte allocation OOPS on ppc64 box

The return code from do_pte_alloc() MUST be checked, because
it is now likely to fail doe to UBC constraints.

Signed-off-by: Pavel Emelianov <>

6 years agoUBC: kmem pid charge size fix for debug case
Konstantin Khlebnikov [Mon, 14 Jul 2008 10:57:47 +0000]
UBC: kmem pid charge size fix for debug case

add missign CHARGE_SIZE macro

Signed-off-by: Konstantin Khlebnikov <>

6 years agoubc: alloc_pid irq fix when CONFIG_USER_RESOURCE=n
Konstantin Khlebnikov [Mon, 14 Jul 2008 10:56:37 +0000]
ubc: alloc_pid irq fix when CONFIG_USER_RESOURCE=n

Fix irq enable/disable sequence in case CONFIG_USER_RESOURCE=n

Signed-off-by: Konstantin Khlebnikov <>

6 years agoub: ub_sock_tcp_chargesend warning if called via tcp_fragment #115332
Denis V. Lunev [Mon, 14 Jul 2008 10:55:34 +0000]
ub: ub_sock_tcp_chargesend warning if called via tcp_fragment #115332

BUG: warning at kernel/ub/ub_net.c:335/__ub_skb_set_charge() (Tainted:  P     )
        [<c043b658>] ub_sock_tcp_chargesend+0x86/0x171
        [<c05db289>] tcp_fragment+0xaf/0x452
        [<c05d507a>] tcp_sacktag_write_queue+0x30f/0x71e
        [<c05d568f>] tcp_ack+0x206/0x184c
        [<c05dc61a>] __tcp_push_pending_frames+0x4ab/0x79e
        [<c05d9f6f>] tcp_rcv_established+0x76b/0x884
        [<c05df70b>] tcp_v4_do_rcv+0x40/0x329
        [<fa087154>] ipt_hook+0x28/0x30 [iptable_filter]
        [<c05c182c>] nf_iterate+0x30/0x61
        [<c05e2020>] tcp_v4_rcv+0x981/0x9d5
        [<c05c782b>] ip_local_deliver+0x1a6/0x26f
        [<c05c7642>] ip_rcv+0x4fb/0x53e
        [<c05aac62>] netif_receive_skb+0x306/0x3ac
        [<f8c4d0aa>] e1000_clean_rx_irq+0x34a/0x41f [e1000]
        [<f8c4c188>] e1000_clean+0x6b/0x222 [e1000]
        [<c05ac0bb>] net_rx_action+0x92/0x175
        [<c04271aa>] __do_softirq+0x84/0x109
        [<c0427265>] do_softirq+0x36/0x3a
        [<c0406573>] do_IRQ+0xad/0xb6
        [<c060b0b6>] common_interrupt+0x1a/0x20
        [<c0403d40>] mwait_idle+0x25/0x38
        [<c0403d05>] cpu_idle+0x5e/0x74

The warning occures when we try to charge skb that is already charged.
This is correct for the case. The size of underlying skb is changed and
we uncharge/charge to keep situation sane.

ub_skb_uncharge is equivalent to
which is just correct for the case.

Signed-off-by: Denis V. Lunev <>

6 years agoIOPRIO: per (bc, device)-pair delays between bc enqueuing and activation
Konstantin Khlebnikov [Mon, 14 Jul 2008 10:54:33 +0000]
IOPRIO: per (bc, device)-pair delays between bc enqueuing and activation

This total wait time in milliseconds is show in /proc/bc/<bc>/ioprio_queues.

Signed-off-by: Konstantin Khlebnikov <>

6 years agoUBC: Show BC IO scheduler activity in proc
Pavel Emelyanov [Mon, 14 Jul 2008 10:53:48 +0000]
UBC: Show BC IO scheduler activity in proc

Things, that may be interested for a beancounter are:

        * the number of requests on the BC
        * whether or not this BC is during a request dispatch
        * whether or not this BC is active

(all above is per-queue).

Add the /proc/bc/<id>/ioprio_queues file with the information
described above.

        sda            1 DA
        hda            0
        sda            2

Signed-off-by: Pavel Emelyanov <>

6 years agoUBC: Show BC current IO priority
Pavel Emelyanov [Mon, 14 Jul 2008 10:53:05 +0000]
UBC: Show BC current IO priority

Surprisingly, but currently on the running system, there's no
way to find out what IO priority a VE... sorry - CT has.

Add the /proc/bc/<id>/ioprio file with (currently only) this

prio: 4

Signed-off-by: Pavel Emelyanov <>

6 years agoUBC: add ub counter
Konstantin Khlebnikov [Mon, 14 Jul 2008 10:50:55 +0000]
UBC: add ub counter

Add counter of ubc. Protected with ub_hash_lock.
Needed for correct proc n_link calculation.

Signed-off-by: Konstantin Khlebnikov <>

6 years agoub: Check skb on repeated charging
Vitaliy Gusev [Mon, 14 Jul 2008 10:50:08 +0000]
ub: Check skb on repeated charging

This is a (useful) debug patch to find charge memory leak.

Signed-off-by: Vitaliy Gusev <>

6 years agoCFQ: remove variable time-slices
Konstantin Khlebnikov [Mon, 14 Jul 2008 10:47:14 +0000]
CFQ: remove variable time-slices

Remove variable bc timeslice -- with fair queue it is useless.
BC gets bigger timeslice, but bandwidth stays unchanged, because
the bc is queued according it its iotime.

Signed-off-by: Konstantin Khlebnikov <>

6 years agoCFS: Implement bandwidth distribution control
Konstantin Khlebnikov [Mon, 14 Jul 2008 10:46:14 +0000]
CFS: Implement bandwidth distribution control

The one is based on per-ioprio iotime ratio coefficient (precalculated).

Bluntly speaking, the bc iotime flows with different speed,
depending on ioprio. BC with lower IO priority sinks faster in
queue and gets less bandwidth.

Ratio coefficients selected to conform with bandwidth distribution
in the previous implementation: ratio = 100./(1+ioprio/7.)

ioprio 0 -> ratio 100 -> weight 1
ioprio 7 -> ratio  50 -> weight 2

Signed-off-by: Konstantin Khlebnikov <>

6 years agoCFQ: Correct the bc-data in-queue position
Konstantin Khlebnikov [Mon, 14 Jul 2008 10:45:02 +0000]
CFQ: Correct the bc-data in-queue position

This patch eliminates BC IO overdose/underdose after bc
start, wakeup or iotime overlap.

Queue position (cfq_bc_position) is a upper edge of previous
active BC iotime. Position updated at BC switch if it was
before new active BC iotime.

BC is enqueued according its current iotime, if the one is
withun the interval [position -/+ maximum_slice], otherwise
the iotime changed to queue position.

Signed-off-by: Konstantin Khlebnikov <>

6 years agoCFQ: Replace list of beancounters with rbtree #98276
Konstantin Khlebnikov [Mon, 14 Jul 2008 10:44:08 +0000]
CFQ: Replace list of beancounters with rbtree #98276

Replace round-robin scheduling in CFQ BC level with "fair
queuing" scheme based on used io time accounting, by replacing
the list of per cfq bc-data with rb-tree based priority
queue ordered by total used io time (cfq_bc_iotime).

This iotime is a monotonic rising counter of bc total used
io time. On bc switch the iotime of previous active bc is
updated according it used time and the bc with smallest iotime
is activated.

Signed-off-by: Konstantin Khlebnikov <>

6 years agoUBC: show how much page beancounters each UB has #114660
Pavel Emelianov [Mon, 14 Jul 2008 10:42:48 +0000]
UBC: show how much page beancounters each UB has #114660

Essentially, this is the per-UB rss value calculated
(unline physpages and privvmpages) w/o taking sharing
into account.

With this statistics (shown via /proc/bc/XXX/vmaux:rss)
we can evaluate the portion of pages, that are shared
accross beancounters (i.e. CTs) like this:

(\sum (bc.rss + bc.tmpfs_respages) - \sum (bc.physpages)) /
        (\sum (bc.rss + bc.tmpfs_respages))

Signed-off-by: Pavel Emelianov <>

6 years agosimfs: do not use s_root dentry of underlying for statfs #115232
Denis V. Lunev [Mon, 14 Jul 2008 10:41:18 +0000]
simfs: do not use s_root dentry of underlying for statfs #115232

The real problem is that s_root on the NFS super block is a crap.
Unfortunately, the original dentry (which is asked to be statfs-ed)
is not available at this point. The only visible solution for this
is to use the dentry to which simfs is point to.

Signed-off-by: Denis V. Lunev <>

6 years agotpm: Security vulnerability in tpm_write()
Michael Halcrow [Mon, 14 Jul 2008 10:35:43 +0000]
tpm: Security vulnerability in tpm_write()

tpm_write() has an elementary security vulnerability that we should
consider to be exploitable. An unsigned value is assigned to a signed
value, and then a bounds check is made against the signed value. This
patch changes the signed data type into its proper unsigned data
type. The patch also corrects the data type in tpm_read().

This issue has already been announced in a public forum:

Thus, I would like to see the patch get generally published and merged
upstream as quickly as possible.

Signed-off-by: Michael Halcrow <>
Picked-up-from-security-ml-by: Kirill Korotaev <>

6 years agotcp: Fix use-after-free of some sk_buff in tcp code #111423
Masayuki Nakagawa [Mon, 14 Jul 2008 10:34:53 +0000]
tcp: Fix use-after-free of some sk_buff in tcp code #111423

Backport of ms patch fb7e2399ec17f1004c0e0ccfd17439f8759ede01:

I encountered a kernel panic with my test program, which is a very
simple IPv6 client-server program.

The server side sets IPV6_RECVPKTINFO on a listening socket, and the
client side just sends a message to the server.  Then the kernel panic
occurs on the server.  (If you need the test program, please let me
know. I can provide it.)

This problem happens because a skb is forcibly freed in

When a socket in listening state(TCP_LISTEN) receives a syn packet,
then tcp_v6_conn_request() will be called from
tcp_rcv_state_process().  If the tcp_v6_conn_request() successfully
returns, the skb would be discarded by __kfree_skb().

However, in case of a listening socket which was already set
IPV6_RECVPKTINFO, an address of the skb will be stored in
treq->pktopts and a ref count of the skb will be incremented in
tcp_v6_conn_request().  But, even if the skb is still in use, the skb
will be freed.  Then someone still using the freed skb will cause the
kernel panic.

I suggest to use kfree_skb() instead of __kfree_skb().

Signed-off-by: Masayuki Nakagawa <>
Signed-off-by: David S. Miller <>

6 years agoRAW: Raw socket leak aka #75822
Denis V. Lunev [Mon, 14 Jul 2008 10:33:01 +0000]
RAW: Raw socket leak aka #75822

The program below just leaks the raw kernel socket

int main() {
        int fd = socket(PF_INET, SOCK_RAW, IPPROTO_UDP);
        struct sockaddr_in addr;

        memset(&addr, 0, sizeof(addr));
        inet_aton("", &addr.sin_addr);
        addr.sin_family = AF_INET;
        addr.sin_port = htons(2048);
        sendto(fd,  "a", 1, MSG_MORE, &addr, sizeof(addr));
        return 0;

Corked packet is allocated via sock_wmalloc which holds the owner socket,
so one should uncork it and flush all pending data on close. Do this in the
same way as in UDP.

Signed-off-by: Denis V. Lunev <>
Acked-by: Alexey Kuznetsov <>
Signed-off-by: Pavel Emelyanov <>

6 years agoFix the 2nd argument to tcp_prune_ofo_queue.
Pavel Emelianov [Mon, 14 Jul 2008 10:30:07 +0000]
Fix the 2nd argument to tcp_prune_ofo_queue.

It should be not the skb's truesize, but the skb itself in
order not to oops the kernel with the first tcp packet :\

Signed-off-by: Pavel Emelianov <>

6 years agoipv6: fix race between ipv6_del_addr and DAD timer #115226
Andrey Vagin [Mon, 14 Jul 2008 10:28:09 +0000]
ipv6: fix race between ipv6_del_addr and DAD timer #115226

Consider the following scenario:

  ipv6_ifa_notify(RTM_DELADDR, ifp)

after returning from the ipv6_ifa_notify and enabling BH-s
back, but *before* calling the addrconf_del_timer the
ifp->timer fires and:

    ipv6_ifa_notify(RTM_NEWADDR, ifp)

then return back to the ipv6_del_addr and:


After this we have an ifp->rt inserted into fib6 lists, but
queued for gc, which in turn can result in oopses in the
fib6_run_gc. Maybe some other nasty things, but we caught
only the oops in gc so far.

The solution is to disarm the ifp->timer before flushing the
rt from it.

(Accepted by David Miller in 2.6.26)

Signed-off-by: Andrey Vagin <>

6 years agoTCP: Add return value indication to tcp_prune_ofo_queue().
Vitaliy Gusev [Mon, 14 Jul 2008 10:25:27 +0000]
TCP: Add return value indication to tcp_prune_ofo_queue().

Returns non-zero if tp->out_of_order_queue was seen non-empty.
This allows tcp_try_rmem_schedule() to return early.

Signed-off-by: Vitaliy Gusev <>
Signed-off-by: David S. Miller <>

commit 56f367bbfd5a7439961499ca6a2f0822d2074d83
Backported on rhel5 by xemul

Signed-off-by: Vitaliy Gusev <>
Signed-off-by: Pavel Emelyanov <>

6 years agoTCP: Fix never pruned tcp out-of-order queue.
Vitaliy Gusev [Mon, 14 Jul 2008 10:23:37 +0000]
TCP: Fix never pruned tcp out-of-order queue.

tcp_prune_queue() doesn't prune an out-of-order queue at all.
Therefore sk_rmem_schedule() can fail but the out-of-order queue isn't
pruned . This can lead to tcp deadlock state if the next two
conditions are held:

1. There are a sequence hole between last received in
order segment and segments enqueued to the out-of-order queue.

2. Size of all segments in the out-of-order queue is more than tcp_mem[2].

Signed-off-by: Vitaliy Gusev <>
Signed-off-by: David S. Miller <>

git commit b000cd3707e7b25d76745f9c0e261c23d21fa578

Signed-off-by: Vitaliy Gusev <>
Signed-off-by: Pavel Emelyanov <>
Signed-off-by: Denis V. Lunev <>

6 years agomainstream: avoid potential kernel stack overflow in binfmt_misc.c
Pavel Emelyanov [Mon, 14 Jul 2008 10:18:47 +0000]
mainstream: avoid potential kernel stack overflow in binfmt_misc.c

This can be triggered with root help only, but... this is critical
for us, since now VE root may setup any rule.

Register the ":text:E::txt::/root/cat.txt:' rule in binfmt_misc
(by root) and try launching the cat.txt file (by anyone)  :)  The
result is - the endless recursion in the load_misc_binary ->
open_exec -> load_misc_binary chain and stack overflow.

There's a similar problem with binfmt_script, and there's a sh_bang
memner on linux_binprm structure to handle this, but simply raising
this in binfmt_misc may break some setups when the interpreter of
some misc binaries is a script.

So the proposal is to turn sh_bang into a bit, add a new one (the
misc_bang) and raise it in load_misc_binary. After this, even if
we set up the misc -> script -> misc loop for binfmts one of them
will step on its own bang and exit.

I've already sent this patch to mainline.

Signed-off-by: Pavel Emelyanov <>

6 years agoNETLINK: Make audit netlink socket synchronious #112588
Denis Lunev [Mon, 14 Jul 2008 10:15:55 +0000]
NETLINK: Make audit netlink socket synchronious #112588

Do not queue packet to kernel netlink socket receive queue but process it
at the time of sending. This fixes cron errors during PAM authorization.

Signed-off-by: Denis Lunev <>

6 years agoquota: compile fix
Pavel Emelyanov [Mon, 14 Jul 2008 08:45:59 +0000]
quota: compile fix

CONFIG_COMPAT hides the compat_time_t typedef, so neither
ia64 nor i386 can compile the new compat quota structure.

Signed-off-by: Pavel Emelyanov <>

6 years agoQuota: fix wrong using compat quota on i386 #115752
Vitaliy Gusev [Mon, 14 Jul 2008 08:44:50 +0000]
Quota: fix wrong using compat quota on i386 #115752

We have the two problems for v2 quota in ia32 syscall emulation:
  1. Definition of the struct compat_dqblk has fields with long type.
  2. Aligment of the struct compat_dqblk

All these things cause wrong compat_dqblk representation in user space
and application's memory corruption => in ia32 syscall emulation works
only v3 quota.

We're having 4 cases here:
old and new quota tools vs 32bit emulation and native mode.

When the bit-ness of user level is the same of the kernel,
then we're going via sys_quotactl and both - old and new quota
 is handled properly.

But when we're using a 32bit compat level and go through the
sys32_quotactl then only *new* quota tools work correctly, due
to our compat_dqlk structure is not 32bit emulation aware.

Signed-off-by: Vitaliy Gusev <>

6 years agofairsched: check that fairsched is not empty on rmnod
Dietmar Maurer [Mon, 14 Jul 2008 08:11:02 +0000]
fairsched: check that fairsched is not empty on rmnod

Check this and return EBUSY instead of BUG_ON() or oops.

Signed-off-by: Dietmar Maurer <>

6 years agoCPT: udp sockets restore fix
Andrey Mirkin [Mon, 14 Jul 2008 08:06:14 +0000]
CPT: udp sockets restore fix

Some applications (like ntpd) set on udp sockets sk_reuse to 1. So any other
applications can bind to the same port. During restore we must skip this
check and restore and bind all sockets. On IPv6 we must also force DAD
(Duplicate Address Detection) procedure to be sure that IFA_F_TENTATIVE flag
will be cleared on IPv6 address and socket can be binded to it.

Signed-off-by: Andrey Mirkin <>

6 years agoCPT: add diagnostics in case of iptables-restore fail #95952
Andrey Mirkin [Mon, 14 Jul 2008 07:42:36 +0000]
CPT: add diagnostics in case of iptables-restore fail #95952

It is not clear right now what is wrong if iptables-restore fails.
Add some diagnostics in case of error.

Signed-off-by: Andrey Mirkin <>

6 years agoCPT: restore rlimits correctly during 32bit-64bit migration
Andrey Mirkin [Mon, 14 Jul 2008 07:41:41 +0000]
CPT: restore rlimits correctly during 32bit-64bit migration

During 32bit to 64bit migration rlimits were restored incorrectly due to
different size of long on 32bit and 64bit archs. Now simple conversion is
introduced in case of 32bit-64bit migration. Infinity values are restored as
infinity values. Error is returned if value greater than RLIM_INFINITY32 is
found in dump during restore on 32bit arch.

Tested on 2.6.18-rhel5-055.1 32bit-64bit migration.

Bug #111965

Signed-off-by: Andrey Mirkin <>

6 years agoCPT: fix restore of conntrack expect timer
Andrey Mirkin [Mon, 14 Jul 2008 07:40:36 +0000]
CPT: fix restore of conntrack expect timer

One more fix of restore conntrack procedure.
Following code:

        if (ct->helper->timeout && !del_timer(&exp->timeout)) {

can lead to oops, as exp->timeout is not initialized at this point.

Actually this optimization is not needed at all.
If expectation is dying, then we will let it die by its own death.

Also in ip_conntrack_expect_insert() there is an initialization of
exp->timeout. And we can't just do add_timer() after that (as in add_timer()
we have BUG_ON(timer_pending(timer))), we must do mod_timer() instead.

Tested on 2.6.18-rhel5-055.1 kernel.

Signed-off-by: Andrey Mirkin <>

6 years agoCPT: fix reopen dentries procedure #99542
Andrey Mirkin [Mon, 14 Jul 2008 07:39:06 +0000]
CPT: fix reopen dentries procedure #99542

Dentries were not reopened correctly during checkpointing and restore.
Two bugs fixed:
1. In case of huge files (more then 2Gb) dentry_open() returns -EFBIG if
   O_LARGEFILE flag is not set. This flag should be used for temporary files
   used during checkpointing and restore process.
   Bug #99544

2. In dump_content_regular() we have following code:
  file = dentry_open(dget(file->f_dentry),
                     mntget(file->f_vfsmnt), O_RDONLY);
  if (IS_ERR(file)) {
        cpt_printk_dentry(file->f_dentry, file->f_vfsmnt);
        eprintk_ctx("cannot reopen file for read %ld\n", PTR_ERR(file));
        return PTR_ERR(file);

  Which results in kernel oops if dentry_open() returns error
  (e.g. -EFBIG because of bug #99544)

Signed-off-by: Andrey Mirkin <>

6 years agoCPT: relax check for several bind mounts on the same mount point #84310
Andrey Mirkin [Mon, 14 Jul 2008 07:25:15 +0000]
CPT: relax check for several bind mounts on the same mount point #84310

Relax check for special bind mounts which mounted several times on the same
mount point. We need to check only dentry, mount check can be skipped in this
We can't remove completely mount check as there are exist cases when we need
to check mnt too. E.g. /dev is mounted with NODEV over /dev and some file is
opened from underlying mount. If mount check is removed, then we will be able
to checkpoint such state, but we will not be able to restore it.

Correct sollution will be to dump/restore whole mount tree with overmounts.
But we can't implement this right now for number of reasons.

Signed-off-by: Andrey Mirkin <>

6 years agoCPT: fix restore of inotify on symlink #96464
Andrey Mirkin [Mon, 14 Jul 2008 07:24:09 +0000]
CPT: fix restore of inotify on symlink #96464

Inside VE file /etc/mtab is a symlink to /proc/mounts.
FreeNX server with KDE creates inotify on /etc/mtab file.
To restore such inotify we need to obtain dentry with path_lookup() and
restore inotify on it.


Minor comment:
dev@ > is it a good place to insert check into?

This is ugly, indeed.

We discussed it some time ago and found that this solution is the best,
at least for a hot fix, unless we do major architectural changes.

The problem is that rst_file() is used to restore not a file, but
pair (dentry, mnt). Normally, it is the same thing. But this damn inotify
refers to dentry, which is symlink. I think it is the only place,
where symlink appears in this form.

Correct solution would be to redesign rst_file() and convert it
to rst_dentry(). But it is an architectural change and I would not like
to go for it just for inotify.

Actually, this change would be useful, it would allow to cleanup
restore of cwd/root directories, which are also not files, but
(dentry, mnt) pairs.


Signed-off-by: Andrey Mirkin <>

6 years agoCPT: fix sign of execve() error code on ia64 #99018
Andrey Mirkin [Mon, 14 Jul 2008 07:22:55 +0000]
CPT: fix sign of execve() error code on ia64 #99018

On ia64 arch execve() returns positive error codes, not negative as
we expected. Just invert sign of error code if we are on ia64 arch.

Signed-off-by: Andrey Mirkin <>

6 years agoCPT: add lost dcache_lock protection around __d_path() #98833
Andrey Mirkin [Mon, 14 Jul 2008 07:21:56 +0000]
CPT: add lost dcache_lock protection around __d_path() #98833

Protect __d_path() call with dcache_lock spinlock.
Protect other checks with env->op_sem semaphore.

Signed-off-by: Andrey Mirkin <>

6 years agoCPT: create kernel threads in VE0 context #97124
Andrey Mirkin [Mon, 14 Jul 2008 07:19:57 +0000]
CPT: create kernel threads in VE0 context #97124

In current implementation master process which performs checkpointing has
owner_env set to VE0 and exec_env set to VE. All auxiliary kernel threads
are created with exec_env set to VE and owner_env set to VE0, so after the
do_fork_pid() we have the follwing:

 * new thread has owner_env == ve0, exec env == ve
 * its pid belongs to ve (pid->veid != 0)

That is why if ve_enter() in thread fails, then we hit BUG_ON in
 release_task -> detach_pid -> free_pid
sequence, since task owner env != pid's veid.

When enter succeeds the task's owner env becomes ve and this BUG_ON
is not triggered.

To solve this problem exec_env is switched to VE before kernel thread
creation and switched back after. Veid is passed to kernel via args. All
kernel threads are created with CLONE_VFORK to be sure that parent
process will not exit before doing exec() in thread.

Signed-off-by: Andrey Mirkin <>
Signed-off-by: Pavel Emelyanov <>

6 years agoCPT: check that VE is not running on restore #99679
Denis V. Lunev [Mon, 14 Jul 2008 07:18:14 +0000]
CPT: check that VE is not running on restore #99679

Signed-off-by: Denis V. Lunev <>

6 years agolinux-2.6.18-028stab053.18 released v2.6.18-028stab053.18
OpenVZ team [Mon, 30 Jun 2008 13:26:56 +0000]
linux-2.6.18-028stab053.18 released

6 years ago[PATCH] Fix /proc/stat btime field in VE
Konstantin Khlebnikov [Mon, 30 Jun 2008 11:06:05 +0000]
[PATCH] Fix /proc/stat btime field in VE
Make boot time to be relative to VE start time.
Some proc process tools use it to calculate process times,
but /proc/*/stat is already relative to VE start time.

6 years ago[UBC]: Endless loop in __sk_stream_wait_memory.
Denis V. Lunev [Mon, 30 Jun 2008 11:05:14 +0000]
[UBC]: Endless loop in __sk_stream_wait_memory.

The loop in __sk_stream_wait_memory when tcp_sendmsg asks to wait for
TCPSNDBUF space is endless when the timeout is not specified. The only way
out is to queue a signal for that process.

Lets return a status flag from ub_sock_snd_queue_add that UB space is
available. This is enough to make a correct decision to leave the cycle.

Signed-off-by: Denis V. Lunev <>
Signed-off-by: Pavel Emelyanov <>

6 years agoUBC: don't do preventive dentries uncharge
Alexey Dobriyan [Mon, 30 Jun 2008 11:04:45 +0000]
UBC: don't do preventive dentries uncharge

NFS in RHEL5 and in 2.6.23+ kernels started to dget parent dentry temporarily
during final dentry put. This doesn't work with current scheme, namely, "drop
all ->d_inuse counters, uncharge, do normal put later", because
ub_dget_testone() will oops on such dentries in filesystem.

So, move actual uncharge code to later stage right after dentry free, so
that "->d_inuse" won't be -1 during filesystem dentry put method.

Once we find parent dentry which won't be freed this time, drop ->d_inuse et
al counters as usually do.

Steps to reproduce:
    creat08 test from LTP on NFS mounted /vz with dentry accounting active.

    Mainline commit: e4eff1a622edd6ab7b73acd5d8763aa2fa3fee49
        aka "SUNRPC: Clean up the sillyrename code"

6 years agoBackport "clean out unused code in dentry pruning"
Alexey Dobriyan [Mon, 30 Jun 2008 11:04:14 +0000]
Backport "clean out unused code in dentry pruning"

commit 85864e103850962389d77467391bc3da021d070f
Author: Miklos Szeredi <>
Date:   Tue Oct 16 23:27:09 2007 -0700

clean out unused code in dentry pruning
It looks like in the end all pruners want parents removed.
So remove unused code and function arguments.

Signed-off-by: Miklos Szeredi <>
Signed-off-by: Andrew Morton <>
Signed-off-by: Linus Torvalds <>

6 years ago[PATCH] CPT: restore packet control block from kernels with and without IPv6
Andrey Mirkin [Mon, 30 Jun 2008 11:03:24 +0000]
[PATCH] CPT: restore packet control block from kernels with and without IPv6

More generic mechanism for restoring packet control blocks. Unfortunately we
do not save length of control block in dump and we can only try to calculate
it during restore. This method is based on knowledge that the flags value in
TCP control block is not zero for all packets in queue.
Since this image version TCP control block will be saved in IPv6 form
regardless to IPv6 config option.

Restore of control block is splitted in 4 options for any IPv6 and non-IPv6
kernel combinations.

Check is added to be sure that all control block were restored in the same
way. If it will be found that some control blocks were restored incorrectly,
then undump process will be terminated.

6 years ago[PATCH] CPT: restore mark value on conntracks
Andrey Mirkin [Mon, 30 Jun 2008 11:02:54 +0000]
[PATCH] CPT: restore mark value on conntracks

Restore mark value in conntracks as it is needed for connmark module.

6 years ago[PATCH] CPT: convert conntrack tuple from 2.6.9 kernel image
Andrey Mirkin [Mon, 30 Jun 2008 11:02:23 +0000]
[PATCH] CPT: convert conntrack tuple from 2.6.9 kernel image

Add conversion for conntrack tuple from 2.6.9 kernel image.
Check for correct value is added in decode_tuple().

6 years ago[PATCH] CPT: convert conntrack image from 2.6.9 to 2.6.18
Andrey Mirkin [Mon, 30 Jun 2008 11:02:01 +0000]
[PATCH] CPT: convert conntrack image from 2.6.9 to 2.6.18

CPT structure in image file for conntracks is different in 2.6.9 and 2.6.18
kernels (array cpt_help_data was enlarged in the middle of the structure), so
conntracks from 2.6.9 kernel are restored incorrectly on 2.6.18 kernel and
lead to kernel oops.
A simple conversion from 2.6.9 to 2.6.18 is introduced to restore conntrac

6 years ago[UB]: Double free for UDP socket
Denis V. Lunev [Mon, 30 Jun 2008 11:00:55 +0000]
[UB]: Double free for UDP socket

The socket resided in UB space waiting queue could be released. In this
case ub_snd_wakeup running on the another CPU could hold/release that
socket effectively hitting 0 refcounter second time.

RHEL5 kernel is also affected.

Signed-off-by: Denis V. Lunev <>

6 years agolinux-2.6.18-028stab053.14 released v2.6.18-028stab053.14
OpenVZ team [Mon, 2 Jun 2008 08:44:27 +0000]
linux-2.6.18-028stab053.14 released

6 years agovm audit: add VM_DONTEXPAND to mmap for drivers that need it
Nick Piggin [Mon, 2 Jun 2008 08:22:05 +0000]
vm audit: add VM_DONTEXPAND to mmap for drivers that need it

commit 2f98735c9c24ea1f0d40a364d4e63611b689b795

Drivers that register a ->fault handler, but do not range-check the
offset argument, must set VM_DONTEXPAND in the vm_flags in order to
prevent an expanding mremap from overflowing the resource.

I've audited the tree and attempted to fix these problems (usually by
adding VM_DONTEXPAND where it is not obvious).

Signed-off-by: Nick Piggin <>
Signed-off-by: Linus Torvalds <>

6 years ago[NET]: Leak network device if refcount is positive.
Denis V. Lunev [Fri, 30 May 2008 16:25:42 +0000]
[NET]: Leak network device if refcount is positive.

Unfortunately, there are some ways on which we have positive refcounters
on network device on VE stop. This bugs are rather hard to debug and locate.

The idea of this patch is to leave the loop waiting device to become free
and _leak_ this device. This is better than a node freeze.

Signed-off-by: Denis V. Lunev <>

6 years ago[IPV6]: Fix refcounting for anycast dst entries.
Denis V. Lunev [Fri, 30 May 2008 15:19:59 +0000]
[IPV6]: Fix refcounting for anycast dst entries.

The problem occures when we stop IPv6 device without dropping all addresses
on it. For such a device addrconf_ifdown marks all entries as obsolete and
ip6_del_rt called from __ipv6_dev_ac_dec return ENOENT.
The referrence is not dropped.

The fix is simple. DST entry should not keep referrence when stored in the
FIB6 tree.

Signed-off-by: Denis V. Lunev <>

6 years ago[IPV6]: inet6 device on the loopback should be kept until final stop.
Denis V. Lunev [Fri, 30 May 2008 15:18:53 +0000]
[IPV6]: inet6 device on the loopback should be kept until final stop.

Additionally, addrconf_ifdown is broken in respect to how field. It is
called with logical condition and "2" from IPv6 shutdown code. The latter
case is the same as !0 but should really destroy a device as container is
going down.

Signed-off-by: Denis V. Lunev <>

6 years ago[IPv6]: All IP6 fragments queues should be pruned on VE stop.
Denis Lunev [Fri, 30 May 2008 15:10:51 +0000]
[IPv6]: All IP6 fragments queues should be pruned on VE stop.

Potential fix for bug 75822.

6 years agoNETFILTER: fix SNAT, DNAT in CT if ip_conntrack_disable_ve0 is uset
Dmitry Mishin [Fri, 30 May 2008 15:05:35 +0000]
NETFILTER: fix SNAT, DNAT in CT if ip_conntrack_disable_ve0 is uset

If ip_conntrack_disable_ve0 option is set, than it is impossible to use nat
targets (DNAT, SNAT) inside Containers even if nat table is permitted for
them and respective modules are loaded. This patch fixes above issue.

Fixed and tested by Konstantin Khlebnikov <>.

6 years agoCpu frequency switch may be incorrect on some hardware
Konstantin Khlebnikov [Fri, 30 May 2008 15:03:02 +0000]
Cpu frequency switch may be incorrect on some hardware

Ondemand use queue_delayed_work_on call and suppose that it
works correctly. Farsched schedule kernel threads on random
cpu and timer event may called not on supposed cpu.

This leads to CPU frequency is set almost randomly.

Bug 98868

6 years ago[SCHEDULER] fix load_balance() behavior, when it's invoked on a busy PCPU.
Alexandr Andreev [Fri, 30 May 2008 15:01:12 +0000]
[SCHEDULER] fix load_balance() behavior, when it's invoked on a busy PCPU.

Bug 93544
Bug 98868

Note: looks like it works, but not sure about any kind of performance
any more. Now we can trust performance results for VE's with --cpus 1

6 years ago[PATCH] fix SMP ordering hole in fcntl_setlk()
Al Viro [Fri, 30 May 2008 14:56:39 +0000]
[PATCH] fix SMP ordering hole in fcntl_setlk()

commit 0b2bac2f1ea0d33a3621b27ca68b9ae760fca2e9

fcntl_setlk()/close() race prevention has a subtle hole - we need to
make sure that if we *do* have an fcntl/close race on SMP box, the
access to descriptor table and inode->i_flock won't get reordered.

As it is, we get STORE inode->i_flock, LOAD descriptor table entry vs.
STORE descriptor table entry, LOAD inode->i_flock with not a single
lock in common on both sides.  We do have BKL around the first STORE,
but check in locks_remove_posix() is outside of BKL and for a good
reason - we don't want BKL on common path of close(2).

Solution is to hold ->file_lock around fcheck() in there; that orders
us wrt removal from descriptor table that preceded locks_remove_posix()
on close path and we either come first (in which case eviction will be
handled by the close side) or we'll see the effect of close and do
eviction ourselves.  Note that even though it's read-only access,
we do need ->file_lock here - rcu_read_lock() won't be enough to
order the things.

Signed-off-by: Al Viro <>

6 years agoFix dnotify/close race
Al Viro [Fri, 30 May 2008 14:55:10 +0000]
Fix dnotify/close race

commit 214b7049a7929f03bbd2786aaef04b8b79db34e2

We have a race between fcntl() and close() that can lead to
dnotify_struct inserted into inode's list *after* the last descriptor
had been gone from current->files.

Since that's the only point where dnotify_struct gets evicted, we are
screwed - it will stick around indefinitely.  Even after struct file in
question is gone and freed.  Worse, we can trigger send_sigio() on it at
any later point, which allows to send an arbitrary signal to arbitrary
process if we manage to apply enough memory pressure to get the page
that used to host that struct file and fill it with the right pattern...

Signed-off-by: Al Viro <>
Signed-off-by: Linus Torvalds <>

6 years agox86: clear DF before calling signal handler
Aurelien Jarno [Fri, 30 May 2008 14:41:31 +0000]
x86: clear DF before calling signal handler

commit e40cd10ccff3d9fbffd57b93780bee4b7b9bff51

The Linux kernel currently does not clear the direction flag before
calling a signal handler, whereas the x86/x86-64 ABI requires that.

Linux had this behavior/bug forever, but this becomes a real problem
with gcc version 4.3, which assumes that the direction flag is
correctly cleared at the entry of a function.

This patches changes the setup_frame() functions to clear the
direction before entering the signal handler.

Signed-off-by: Aurelien Jarno <>
Signed-off-by: Ingo Molnar <>
Acked-by: H. Peter Anvin <>

6 years agoneofb: avoid overwriting fb_info fields
Andrew Morton [Fri, 30 May 2008 14:29:42 +0000]
neofb: avoid overwriting fb_info fields

commit 0e9045494aa50f34b774a7449dde4128240a7b00

Fix bug identified by Marcio Buss in - neofb can overwrite a field
in the fb_info struct.

This fix will result in truncated device identification strings - perhaps can be made larger?

Cc: Marcio Buss <>
Cc: "Antonino A. Daplas" <>
Cc: Christian Trefzer <>
Signed-off-by: Andrew Morton <>
Signed-off-by: Linus Torvalds <>

6 years agoI4L: fix isdn_ioctl memory overrun vulnerability
Karsten Keil [Fri, 30 May 2008 14:25:32 +0000]
I4L: fix isdn_ioctl memory overrun vulnerability

commit eafe1aa37e6ec2d56f14732b5240c4dd09f0613a

Fix possible memory overrun issue in the isdn ioctl code.

Found by ADLAB <>

Signed-off-by: Karsten Keil <>
Cc: ADLAB <>
Cc: <>
Signed-off-by: Andrew Morton <>
Signed-off-by: Linus Torvalds <>

6 years agoisdn: avoid copying overly-long strings
Karsten Keil [Fri, 30 May 2008 14:22:36 +0000]
isdn: avoid copying overly-long strings

commit 0f13864e5b24d9cbe18d125d41bfa4b726a82e40


Signed-off-by: Karsten Keil <>
Signed-off-by: Andrew Morton <>
Signed-off-by: Linus Torvalds <>

6 years agofix hugepages leak due to pagetable page sharing
Larry Woodman [Fri, 30 May 2008 13:57:16 +0000]
fix hugepages leak due to pagetable page sharing

commit c5c99429fa57dcf6e05203ebe3676db1ec646793

The shared page table code for hugetlb memory on x86 and x86_64
is causing a leak.  When a user of hugepages exits using this code
the system leaks some of the hugepages.

Part of /proc/meminfo just before database startup:
HugePages_Total:  5500
HugePages_Free:   5500
HugePages_Rsvd:      0
Hugepagesize:     2048 kB

Just before shutdown:
HugePages_Total:  5500
HugePages_Free:   4475
HugePages_Rsvd:      0
Hugepagesize:     2048 kB

After shutdown:
HugePages_Total:  5500
HugePages_Free:   4988
0 Hugepagesize:     2048 kB

The problem occurs durring a fork, in copy_hugetlb_page_range().  It
locates the dst_pte using huge_pte_alloc().  Since huge_pte_alloc() calls
huge_pmd_share() it will share the pmd page if can, yet the main loop in
copy_hugetlb_page_range() does a get_page() on every hugepage.  This is a
violation of the shared hugepmd pagetable protocol and creates additional
referenced to the hugepages causing a leak when the unmap of the VMA
occurs.  We can skip the entire replication of the ptes when the hugepage
pagetables are shared.  The attached patch skips copying the ptes and the
get_page() calls if the hugetlbpage pagetable is shared.

[ coding-style cleanups]
Signed-off-by: Larry Woodman <>
Signed-off-by: Adam Litke <>
Cc: Badari Pulavarty <>
Cc: Ken Chen <>
Cc: David Gibson <>
Cc: William Lee Irwin III <>
Signed-off-by: Andrew Morton <>
Signed-off-by: Linus Torvalds <>

6 years ago[PATCH] Fix reparenting to the same thread group. (take 2)
Eric W. Biederman [Fri, 30 May 2008 13:54:37 +0000]
[PATCH] Fix reparenting to the same thread group. (take 2)

commit b2b2cbc4b2a2f389442549399a993a8306420baf

This patch fixes the case when we reparent to a different thread in the
same thread group.  This modifies the code so that we do not send
signals and do not change the signal to send to SIGCHLD unless we have
change the thread group of our parents.  It also suppresses sending
pdeath_sig in this cas as well since the result of geppid doesn't

Thanks to Oleg for spotting my bug of only fixing this for non-ptraced

Signed-off-by: Eric W. Biederman <>
Cc: Mike Galbraith <>
Cc: Albert Cahalan <>
Cc: Andrew Morton <>
Cc: Roland McGrath <>
Cc: Ingo Molnar <>
Cc: Coywolf Qi Hunt <>
Acked-by: Oleg Nesterov <>
Signed-off-by: Linus Torvalds <>


commit 241ceee0b442c69226fb882d61d9b9785743898f
Author: Oleg Nesterov <>
Date:   Sun Dec 24 23:30:44 2006 +0300

    [PATCH] restore ->pdeath_signal behaviour

    Commit b2b2cbc4b2a2f389442549399a993a8306420baf introduced a user-
    visible change: ->pdeath_signal is sent only when the entire thread
    group exits.

    While this change is imho good, it may break things.  So restore the
    old behaviour for now.

Signed-off-by: Oleg Nesterov <>
    To: Albert Cahalan <>
Cc: Eric W. Biederman <>
Cc: Andrew Morton <>
Cc: Linus Torvalds <>
Cc: Ingo Molnar <>
Cc: Qi Yong <>
Cc: Roland McGrath <>
Signed-off-by: Linus Torvalds <>

6 years ago[CIFS] Fix buffer overflow if server sends corrupt response to small request
Steve French [Fri, 30 May 2008 13:43:30 +0000]
[CIFS] Fix buffer overflow if server sends corrupt response to small request

commit 133672efbc1085f9af990bdc145e1822ea93bcf3

In SendReceive() function in transport.c - it memcpy's
message payload into a buffer passed via out_buf param. The function
assumes that all buffers are of size (CIFSMaxBufSize +
MAX_CIFS_HDR_SIZE) , unfortunately it is also called with smaller
(MAX_CIFS_SMALL_BUFFER_SIZE) buffers.  There are eight callers
(SMB worker functions) which are primarily affected by this change:

TreeDisconnect, uLogoff, Close, findClose, SetFileSize, SetFileTimes,
Lock and PosixLock

CC: Dave Kleikamp <>
CC: Przemyslaw Wegrzyn <>
Acked-by: Jeff Layton <>
Signed-off-by: Steve French <>

6 years agox86_64: fix HPET init race
Robin Holt [Fri, 30 May 2008 13:34:57 +0000]
x86_64: fix HPET init race

commit b291aa7a6564e859af144e1bd14ffa463519b198

I have had four seperate system lockups attributable to this exact problem
in two days of testing.  Instead of trying to handle all the weird end
cases and wrap, how about changing it to look for exactly what we appear
to want.

The following patch removes a couple races in setup_APIC_timer.  One occurs
when the HPET advances the COUNTER past the T0_CMP value between the time
the T0_CMP was originally read and when COUNTER is read.  This results in
a delay waiting for the counter to wrap.  The other results from the counter

This change takes a snapshot of T0_CMP at the beginning of the loop and
simply loops until T0_CMP has changed (a tick has happened).


I have one small concern about the patch.  I am not sure it meets the intent
as well as it should.  I think we are trying to match APIC timer interrupts up
with the hpet counter increment.  The event which appears to be disturbing
this loop in our test environment is the NMI watchdog.  What we believe has
been happening with the existing code is the setup_APIC_timer loop has read
the CMP value, and the NMI watchdog code fires for the first time.  This
results in a series of icache miss slowdowns and by the time we get back to
things it has wrapped.

I think this code is trying to get the CMP as close to the counter value as
possible.  If that is the intent, maybe we should really be testing against a
"window" around the CMP.  Something like COUNTER = CMP+/2.  It appears COUNTER
should get advanced every 89nSec (IIRC).  The above seems like an unreasonably
small window, but may be necessary.  Without documentation, I am not sure of
the original intent with this code.

In summary, this code fixes my boot hangs, but since I am not certain of the
intent of the existing code, I am not certain this has not introduced new bugs
or unexpected behaviors.

Signed-off-by: Robin Holt <>
Acked-by: Andi Kleen <>
Cc: Vojtech Pavlik <>
Cc: "Aaron Durbin" <>
Signed-off-by: Andrew Morton <>
Signed-off-by: Linus Torvalds <>