Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
dbd43d08
Commit
dbd43d08
authored
Aug 06, 2006
by
Greg Kroah-Hartman
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of /home/greg/linux/git/torvalds-2.6/
parents
c34c07d6
9f737633
Changes
36
Hide whitespace changes
Inline
Side-by-side
Showing
36 changed files
with
218 additions
and
137 deletions
+218
-137
Documentation/sysctl/kernel.txt
Documentation/sysctl/kernel.txt
+2
-3
MAINTAINERS
MAINTAINERS
+8
-0
Makefile
Makefile
+1
-1
arch/sh/kernel/cpu/sh4/sq.c
arch/sh/kernel/cpu/sh4/sq.c
+7
-3
arch/x86_64/kernel/smp.c
arch/x86_64/kernel/smp.c
+1
-1
drivers/acpi/acpi_memhotplug.c
drivers/acpi/acpi_memhotplug.c
+5
-8
drivers/char/hvsi.c
drivers/char/hvsi.c
+3
-5
drivers/char/hw_random/omap-rng.c
drivers/char/hw_random/omap-rng.c
+24
-27
drivers/edac/edac_mc.h
drivers/edac/edac_mc.h
+1
-0
drivers/i2c/busses/scx200_acb.c
drivers/i2c/busses/scx200_acb.c
+5
-2
drivers/ieee1394/sbp2.c
drivers/ieee1394/sbp2.c
+3
-0
drivers/isdn/hardware/eicon/divasync.h
drivers/isdn/hardware/eicon/divasync.h
+0
-1
drivers/md/linear.c
drivers/md/linear.c
+3
-3
drivers/pnp/pnpacpi/rsparser.c
drivers/pnp/pnpacpi/rsparser.c
+8
-0
drivers/video/aty/aty128fb.c
drivers/video/aty/aty128fb.c
+3
-7
drivers/video/au1100fb.c
drivers/video/au1100fb.c
+8
-10
fs/befs/linuxvfs.c
fs/befs/linuxvfs.c
+9
-2
fs/reiserfs/file.c
fs/reiserfs/file.c
+1
-1
fs/reiserfs/inode.c
fs/reiserfs/inode.c
+14
-12
fs/reiserfs/ioctl.c
fs/reiserfs/ioctl.c
+1
-1
fs/udf/ialloc.c
fs/udf/ialloc.c
+6
-5
fs/ufs/balloc.c
fs/ufs/balloc.c
+1
-1
fs/ufs/util.c
fs/ufs/util.c
+9
-8
include/linux/debug_locks.h
include/linux/debug_locks.h
+2
-0
include/linux/sched.h
include/linux/sched.h
+8
-0
include/linux/vmstat.h
include/linux/vmstat.h
+4
-4
kernel/fork.c
kernel/fork.c
+3
-1
kernel/futex.c
kernel/futex.c
+1
-0
kernel/futex_compat.c
kernel/futex_compat.c
+3
-3
kernel/power/process.c
kernel/power/process.c
+18
-8
kernel/printk.c
kernel/printk.c
+3
-1
kernel/resource.c
kernel/resource.c
+6
-3
lib/spinlock_debug.c
lib/spinlock_debug.c
+6
-4
mm/fadvise.c
mm/fadvise.c
+2
-1
mm/memory_hotplug.c
mm/memory_hotplug.c
+34
-10
net/sunrpc/cache.c
net/sunrpc/cache.c
+5
-1
No files found.
Documentation/sysctl/kernel.txt
View file @
dbd43d08
...
...
@@ -211,9 +211,8 @@ Controls the kernel's behaviour when an oops or BUG is encountered.
0: try to continue operation
1: delay a few seconds (to give klogd time to record the oops output) and
then panic. If the `panic' sysctl is also non-zero then the machine will
be rebooted.
1: panic immediatly. If the `panic' sysctl is also non-zero then the
machine will be rebooted.
==============================================================
...
...
MAINTAINERS
View file @
dbd43d08
...
...
@@ -2648,6 +2648,14 @@ M: dbrownell@users.sourceforge.net
L: spi-devel-general@lists.sourceforge.net
S: Maintained
STABLE BRANCH:
P: Greg Kroah-Hartman
M: greg@kroah.com
P: Chris Wright
M: chrisw@sous-sol.org
L: stable@kernel.org
S: Maintained
TPM DEVICE DRIVER
P: Kylene Hall
M: kjhall@us.ibm.com
...
...
Makefile
View file @
dbd43d08
VERSION
=
2
PATCHLEVEL
=
6
SUBLEVEL
=
18
EXTRAVERSION
=
-rc
3
EXTRAVERSION
=
-rc
4
NAME
=
Crazed Snow-Weasel
# *DOCUMENTATION*
...
...
arch/sh/kernel/cpu/sh4/sq.c
View file @
dbd43d08
...
...
@@ -421,18 +421,22 @@ static struct miscdevice sq_dev = {
static
int
__init
sq_api_init
(
void
)
{
int
ret
;
printk
(
KERN_NOTICE
"sq: Registering store queue API.
\n
"
);
#ifdef CONFIG_PROC_FS
create_proc_read_entry
(
"sq_mapping"
,
0
,
0
,
sq_mapping_read_proc
,
0
);
#endif
return
misc_register
(
&
sq_dev
);
ret
=
misc_register
(
&
sq_dev
);
if
(
ret
)
remove_proc_entry
(
"sq_mapping"
,
NULL
);
return
ret
;
}
static
void
__exit
sq_api_exit
(
void
)
{
misc_deregister
(
&
sq_dev
);
remove_proc_entry
(
"sq_mapping"
,
NULL
);
}
module_init
(
sq_api_init
);
...
...
arch/x86_64/kernel/smp.c
View file @
dbd43d08
...
...
@@ -203,7 +203,7 @@ int __cpuinit init_smp_flush(void)
{
int
i
;
for_each_cpu_mask
(
i
,
cpu_possible_map
)
{
spin_lock_init
(
&
per_cpu
(
flush_state
.
tlbstate_lock
,
i
)
);
spin_lock_init
(
&
per_cpu
(
flush_state
,
i
).
tlbstate_lock
);
}
return
0
;
}
...
...
drivers/acpi/acpi_memhotplug.c
View file @
dbd43d08
...
...
@@ -129,11 +129,15 @@ acpi_memory_get_device_resources(struct acpi_memory_device *mem_device)
struct
acpi_memory_info
*
info
,
*
n
;
if
(
!
list_empty
(
&
mem_device
->
res_list
))
return
0
;
status
=
acpi_walk_resources
(
mem_device
->
device
->
handle
,
METHOD_NAME__CRS
,
acpi_memory_get_resource
,
mem_device
);
if
(
ACPI_FAILURE
(
status
))
{
list_for_each_entry_safe
(
info
,
n
,
&
mem_device
->
res_list
,
list
)
kfree
(
info
);
INIT_LIST_HEAD
(
&
mem_device
->
res_list
);
return
-
EINVAL
;
}
...
...
@@ -230,17 +234,10 @@ static int acpi_memory_enable_device(struct acpi_memory_device *mem_device)
* (i.e. memory-hot-remove function)
*/
list_for_each_entry
(
info
,
&
mem_device
->
res_list
,
list
)
{
u64
start_pfn
,
end_pfn
;
start_pfn
=
info
->
start_addr
>>
PAGE_SHIFT
;
end_pfn
=
(
info
->
start_addr
+
info
->
length
-
1
)
>>
PAGE_SHIFT
;
if
(
pfn_valid
(
start_pfn
)
||
pfn_valid
(
end_pfn
))
{
/* already enabled. try next area */
if
(
info
->
enabled
)
{
/* just sanity check...*/
num_enabled
++
;
continue
;
}
result
=
add_memory
(
node
,
info
->
start_addr
,
info
->
length
);
if
(
result
)
continue
;
...
...
drivers/char/hvsi.c
View file @
dbd43d08
...
...
@@ -311,7 +311,8 @@ static void hvsi_recv_control(struct hvsi_struct *hp, uint8_t *packet,
/* CD went away; no more connection */
pr_debug
(
"hvsi%i: CD dropped
\n
"
,
hp
->
index
);
hp
->
mctrl
&=
TIOCM_CD
;
if
(
!
(
hp
->
tty
->
flags
&
CLOCAL
))
/* If userland hasn't done an open(2) yet, hp->tty is NULL. */
if
(
hp
->
tty
&&
!
(
hp
->
tty
->
flags
&
CLOCAL
))
*
to_hangup
=
hp
->
tty
;
}
break
;
...
...
@@ -986,10 +987,7 @@ static void hvsi_write_worker(void *arg)
start_j
=
0
;
#endif
/* DEBUG */
wake_up_all
(
&
hp
->
emptyq
);
if
(
test_bit
(
TTY_DO_WRITE_WAKEUP
,
&
hp
->
tty
->
flags
)
&&
hp
->
tty
->
ldisc
.
write_wakeup
)
hp
->
tty
->
ldisc
.
write_wakeup
(
hp
->
tty
);
wake_up_interruptible
(
&
hp
->
tty
->
write_wait
);
tty_wakeup
(
hp
->
tty
);
}
out:
...
...
drivers/char/hw_random/omap-rng.c
View file @
dbd43d08
...
...
@@ -25,12 +25,12 @@
#include <linux/module.h>
#include <linux/init.h>
#include <linux/random.h>
#include <linux/clk.h>
#include <linux/err.h>
#include <linux/device.h>
#include <linux/
platform_
device.h>
#include <linux/hw_random.h>
#include <asm/io.h>
#include <asm/hardware/clock.h>
#define RNG_OUT_REG 0x00
/* Output register */
#define RNG_STAT_REG 0x04
/* Status register
...
...
@@ -52,7 +52,7 @@
static
void
__iomem
*
rng_base
;
static
struct
clk
*
rng_ick
;
static
struct
device
*
rng_dev
;
static
struct
platform_
device
*
rng_dev
;
static
u32
omap_rng_read_reg
(
int
reg
)
{
...
...
@@ -83,9 +83,8 @@ static struct hwrng omap_rng_ops = {
.
data_read
=
omap_rng_data_read
,
};
static
int
__init
omap_rng_probe
(
struct
device
*
dev
)
static
int
__init
omap_rng_probe
(
struct
platform_device
*
p
dev
)
{
struct
platform_device
*
pdev
=
to_platform_device
(
dev
);
struct
resource
*
res
,
*
mem
;
int
ret
;
...
...
@@ -95,16 +94,14 @@ static int __init omap_rng_probe(struct device *dev)
*/
BUG_ON
(
rng_dev
);
if
(
cpu_is_omap24xx
())
{
if
(
cpu_is_omap24xx
())
{
rng_ick
=
clk_get
(
NULL
,
"rng_ick"
);
if
(
IS_ERR
(
rng_ick
))
{
dev_err
(
dev
,
"Could not get rng_ick
\n
"
);
dev_err
(
&
pdev
->
dev
,
"Could not get rng_ick
\n
"
);
ret
=
PTR_ERR
(
rng_ick
);
return
ret
;
}
else
{
clk_use
(
rng_ick
);
}
}
else
clk_enable
(
rng_ick
);
}
res
=
platform_get_resource
(
pdev
,
IORESOURCE_MEM
,
0
);
...
...
@@ -117,7 +114,7 @@ static int __init omap_rng_probe(struct device *dev)
if
(
mem
==
NULL
)
return
-
EBUSY
;
dev_set_drvdata
(
dev
,
mem
);
dev_set_drvdata
(
&
pdev
->
dev
,
mem
);
rng_base
=
(
u32
__iomem
*
)
io_p2v
(
res
->
start
);
ret
=
hwrng_register
(
&
omap_rng_ops
);
...
...
@@ -127,25 +124,25 @@ static int __init omap_rng_probe(struct device *dev)
return
ret
;
}
dev_info
(
dev
,
"OMAP Random Number Generator ver. %02x
\n
"
,
dev_info
(
&
pdev
->
dev
,
"OMAP Random Number Generator ver. %02x
\n
"
,
omap_rng_read_reg
(
RNG_REV_REG
));
omap_rng_write_reg
(
RNG_MASK_REG
,
0x1
);
rng_dev
=
dev
;
rng_dev
=
p
dev
;
return
0
;
}
static
int
__exit
omap_rng_remove
(
struct
device
*
dev
)
static
int
__exit
omap_rng_remove
(
struct
platform_device
*
p
dev
)
{
struct
resource
*
mem
=
dev_get_drvdata
(
dev
);
struct
resource
*
mem
=
dev_get_drvdata
(
&
pdev
->
dev
);
hwrng_unregister
(
&
omap_rng_ops
);
omap_rng_write_reg
(
RNG_MASK_REG
,
0x0
);
if
(
cpu_is_omap24xx
())
{
clk_
unus
e
(
rng_ick
);
clk_
disabl
e
(
rng_ick
);
clk_put
(
rng_ick
);
}
...
...
@@ -157,18 +154,16 @@ static int __exit omap_rng_remove(struct device *dev)
#ifdef CONFIG_PM
static
int
omap_rng_suspend
(
struct
device
*
dev
,
pm_message_t
message
,
u32
level
)
static
int
omap_rng_suspend
(
struct
platform_device
*
pdev
,
pm_message_t
message
)
{
omap_rng_write_reg
(
RNG_MASK_REG
,
0x0
);
return
0
;
}
static
int
omap_rng_resume
(
struct
device
*
dev
,
pm_message_t
message
,
u32
level
)
static
int
omap_rng_resume
(
struct
platform_device
*
pdev
)
{
omap_rng_write_reg
(
RNG_MASK_REG
,
0x1
);
return
1
;
return
0
;
}
#else
...
...
@@ -179,9 +174,11 @@ static int omap_rng_resume(struct device *dev, pm_message_t message, u32 level)
#endif
static
struct
device_driver
omap_rng_driver
=
{
.
name
=
"omap_rng"
,
.
bus
=
&
platform_bus_type
,
static
struct
platform_driver
omap_rng_driver
=
{
.
driver
=
{
.
name
=
"omap_rng"
,
.
owner
=
THIS_MODULE
,
},
.
probe
=
omap_rng_probe
,
.
remove
=
__exit_p
(
omap_rng_remove
),
.
suspend
=
omap_rng_suspend
,
...
...
@@ -193,12 +190,12 @@ static int __init omap_rng_init(void)
if
(
!
cpu_is_omap16xx
()
&&
!
cpu_is_omap24xx
())
return
-
ENODEV
;
return
driver_register
(
&
omap_rng_driver
);
return
platform_
driver_register
(
&
omap_rng_driver
);
}
static
void
__exit
omap_rng_exit
(
void
)
{
driver_unregister
(
&
omap_rng_driver
);
platform_
driver_unregister
(
&
omap_rng_driver
);
}
module_init
(
omap_rng_init
);
...
...
drivers/edac/edac_mc.h
View file @
dbd43d08
...
...
@@ -29,6 +29,7 @@
#include <linux/rcupdate.h>
#include <linux/completion.h>
#include <linux/kobject.h>
#include <linux/platform_device.h>
#define EDAC_MC_LABEL_LEN 31
#define MC_PROC_NAME_MAX_LEN 7
...
...
drivers/i2c/busses/scx200_acb.c
View file @
dbd43d08
...
...
@@ -232,7 +232,7 @@ static void scx200_acb_poll(struct scx200_acb_iface *iface)
unsigned
long
timeout
;
timeout
=
jiffies
+
POLL_TIMEOUT
;
while
(
time_before
(
jiffies
,
timeout
)
)
{
while
(
1
)
{
status
=
inb
(
ACBST
);
/* Reset the status register to avoid the hang */
...
...
@@ -242,7 +242,10 @@ static void scx200_acb_poll(struct scx200_acb_iface *iface)
scx200_acb_machine
(
iface
,
status
);
return
;
}
yield
();
if
(
time_after
(
jiffies
,
timeout
))
break
;
cpu_relax
();
cond_resched
();
}
dev_err
(
&
iface
->
adapter
.
dev
,
"timeout in state %s
\n
"
,
...
...
drivers/ieee1394/sbp2.c
View file @
dbd43d08
...
...
@@ -2515,6 +2515,9 @@ static int sbp2scsi_slave_configure(struct scsi_device *sdev)
sdev
->
skip_ms_page_8
=
1
;
if
(
scsi_id
->
workarounds
&
SBP2_WORKAROUND_FIX_CAPACITY
)
sdev
->
fix_capacity
=
1
;
if
(
scsi_id
->
ne
->
guid_vendor_id
==
0x0010b9
&&
/* Maxtor's OUI */
(
sdev
->
type
==
TYPE_DISK
||
sdev
->
type
==
TYPE_RBC
))
sdev
->
allow_restart
=
1
;
return
0
;
}
...
...
drivers/isdn/hardware/eicon/divasync.h
View file @
dbd43d08
...
...
@@ -256,7 +256,6 @@ typedef struct
#define NO_ORDER_CHECK_MASK 0x00000010
#define LOW_CHANNEL_MASK 0x00000020
#define NO_HSCX30_MASK 0x00000040
#define MODE_MASK 0x00000080
#define SET_BOARD 0x00001000
#define SET_CRC4 0x00030000
#define SET_L1_TRISTATE 0x00040000
...
...
drivers/md/linear.c
View file @
dbd43d08
...
...
@@ -162,7 +162,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
goto
out
;
}
min_spacing
=
mddev
->
array_size
;
min_spacing
=
conf
->
array_size
;
sector_div
(
min_spacing
,
PAGE_SIZE
/
sizeof
(
struct
dev_info
*
));
/* min_spacing is the minimum spacing that will fit the hash
...
...
@@ -171,7 +171,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
* that is larger than min_spacing as use the size of that as
* the actual spacing
*/
conf
->
hash_spacing
=
mddev
->
array_size
;
conf
->
hash_spacing
=
conf
->
array_size
;
for
(
i
=
0
;
i
<
cnt
-
1
;
i
++
)
{
sector_t
sz
=
0
;
int
j
;
...
...
@@ -228,7 +228,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
curr_offset
=
0
;
i
=
0
;
for
(
curr_offset
=
0
;
curr_offset
<
mddev
->
array_size
;
curr_offset
<
conf
->
array_size
;
curr_offset
+=
conf
->
hash_spacing
)
{
while
(
i
<
mddev
->
raid_disks
-
1
&&
...
...
drivers/pnp/pnpacpi/rsparser.c
View file @
dbd43d08
...
...
@@ -173,6 +173,9 @@ pnpacpi_parse_allocated_address_space(struct pnp_resource_table *res_table,
return
;
}
if
(
p
->
producer_consumer
==
ACPI_PRODUCER
)
return
;
if
(
p
->
resource_type
==
ACPI_MEMORY_RANGE
)
pnpacpi_parse_allocated_memresource
(
res_table
,
p
->
minimum
,
p
->
address_length
);
...
...
@@ -252,9 +255,14 @@ static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res,
break
;
case
ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64
:
if
(
res
->
data
.
ext_address64
.
producer_consumer
==
ACPI_PRODUCER
)
return
AE_OK
;
break
;
case
ACPI_RESOURCE_TYPE_EXTENDED_IRQ
:
if
(
res
->
data
.
extended_irq
.
producer_consumer
==
ACPI_PRODUCER
)
return
AE_OK
;
for
(
i
=
0
;
i
<
res
->
data
.
extended_irq
.
interrupt_count
;
i
++
)
{
pnpacpi_parse_allocated_irqresource
(
res_table
,
res
->
data
.
extended_irq
.
interrupts
[
i
],
...
...
drivers/video/aty/aty128fb.c
View file @
dbd43d08
...
...
@@ -1913,9 +1913,6 @@ static int __devinit aty128_init(struct pci_dev *pdev, const struct pci_device_i
u8
chip_rev
;
u32
dac
;
if
(
!
par
->
vram_size
)
/* may have already been probed */
par
->
vram_size
=
aty_ld_le32
(
CONFIG_MEMSIZE
)
&
0x03FFFFFF
;
/* Get the chip revision */
chip_rev
=
(
aty_ld_le32
(
CONFIG_CNTL
)
>>
16
)
&
0x1F
;
...
...
@@ -2028,9 +2025,6 @@ static int __devinit aty128_init(struct pci_dev *pdev, const struct pci_device_i
aty128_init_engine
(
par
);
if
(
register_framebuffer
(
info
)
<
0
)
return
0
;
par
->
pm_reg
=
pci_find_capability
(
pdev
,
PCI_CAP_ID_PM
);
par
->
pdev
=
pdev
;
par
->
asleep
=
0
;
...
...
@@ -2040,6 +2034,9 @@ static int __devinit aty128_init(struct pci_dev *pdev, const struct pci_device_i
aty128_bl_init
(
par
);
#endif
if
(
register_framebuffer
(
info
)
<
0
)
return
0
;
printk
(
KERN_INFO
"fb%d: %s frame buffer device on %s
\n
"
,
info
->
node
,
info
->
fix
.
id
,
video_card
);
...
...
@@ -2089,7 +2086,6 @@ static int __devinit aty128_probe(struct pci_dev *pdev, const struct pci_device_
par
=
info
->
par
;
info
->
pseudo_palette
=
par
->
pseudo_palette
;
info
->
fix
=
aty128fb_fix
;
/* Virtualize mmio region */
info
->
fix
.
mmio_start
=
reg_addr
;
...
...
drivers/video/au1100fb.c
View file @
dbd43d08
...
...
@@ -156,7 +156,7 @@ int au1100fb_setmode(struct au1100fb_device *fbdev)
info
->
fix
.
visual
=
FB_VISUAL_TRUECOLOR
;
info
->
fix
.
line_length
=
info
->
var
.
xres_virtual
<<
1
;
/* depth=16 */
}
}
}
else
{
/* mono */
info
->
fix
.
visual
=
FB_VISUAL_MONO10
;
...
...
@@ -164,20 +164,16 @@ int au1100fb_setmode(struct au1100fb_device *fbdev)
}
info
->
screen_size
=
info
->
fix
.
line_length
*
info
->
var
.
yres_virtual
;
info
->
var
.
rotate
=
((
fbdev
->
panel
->
control_base
&
LCD_CONTROL_SM_MASK
)
\
>>
LCD_CONTROL_SM_BIT
)
*
90
;
/* Determine BPP mode and format */
fbdev
->
regs
->
lcd_control
=
fbdev
->
panel
->
control_base
|
((
info
->
var
.
rotate
/
90
)
<<
LCD_CONTROL_SM_BIT
);
fbdev
->
regs
->
lcd_intenable
=
0
;
fbdev
->
regs
->
lcd_intstatus
=
0
;
fbdev
->
regs
->
lcd_control
=
fbdev
->
panel
->
control_base
;
fbdev
->
regs
->
lcd_horztiming
=
fbdev
->
panel
->
horztiming
;
fbdev
->
regs
->
lcd_verttiming
=
fbdev
->
panel
->
verttiming
;
fbdev
->
regs
->
lcd_clkcontrol
=
fbdev
->
panel
->
clkcontrol_base
;
fbdev
->
regs
->
lcd_intenable
=
0
;
fbdev
->
regs
->
lcd_intstatus
=
0
;
fbdev
->
regs
->
lcd_dmaaddr0
=
LCD_DMA_SA_N
(
fbdev
->
fb_phys
);
if
(
panel_is_dual
(
fbdev
->
panel
))
{
...
...
@@ -206,6 +202,8 @@ int au1100fb_setmode(struct au1100fb_device *fbdev)
/* Resume controller */
fbdev
->
regs
->
lcd_control
|=
LCD_CONTROL_GO
;
mdelay
(
10
);
au1100fb_fb_blank
(
VESA_NO_BLANKING
,
info
);
return
0
;
}
...
...
fs/befs/linuxvfs.c
View file @
dbd43d08
...
...
@@ -512,7 +512,11 @@ befs_utf2nls(struct super_block *sb, const char *in,
wchar_t
uni
;
int
unilen
,
utflen
;
char
*
result
;
int
maxlen
=
in_len
;
/* The utf8->nls conversion can't make more chars */
/* The utf8->nls conversion won't make the final nls string bigger
* than the utf one, but if the string is pure ascii they'll have the
* same width and an extra char is needed to save the additional \0
*/
int
maxlen
=
in_len
+
1
;
befs_debug
(
sb
,
"---> utf2nls()"
);
...
...
@@ -588,7 +592,10 @@ befs_nls2utf(struct super_block *sb, const char *in,
wchar_t
uni
;
int
unilen
,
utflen
;
char
*
result
;
int
maxlen
=
3
*
in_len
;
/* There're nls characters that will translate to 3-chars-wide UTF-8
* characters, a additional byte is needed to save the final \0
* in special cases */
int
maxlen
=
(
3
*
in_len
)
+
1
;
befs_debug
(
sb
,
"---> nls2utf()
\n
"
);
...
...
fs/reiserfs/file.c
View file @
dbd43d08
...
...
@@ -48,8 +48,8 @@ static int reiserfs_file_release(struct inode *inode, struct file *filp)
return
0
;
}
reiserfs_write_lock
(
inode
->
i_sb
);
mutex_lock
(
&
inode
->
i_mutex
);
reiserfs_write_lock
(
inode
->
i_sb
);
/* freeing preallocation only involves relogging blocks that
* are already in the current transaction. preallocation gets
* freed at the end of each transaction, so it is impossible for
...
...
fs/reiserfs/inode.c
View file @
dbd43d08
...
...
@@ -39,14 +39,10 @@ void reiserfs_delete_inode(struct inode *inode)
/* The = 0 happens when we abort creating a new inode for some reason like lack of space.. */
if
(
!
(
inode
->
i_state
&
I_NEW
)
&&
INODE_PKEY
(
inode
)
->
k_objectid
!=
0
)
{
/* also handles bad_inode case */
mutex_lock
(
&
inode
->
i_mutex
);
reiserfs_delete_xattrs
(
inode
);
if
(
journal_begin
(
&
th
,
inode
->
i_sb
,
jbegin_count
))
{
mutex_unlock
(
&
inode
->
i_mutex
);
if
(
journal_begin
(
&
th
,
inode
->
i_sb
,
jbegin_count
))
goto
out
;
}
reiserfs_update_inode_transaction
(
inode
);
err
=
reiserfs_delete_object
(
&
th
,
inode
);
...
...
@@ -57,12 +53,8 @@ void reiserfs_delete_inode(struct inode *inode)
if
(
!
err
)
DQUOT_FREE_INODE
(
inode
);
if
(
journal_end
(
&
th
,
inode
->
i_sb
,
jbegin_count
))
{
mutex_unlock
(
&
inode
->
i_mutex
);
if
(
journal_end
(
&
th
,
inode
->
i_sb
,
jbegin_count
))
goto
out
;
}
mutex_unlock
(
&
inode
->
i_mutex
);
/* check return value from reiserfs_delete_object after
* ending the transaction
...
...
@@ -2348,6 +2340,7 @@ static int reiserfs_write_full_page(struct page *page,
unsigned
long
end_index
=
inode
->
i_size
>>
PAGE_CACHE_SHIFT
;
int
error
=
0
;
unsigned
long
block
;
sector_t
last_block
;
struct
buffer_head
*
head
,
*
bh
;
int
partial
=
0
;
int
nr
=
0
;
...
...
@@ -2395,10 +2388,19 @@ static int reiserfs_write_full_page(struct page *page,
}
bh
=
head
;
block
=
page
->
index
<<
(
PAGE_CACHE_SHIFT
-
s
->
s_blocksize_bits
);
last_block
=
(
i_size_read
(
inode
)
-
1
)
>>
inode
->
i_blkbits
;
/* first map all the buffers, logging any direct items we find */
do
{
if
((
checked
||
buffer_dirty
(
bh
))
&&
(
!
buffer_mapped
(
bh
)
||
(
buffer_mapped
(
bh
)
if
(
block
>
last_block
)
{
/*
* This can happen when the block size is less than
* the page size. The corresponding bytes in the page
* were zero filled above
*/
clear_buffer_dirty
(
bh
);
set_buffer_uptodate
(
bh
);
}
else
if
((
checked
||
buffer_dirty
(
bh
))
&&
(
!
buffer_mapped
(
bh
)
||
(
buffer_mapped
(
bh
)
&&
bh
->
b_blocknr
==
0
)))
{
/* not mapped yet, or it points to a direct item, search
...
...
fs/reiserfs/ioctl.c
View file @
dbd43d08
...
...
@@ -116,12 +116,12 @@ static int reiserfs_unpack(struct inode *inode, struct file *filp)
if
(
REISERFS_I
(
inode
)
->
i_flags
&
i_nopack_mask
)
{
return
0
;
}
reiserfs_write_lock
(
inode
->
i_sb
);
/* we need to make sure nobody is changing the file size beneath
** us
*/
mutex_lock
(
&
inode
->
i_mutex
);
reiserfs_write_lock
(
inode
->
i_sb
);
write_from
=
inode
->
i_size
&
(
blocksize
-
1
);
/* if we are on a block boundary, we are already unpacked. */
...
...
fs/udf/ialloc.c
View file @
dbd43d08
...
...
@@ -75,6 +75,12 @@ struct inode * udf_new_inode (struct inode *dir, int mode, int * err)
}
*
err
=
-
ENOSPC
;
UDF_I_UNIQUE
(
inode
)
=
0
;
UDF_I_LENEXTENTS
(
inode
)
=
0
;
UDF_I_NEXT_ALLOC_BLOCK
(
inode
)
=
0
;
UDF_I_NEXT_ALLOC_GOAL
(
inode
)
=
0
;
UDF_I_STRAT4096
(
inode
)
=
0
;
block
=
udf_new_block
(
dir
->
i_sb
,
NULL
,
UDF_I_LOCATION
(
dir
).
partitionReferenceNum
,
start
,
err
);
if
(
*
err
)
...
...
@@ -84,11 +90,6 @@ struct inode * udf_new_inode (struct inode *dir, int mode, int * err)
}
mutex_lock
(
&
sbi
->
s_alloc_mutex
);
UDF_I_UNIQUE
(
inode
)
=
0
;
UDF_I_LENEXTENTS
(
inode
)
=
0
;
UDF_I_NEXT_ALLOC_BLOCK
(
inode
)
=
0
;
UDF_I_NEXT_ALLOC_GOAL
(
inode
)
=
0
;
UDF_I_STRAT4096
(
inode
)
=
0
;
if
(
UDF_SB_LVIDBH
(
sb
))
{
struct
logicalVolHeaderDesc
*
lvhd
;
...
...
fs/ufs/balloc.c
View file @
dbd43d08
...
...
@@ -248,7 +248,7 @@ static void ufs_change_blocknr(struct inode *inode, unsigned int baseblk,
if
(
likely
(
cur_index
!=
index
))
{
page
=
ufs_get_locked_page
(
mapping
,
index
);
if
(
IS_ERR
(
page
))
if
(
!
page
||
IS_ERR
(
page
))
/* it was truncated or EIO */
continue
;
}
else
page
=
locked_page
;
...
...
fs/ufs/util.c
View file @
dbd43d08
...
...
@@ -251,12 +251,12 @@ struct page *ufs_get_locked_page(struct address_space *mapping,
{
struct
page
*
page
;
try_again:
page
=
find_lock_page
(
mapping
,
index
);
if
(
!
page
)
{
page
=
read_cache_page
(
mapping
,
index
,
(
filler_t
*
)
mapping
->
a_ops
->
readpage
,
NULL
);
if
(
IS_ERR
(
page
))
{
printk
(
KERN_ERR
"ufs_change_blocknr: "
"read_cache_page error: ino %lu, index: %lu
\n
"
,
...
...
@@ -266,6 +266,14 @@ try_again:
lock_page
(
page
);
if
(
unlikely
(
page
->
mapping
==
NULL
))
{
/* Truncate got there first */
unlock_page
(
page
);
page_cache_release
(
page
);
page
=
NULL
;
goto
out
;
}
if
(
!
PageUptodate
(
page
)
||
PageError
(
page
))
{
unlock_page
(
page
);
page_cache_release
(
page
);
...
...
@@ -275,15 +283,8 @@ try_again:
mapping
->
host
->
i_ino
,
index
);
page
=
ERR_PTR
(
-
EIO
);
goto
out
;
}
}
if
(
unlikely
(
!
page
->
mapping
||
!
page_has_buffers
(
page
)))
{
unlock_page
(
page
);
page_cache_release
(
page
);
goto
try_again
;
/*we really need these buffers*/
}
out:
return
page
;
}
include/linux/debug_locks.h
View file @
dbd43d08
#ifndef __LINUX_DEBUG_LOCKING_H
#define __LINUX_DEBUG_LOCKING_H
struct
task_struct
;
extern
int
debug_locks
;
extern
int
debug_locks_silent
;
...
...
include/linux/sched.h
View file @
dbd43d08
...
...
@@ -1557,6 +1557,14 @@ static inline void freeze(struct task_struct *p)
p
->
flags
|=
PF_FREEZE
;
}
/*
* Sometimes we may need to cancel the previous 'freeze' request
*/
static
inline
void
do_not_freeze
(
struct
task_struct
*
p
)
{
p
->
flags
&=
~
PF_FREEZE
;
}
/*
* Wake up a frozen process
*/
...
...
include/linux/vmstat.h
View file @
dbd43d08
...
...
@@ -41,23 +41,23 @@ DECLARE_PER_CPU(struct vm_event_state, vm_event_states);
static
inline
void
__count_vm_event
(
enum
vm_event_item
item
)
{
__get_cpu_var
(
vm_event_states
.
event
[
item
])
++
;
__get_cpu_var
(
vm_event_states
).
event
[
item
]
++
;
}
static
inline
void
count_vm_event
(
enum
vm_event_item
item
)
{
get_cpu_var
(
vm_event_states
.
event
[
item
])
++
;
get_cpu_var
(
vm_event_states
).
event
[
item
]
++
;
put_cpu
();
}
static
inline
void
__count_vm_events
(
enum
vm_event_item
item
,
long
delta
)
{
__get_cpu_var
(
vm_event_states
.
event
[
item
])
+=
delta
;
__get_cpu_var
(
vm_event_states
).
event
[
item
]
+=
delta
;
}
static
inline
void
count_vm_events
(
enum
vm_event_item
item
,
long
delta
)
{
get_cpu_var
(
vm_event_states
.
event
[
item
])
+=
delta
;
get_cpu_var
(
vm_event_states
).
event
[
item
]
+=
delta
;
put_cpu
();
}
...
...
kernel/fork.c
View file @
dbd43d08
...
...
@@ -1387,8 +1387,10 @@ long do_fork(unsigned long clone_flags,
if
(
clone_flags
&
CLONE_VFORK
)
{
wait_for_completion
(
&
vfork
);
if
(
unlikely
(
current
->
ptrace
&
PT_TRACE_VFORK_DONE
))
if
(
unlikely
(
current
->
ptrace
&
PT_TRACE_VFORK_DONE
))
{
current
->
ptrace_message
=
nr
;
ptrace_notify
((
PTRACE_EVENT_VFORK_DONE
<<
8
)
|
SIGTRAP
);
}
}
}
else
{
free_pid
(
pid
);
...
...
kernel/futex.c
View file @
dbd43d08
...
...
@@ -948,6 +948,7 @@ static int unqueue_me(struct futex_q *q)
/* In the common case we don't take the spinlock, which is nice. */
retry:
lock_ptr
=
q
->
lock_ptr
;
barrier
();
if
(
lock_ptr
!=
0
)
{
spin_lock
(
lock_ptr
);
/*
...
...
kernel/futex_compat.c
View file @
dbd43d08
...
...
@@ -39,7 +39,7 @@ void compat_exit_robust_list(struct task_struct *curr)
{
struct
compat_robust_list_head
__user
*
head
=
curr
->
compat_robust_list
;
struct
robust_list
__user
*
entry
,
*
pending
;
unsigned
int
limit
=
ROBUST_LIST_LIMIT
,
pi
;
unsigned
int
limit
=
ROBUST_LIST_LIMIT
,
pi
,
pip
;
compat_uptr_t
uentry
,
upending
;
compat_long_t
futex_offset
;
...
...
@@ -59,10 +59,10 @@ void compat_exit_robust_list(struct task_struct *curr)
* if it exists:
*/
if
(
fetch_robust_entry
(
&
upending
,
&
pending
,
&
head
->
list_op_pending
,
&
pi
))
&
head
->
list_op_pending
,
&
pi
p
))
return
;
if
(
upending
)
handle_futex_death
((
void
*
)
pending
+
futex_offset
,
curr
,
pi
);
handle_futex_death
((
void
*
)
pending
+
futex_offset
,
curr
,
pi
p
);
while
(
compat_ptr
(
uentry
)
!=
&
head
->
list
)
{
/*
...
...
kernel/power/process.c
View file @
dbd43d08
...
...
@@ -66,13 +66,25 @@ static inline void freeze_process(struct task_struct *p)
}
}
static
void
cancel_freezing
(
struct
task_struct
*
p
)
{
unsigned
long
flags
;
if
(
freezing
(
p
))
{
pr_debug
(
" clean up: %s
\n
"
,
p
->
comm
);
do_not_freeze
(
p
);
spin_lock_irqsave
(
&
p
->
sighand
->
siglock
,
flags
);
recalc_sigpending_tsk
(
p
);
spin_unlock_irqrestore
(
&
p
->
sighand
->
siglock
,
flags
);
}
}
/* 0 = success, else # of processes that we failed to stop */
int
freeze_processes
(
void
)
{
int
todo
,
nr_user
,
user_frozen
;
unsigned
long
start_time
;
struct
task_struct
*
g
,
*
p
;
unsigned
long
flags
;
printk
(
"Stopping tasks: "
);
start_time
=
jiffies
;
...
...
@@ -85,6 +97,10 @@ int freeze_processes(void)
continue
;
if
(
frozen
(
p
))
continue
;
if
(
p
->
state
==
TASK_TRACED
&&
frozen
(
p
->
parent
))
{
cancel_freezing
(
p
);
continue
;
}
if
(
p
->
mm
&&
!
(
p
->
flags
&
PF_BORROWED_MM
))
{
/* The task is a user-space one.
* Freeze it unless there's a vfork completion
...
...
@@ -126,13 +142,7 @@ int freeze_processes(void)
do_each_thread
(
g
,
p
)
{
if
(
freezeable
(
p
)
&&
!
frozen
(
p
))
printk
(
KERN_ERR
" %s
\n
"
,
p
->
comm
);
if
(
freezing
(
p
))
{
pr_debug
(
" clean up: %s
\n
"
,
p
->
comm
);
p
->
flags
&=
~
PF_FREEZE
;
spin_lock_irqsave
(
&
p
->
sighand
->
siglock
,
flags
);
recalc_sigpending_tsk
(
p
);
spin_unlock_irqrestore
(
&
p
->
sighand
->
siglock
,
flags
);
}
cancel_freezing
(
p
);
}
while_each_thread
(
g
,
p
);
read_unlock
(
&
tasklist_lock
);
return
todo
;
...
...
kernel/printk.c
View file @
dbd43d08
...
...
@@ -799,6 +799,9 @@ void release_console_sem(void)
up
(
&
secondary_console_sem
);
return
;
}
console_may_schedule
=
0
;
for
(
;
;
)
{
spin_lock_irqsave
(
&
logbuf_lock
,
flags
);
wake_klogd
|=
log_start
-
log_end
;
...
...
@@ -812,7 +815,6 @@ void release_console_sem(void)
local_irq_restore
(
flags
);
}
console_locked
=
0
;
console_may_schedule
=
0
;
up
(
&
console_sem
);
spin_unlock_irqrestore
(
&
logbuf_lock
,
flags
);
if
(
wake_klogd
&&
!
oops_in_progress
&&
waitqueue_active
(
&
log_wait
))
{
...
...
kernel/resource.c
View file @
dbd43d08
...
...
@@ -244,6 +244,7 @@ int find_next_system_ram(struct resource *res)
start
=
res
->
start
;
end
=
res
->
end
;
BUG_ON
(
start
>=
end
);
read_lock
(
&
resource_lock
);
for
(
p
=
iomem_resource
.
child
;
p
;
p
=
p
->
sibling
)
{
...
...
@@ -254,15 +255,17 @@ int find_next_system_ram(struct resource *res)
p
=
NULL
;
break
;
}
if
(
p
->
start
>=
start
)
if
(
(
p
->
end
>=
start
)
&&
(
p
->
start
<
end
)
)
break
;
}
read_unlock
(
&
resource_lock
);
if
(
!
p
)
return
-
1
;
/* copy data */
res
->
start
=
p
->
start
;
res
->
end
=
p
->
end
;
if
(
res
->
start
<
p
->
start
)
res
->
start
=
p
->
start
;
if
(
res
->
end
>
p
->
end
)
res
->
end
=
p
->
end
;
return
0
;
}
#endif
...
...
lib/spinlock_debug.c
View file @
dbd43d08
...
...
@@ -162,6 +162,7 @@ static void rwlock_bug(rwlock_t *lock, const char *msg)
#define RWLOCK_BUG_ON(cond, lock, msg) if (unlikely(cond)) rwlock_bug(lock, msg)
#if 0 /* __write_lock_debug() can lock up - maybe this can too? */
static void __read_lock_debug(rwlock_t *lock)
{
int print_once = 1;
...
...
@@ -184,12 +185,12 @@ static void __read_lock_debug(rwlock_t *lock)
}
}
}
#endif
void
_raw_read_lock
(
rwlock_t
*
lock
)
{
RWLOCK_BUG_ON
(
lock
->
magic
!=
RWLOCK_MAGIC
,
lock
,
"bad magic"
);
if
(
unlikely
(
!
__raw_read_trylock
(
&
lock
->
raw_lock
)))
__read_lock_debug
(
lock
);
__raw_read_lock
(
&
lock
->
raw_lock
);
}
int
_raw_read_trylock
(
rwlock_t
*
lock
)
...
...
@@ -235,6 +236,7 @@ static inline void debug_write_unlock(rwlock_t *lock)
lock
->
owner_cpu
=
-
1
;
}
#if 0 /* This can cause lockups */
static void __write_lock_debug(rwlock_t *lock)
{
int print_once = 1;
...
...
@@ -257,12 +259,12 @@ static void __write_lock_debug(rwlock_t *lock)
}
}
}
#endif
void
_raw_write_lock
(
rwlock_t
*
lock
)
{
debug_write_lock_before
(
lock
);
if
(
unlikely
(
!
__raw_write_trylock
(
&
lock
->
raw_lock
)))
__write_lock_debug
(
lock
);
__raw_write_lock
(
&
lock
->
raw_lock
);
debug_write_lock_after
(
lock
);
}
...
...
mm/fadvise.c
View file @
dbd43d08
...
...
@@ -73,7 +73,6 @@ asmlinkage long sys_fadvise64_64(int fd, loff_t offset, loff_t len, int advice)
file
->
f_ra
.
ra_pages
=
bdi
->
ra_pages
*
2
;
break
;
case
POSIX_FADV_WILLNEED
:
case
POSIX_FADV_NOREUSE
:
if
(
!
mapping
->
a_ops
->
readpage
)
{
ret
=
-
EINVAL
;
break
;
...
...
@@ -94,6 +93,8 @@ asmlinkage long sys_fadvise64_64(int fd, loff_t offset, loff_t len, int advice)
if
(
ret
>
0
)
ret
=
0
;
break
;
case
POSIX_FADV_NOREUSE
:
break
;
case
POSIX_FADV_DONTNEED
:
if
(
!
bdi_write_congested
(
mapping
->
backing_dev_info
))
filemap_flush
(
mapping
);
...
...
mm/memory_hotplug.c
View file @
dbd43d08
...
...
@@ -52,6 +52,9 @@ static int __add_section(struct zone *zone, unsigned long phys_start_pfn)
int
nr_pages
=
PAGES_PER_SECTION
;
int
ret
;
if
(
pfn_valid
(
phys_start_pfn
))
return
-
EEXIST
;
ret
=
sparse_add_one_section
(
zone
,
phys_start_pfn
,
nr_pages
);
if
(
ret
<
0
)
...
...
@@ -76,15 +79,22 @@ int __add_pages(struct zone *zone, unsigned long phys_start_pfn,
{
unsigned
long
i
;
int
err
=
0
;
int
start_sec
,
end_sec
;
/* during initialize mem_map, align hot-added range to section */
start_sec
=
pfn_to_section_nr
(
phys_start_pfn
);
end_sec
=
pfn_to_section_nr
(
phys_start_pfn
+
nr_pages
-
1
);
for
(
i
=
0
;
i
<
nr_pages
;
i
+=
PAGES_PER_SECTION
)
{
err
=
__add_section
(
zone
,
phys_start_pfn
+
i
);
for
(
i
=
start_sec
;
i
<=
end_sec
;
i
++
)
{
err
=
__add_section
(
zone
,
i
<<
PFN_SECTION_SHIFT
);
/* We want to keep adding the rest of the
* sections if the first ones already exist
/*
* EEXIST is finally dealed with by ioresource collision
* check. see add_memory() => register_memory_resource()
* Warning will be printed if there is collision.
*/
if
(
err
&&
(
err
!=
-
EEXIST
))
break
;
err
=
0
;
}
return
err
;
...
...
@@ -156,7 +166,7 @@ int online_pages(unsigned long pfn, unsigned long nr_pages)
res
.
flags
=
IORESOURCE_MEM
;
/* we just need system ram */
section_end
=
res
.
end
;
while
(
find_next_system_ram
(
&
res
)
>=
0
)
{
while
(
(
res
.
start
<
res
.
end
)
&&
(
find_next_system_ram
(
&
res
)
>=
0
)
)
{
start_pfn
=
(
unsigned
long
)(
res
.
start
>>
PAGE_SHIFT
);
nr_pages
=
(
unsigned
long
)
((
res
.
end
+
1
-
res
.
start
)
>>
PAGE_SHIFT
);
...
...
@@ -213,10 +223,9 @@ static void rollback_node_hotadd(int nid, pg_data_t *pgdat)
}
/* add this memory to iomem resource */
static
void
register_memory_resource
(
u64
start
,
u64
size
)
static
struct
resource
*
register_memory_resource
(
u64
start
,
u64
size
)
{
struct
resource
*
res
;
res
=
kzalloc
(
sizeof
(
struct
resource
),
GFP_KERNEL
);
BUG_ON
(
!
res
);
...
...
@@ -228,7 +237,18 @@ static void register_memory_resource(u64 start, u64 size)
printk
(
"System RAM resource %llx - %llx cannot be added
\n
"
,
(
unsigned
long
long
)
res
->
start
,
(
unsigned
long
long
)
res
->
end
);
kfree
(
res
);
res
=
NULL
;
}
return
res
;
}
static
void
release_memory_resource
(
struct
resource
*
res
)
{
if
(
!
res
)
return
;
release_resource
(
res
);
kfree
(
res
);
return
;
}
...
...
@@ -237,8 +257,13 @@ int add_memory(int nid, u64 start, u64 size)
{
pg_data_t
*
pgdat
=
NULL
;
int
new_pgdat
=
0
;
struct
resource
*
res
;
int
ret
;
res
=
register_memory_resource
(
start
,
size
);
if
(
!
res
)
return
-
EEXIST
;
if
(
!
node_online
(
nid
))
{
pgdat
=
hotadd_new_pgdat
(
nid
,
start
);
if
(
!
pgdat
)
...
...
@@ -268,14 +293,13 @@ int add_memory(int nid, u64 start, u64 size)
BUG_ON
(
ret
);
}
/* register this memory as resource */
register_memory_resource
(
start
,
size
);
return
ret
;
error:
/* rollback pgdat allocation and others */
if
(
new_pgdat
)
rollback_node_hotadd
(
nid
,
pgdat
);
if
(
res
)
release_memory_resource
(
res
);
return
ret
;
}
...
...
net/sunrpc/cache.c
View file @
dbd43d08
...
...
@@ -71,7 +71,12 @@ struct cache_head *sunrpc_cache_lookup(struct cache_detail *detail,
new
=
detail
->
alloc
();
if
(
!
new
)
return
NULL
;
/* must fully initialise 'new', else
* we might get lose if we need to
* cache_put it soon.
*/
cache_init
(
new
);
detail
->
init
(
new
,
key
);
write_lock
(
&
detail
->
hash_lock
);
...
...
@@ -85,7 +90,6 @@ struct cache_head *sunrpc_cache_lookup(struct cache_detail *detail,
return
tmp
;
}
}
detail
->
init
(
new
,
key
);
new
->
next
=
*
head
;
*
head
=
new
;
detail
->
entries
++
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment