Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
d1c8fac1
Commit
d1c8fac1
authored
Oct 09, 2002
by
James Simmons
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://linux.bkbits.net/linux-2.5
into maxwell.earthlink.net:/usr/src/linus-2.5
parents
7999a2d4
6a839d30
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
65 additions
and
130 deletions
+65
-130
drivers/char/raw.c
drivers/char/raw.c
+18
-59
fs/jbd/transaction.c
fs/jbd/transaction.c
+2
-1
fs/read_write.c
fs/read_write.c
+4
-2
include/asm-i386/pgtable.h
include/asm-i386/pgtable.h
+9
-0
include/linux/radix-tree.h
include/linux/radix-tree.h
+0
-3
kernel/timer.c
kernel/timer.c
+22
-24
lib/radix-tree.c
lib/radix-tree.c
+6
-34
mm/mremap.c
mm/mremap.c
+2
-1
mm/swap_state.c
mm/swap_state.c
+2
-6
No files found.
drivers/char/raw.c
View file @
d1c8fac1
...
...
@@ -30,6 +30,10 @@ static struct file_operations raw_ctl_fops;
/*
* Open/close code for raw IO.
*
* We just rewrite the i_mapping for the /dev/raw/rawN file descriptor to
* point at the blockdev's address_space and set the file handle to use
* O_DIRECT.
*
* Set the device's soft blocksize to the minimum possible. This gives the
* finest possible alignment and has no adverse impact on performance.
*/
...
...
@@ -56,7 +60,12 @@ static int raw_open(struct inode *inode, struct file *filp)
err
=
blkdev_get
(
bdev
,
filp
->
f_mode
,
0
,
BDEV_RAW
);
if
(
!
err
)
{
err
=
set_blocksize
(
bdev
,
bdev_hardsect_size
(
bdev
));
raw_devices
[
minor
].
inuse
++
;
if
(
err
==
0
)
{
raw_devices
[
minor
].
inuse
++
;
filp
->
f_dentry
->
d_inode
->
i_mapping
=
bdev
->
bd_inode
->
i_mapping
;
filp
->
f_flags
|=
O_DIRECT
;
}
}
}
up
(
&
raw_mutex
);
...
...
@@ -200,72 +209,22 @@ raw_ctl_ioctl(struct inode *inode, struct file *filp,
return
err
;
}
static
ssize_t
rw_raw_dev
(
int
rw
,
struct
file
*
filp
,
const
struct
iovec
*
iov
,
unsigned
long
nr_segs
,
loff_t
*
offp
)
{
const
int
minor
=
minor
(
filp
->
f_dentry
->
d_inode
->
i_rdev
);
struct
block_device
*
bdev
=
raw_devices
[
minor
].
binding
;
struct
inode
*
inode
=
bdev
->
bd_inode
;
size_t
count
=
iov_length
(
iov
,
nr_segs
);
ssize_t
ret
=
0
;
if
(
count
==
0
)
goto
out
;
if
((
ssize_t
)
count
<
0
)
return
-
EINVAL
;
if
(
*
offp
>=
inode
->
i_size
)
return
-
ENXIO
;
if
(
count
+
*
offp
>
inode
->
i_size
)
{
count
=
inode
->
i_size
-
*
offp
;
nr_segs
=
iov_shorten
((
struct
iovec
*
)
iov
,
nr_segs
,
count
);
}
ret
=
generic_file_direct_IO
(
rw
,
filp
,
iov
,
*
offp
,
nr_segs
);
if
(
ret
>
0
)
*
offp
+=
ret
;
out:
return
ret
;
}
static
ssize_t
raw_read
(
struct
file
*
filp
,
char
*
buf
,
size_t
size
,
loff_t
*
offp
)
{
struct
iovec
local_iov
=
{
.
iov_base
=
buf
,
.
iov_len
=
size
};
return
rw_raw_dev
(
READ
,
filp
,
&
local_iov
,
1
,
offp
);
}
static
ssize_t
raw_write
(
struct
file
*
filp
,
const
char
*
buf
,
size_t
size
,
loff_t
*
offp
)
static
ssize_t
raw_file_write
(
struct
file
*
file
,
const
char
*
buf
,
size_t
count
,
loff_t
*
ppos
)
{
struct
iovec
local_iov
=
{
.
iov_base
=
(
char
*
)
buf
,
.
iov_len
=
size
};
struct
iovec
local_iov
=
{
.
iov_base
=
(
void
*
)
buf
,
.
iov_len
=
count
};
return
rw_raw_dev
(
WRITE
,
filp
,
&
local_iov
,
1
,
offp
);
}
static
ssize_t
raw_readv
(
struct
file
*
filp
,
const
struct
iovec
*
iov
,
unsigned
long
nr_segs
,
loff_t
*
offp
)
{
return
rw_raw_dev
(
READ
,
filp
,
iov
,
nr_segs
,
offp
);
}
static
ssize_t
raw_writev
(
struct
file
*
filp
,
const
struct
iovec
*
iov
,
unsigned
long
nr_segs
,
loff_t
*
offp
)
{
return
rw_raw_dev
(
WRITE
,
filp
,
iov
,
nr_segs
,
offp
);
return
generic_file_write_nolock
(
file
,
&
local_iov
,
1
,
ppos
);
}
static
struct
file_operations
raw_fops
=
{
.
read
=
raw
_read
,
.
write
=
raw_write
,
.
read
=
generic_file
_read
,
.
write
=
raw_
file_
write
,
.
open
=
raw_open
,
.
release
=
raw_release
,
.
ioctl
=
raw_ioctl
,
.
readv
=
raw
_readv
,
.
writev
=
raw
_writev
,
.
readv
=
generic_file
_readv
,
.
writev
=
generic_file
_writev
,
.
owner
=
THIS_MODULE
,
};
...
...
fs/jbd/transaction.c
View file @
d1c8fac1
...
...
@@ -1434,9 +1434,10 @@ int journal_stop(handle_t *handle)
* by 30x or more...
*/
if
(
handle
->
h_sync
)
{
set_current_state
(
TASK_RUNNING
);
do
{
old_handle_count
=
transaction
->
t_handle_count
;
yield
();
schedule
();
}
while
(
old_handle_count
!=
transaction
->
t_handle_count
);
}
...
...
fs/read_write.c
View file @
d1c8fac1
...
...
@@ -316,7 +316,7 @@ static ssize_t do_readv_writev(int type, struct file *file,
size_t
tot_len
;
struct
iovec
iovstack
[
UIO_FASTIOV
];
struct
iovec
*
iov
=
iovstack
;
ssize_t
ret
=
-
EINVAL
;
ssize_t
ret
;
int
seg
;
io_fn_t
fn
;
iov_fn_t
fnv
;
...
...
@@ -325,8 +325,9 @@ static ssize_t do_readv_writev(int type, struct file *file,
/*
* SuS says "The readv() function *may* fail if the iovcnt argument
* was less than or equal to 0, or greater than {IOV_MAX}. Linux has
* traditionally returned
-EINVAL
for zero segments, so...
* traditionally returned
zero
for zero segments, so...
*/
ret
=
0
;
if
(
nr_segs
==
0
)
goto
out
;
...
...
@@ -334,6 +335,7 @@ static ssize_t do_readv_writev(int type, struct file *file,
* First get the "struct iovec" from user memory and
* verify all the pointers
*/
ret
=
-
EINVAL
;
if
((
nr_segs
>
UIO_MAXIOV
)
||
(
nr_segs
<=
0
))
goto
out
;
if
(
!
file
->
f_op
)
...
...
include/asm-i386/pgtable.h
View file @
d1c8fac1
...
...
@@ -259,12 +259,21 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
#define pte_offset_kernel(dir, address) \
((pte_t *) pmd_page_kernel(*(dir)) + __pte_offset(address))
#if defined(CONFIG_HIGHPTE)
#define pte_offset_map(dir, address) \
((pte_t *)kmap_atomic(pmd_page(*(dir)),KM_PTE0) + __pte_offset(address))
#define pte_offset_map_nested(dir, address) \
((pte_t *)kmap_atomic(pmd_page(*(dir)),KM_PTE1) + __pte_offset(address))
#define pte_unmap(pte) kunmap_atomic(pte, KM_PTE0)
#define pte_unmap_nested(pte) kunmap_atomic(pte, KM_PTE1)
#else
#define pte_offset_map(dir, address) \
((pte_t *)page_address(pmd_page(*(dir))) + __pte_offset(address))
#define pte_offset_map_nested(dir, address) pte_offset_map(dir, address)
#define pte_unmap(pte) do { } while (0)
#define pte_unmap_nested(pte) do { } while (0)
#endif
#if defined(CONFIG_HIGHPTE) && defined(CONFIG_HIGHMEM4G)
typedef
u32
pte_addr_t
;
...
...
include/linux/radix-tree.h
View file @
d1c8fac1
...
...
@@ -21,8 +21,6 @@
struct
radix_tree_node
;
#define RADIX_TREE_SLOT_RESERVED ((void *)~0UL)
struct
radix_tree_root
{
unsigned
int
height
;
int
gfp_mask
;
...
...
@@ -41,7 +39,6 @@ do { \
(root)->rnode = NULL; \
} while (0)
extern
int
radix_tree_reserve
(
struct
radix_tree_root
*
,
unsigned
long
,
void
***
);
extern
int
radix_tree_insert
(
struct
radix_tree_root
*
,
unsigned
long
,
void
*
);
extern
void
*
radix_tree_lookup
(
struct
radix_tree_root
*
,
unsigned
long
);
extern
int
radix_tree_delete
(
struct
radix_tree_root
*
,
unsigned
long
);
...
...
kernel/timer.c
View file @
d1c8fac1
...
...
@@ -266,29 +266,31 @@ int del_timer(timer_t *timer)
int
del_timer_sync
(
timer_t
*
timer
)
{
tvec_base_t
*
base
=
tvec_bases
;
int
i
,
ret
;
int
i
,
ret
=
0
;
ret
=
del_timer
(
timer
);
del_again:
ret
+=
del_timer
(
timer
);
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
)
{
for
(
i
=
0
;
i
<
NR_CPUS
;
i
++
,
base
++
)
{
if
(
!
cpu_online
(
i
))
continue
;
if
(
base
->
running_timer
==
timer
)
{
while
(
base
->
running_timer
==
timer
)
{
cpu_relax
();
preempt_disable
();
preempt_enable
();
preempt_check_resched
();
}
break
;
}
base
++
;
}
if
(
timer_pending
(
timer
))
goto
del_again
;
return
ret
;
}
#endif
static
void
cascade
(
tvec_base_t
*
base
,
tvec_t
*
tv
)
static
int
cascade
(
tvec_base_t
*
base
,
tvec_t
*
tv
)
{
/* cascade all the timers from tv up one level */
struct
list_head
*
head
,
*
curr
,
*
next
;
...
...
@@ -310,7 +312,8 @@ static void cascade(tvec_base_t *base, tvec_t *tv)
curr
=
next
;
}
INIT_LIST_HEAD
(
head
);
tv
->
index
=
(
tv
->
index
+
1
)
&
TVN_MASK
;
return
tv
->
index
=
(
tv
->
index
+
1
)
&
TVN_MASK
;
}
/***
...
...
@@ -322,26 +325,18 @@ static void cascade(tvec_base_t *base, tvec_t *tv)
*/
static
inline
void
__run_timers
(
tvec_base_t
*
base
)
{
unsigned
long
flags
;
spin_lock_irqsave
(
&
base
->
lock
,
flags
);
spin_lock_irq
(
&
base
->
lock
);
while
((
long
)(
jiffies
-
base
->
timer_jiffies
)
>=
0
)
{
struct
list_head
*
head
,
*
curr
;
/*
* Cascade timers:
*/
if
(
!
base
->
tv1
.
index
)
{
cascade
(
base
,
&
base
->
tv2
);
if
(
base
->
tv2
.
index
==
1
)
{
cascade
(
base
,
&
base
->
tv3
);
if
(
base
->
tv3
.
index
==
1
)
{
cascade
(
base
,
&
base
->
tv4
);
if
(
base
->
tv4
.
index
==
1
)
cascade
(
base
,
&
base
->
tv5
);
}
}
}
if
(
!
base
->
tv1
.
index
&&
(
cascade
(
base
,
&
base
->
tv2
)
==
1
)
&&
(
cascade
(
base
,
&
base
->
tv3
)
==
1
)
&&
cascade
(
base
,
&
base
->
tv4
)
==
1
)
cascade
(
base
,
&
base
->
tv5
);
repeat:
head
=
base
->
tv1
.
vec
+
base
->
tv1
.
index
;
curr
=
head
->
next
;
...
...
@@ -360,7 +355,10 @@ static inline void __run_timers(tvec_base_t *base)
base
->
running_timer
=
timer
;
#endif
spin_unlock_irq
(
&
base
->
lock
);
fn
(
data
);
if
(
!
fn
)
printk
(
"Bad: timer %p has NULL fn. (data: %08lx)
\n
"
,
timer
,
data
);
else
fn
(
data
);
spin_lock_irq
(
&
base
->
lock
);
goto
repeat
;
}
...
...
@@ -370,7 +368,7 @@ static inline void __run_timers(tvec_base_t *base)
#if CONFIG_SMP
base
->
running_timer
=
NULL
;
#endif
spin_unlock_irq
restore
(
&
base
->
lock
,
flags
);
spin_unlock_irq
(
&
base
->
lock
);
}
/******************************************************************/
...
...
lib/radix-tree.c
View file @
d1c8fac1
...
...
@@ -77,7 +77,6 @@ static inline unsigned long radix_tree_maxindex(unsigned int height)
return
index
;
}
/*
* Extend a radix tree so it can store key @index.
*/
...
...
@@ -109,16 +108,15 @@ static int radix_tree_extend(struct radix_tree_root *root, unsigned long index)
return
0
;
}
/**
* radix_tree_
reserve - reserve space in
a radix tree
* radix_tree_
insert - insert into
a radix tree
* @root: radix tree root
* @index: index key
* @
pslot: pointer to reserved slo
t
* @
item: item to inser
t
*
*
Reserve a slot in a radix tree for the key
@index.
*
Insert an item into the radix tree at position
@index.
*/
int
radix_tree_
reserve
(
struct
radix_tree_root
*
root
,
unsigned
long
index
,
void
***
pslot
)
int
radix_tree_
insert
(
struct
radix_tree_root
*
root
,
unsigned
long
index
,
void
*
item
)
{
struct
radix_tree_node
*
node
=
NULL
,
*
tmp
,
**
slot
;
unsigned
int
height
,
shift
;
...
...
@@ -158,36 +156,11 @@ int radix_tree_reserve(struct radix_tree_root *root, unsigned long index, void *
if
(
node
)
node
->
count
++
;
*
pslot
=
(
void
**
)
slot
;
**
pslot
=
RADIX_TREE_SLOT_RESERVED
;
*
slot
=
item
;
return
0
;
}
EXPORT_SYMBOL
(
radix_tree_reserve
);
/**
* radix_tree_insert - insert into a radix tree
* @root: radix tree root
* @index: index key
* @item: item to insert
*
* Insert an item into the radix tree at position @index.
*/
int
radix_tree_insert
(
struct
radix_tree_root
*
root
,
unsigned
long
index
,
void
*
item
)
{
void
**
slot
;
int
error
;
error
=
radix_tree_reserve
(
root
,
index
,
&
slot
);
if
(
!
error
)
*
slot
=
item
;
return
error
;
}
EXPORT_SYMBOL
(
radix_tree_insert
);
/**
* radix_tree_lookup - perform lookup operation on a radix tree
* @root: radix tree root
...
...
@@ -267,8 +240,8 @@ __lookup(struct radix_tree_root *root, void **results, unsigned long index,
out:
*
next_index
=
index
;
return
nr_found
;
}
/**
* radix_tree_gang_lookup - perform multiple lookup on a radix tree
* @root: radix tree root
...
...
@@ -371,7 +344,6 @@ int radix_tree_delete(struct radix_tree_root *root, unsigned long index)
return
0
;
}
EXPORT_SYMBOL
(
radix_tree_delete
);
static
void
radix_tree_node_ctor
(
void
*
node
,
kmem_cache_t
*
cachep
,
unsigned
long
flags
)
...
...
mm/mremap.c
View file @
d1c8fac1
...
...
@@ -194,7 +194,8 @@ static inline unsigned long move_vma(struct vm_area_struct * vma,
prev
->
vm_end
=
next
->
vm_end
;
__vma_unlink
(
mm
,
next
,
prev
);
spin_unlock
(
&
mm
->
page_table_lock
);
if
(
vma
==
next
)
vma
=
prev
;
mm
->
map_count
--
;
kmem_cache_free
(
vm_area_cachep
,
next
);
}
...
...
mm/swap_state.c
View file @
d1c8fac1
...
...
@@ -199,16 +199,14 @@ void delete_from_swap_cache(struct page *page)
int
move_to_swap_cache
(
struct
page
*
page
,
swp_entry_t
entry
)
{
struct
address_space
*
mapping
=
page
->
mapping
;
void
**
pslot
;
int
err
;
write_lock
(
&
swapper_space
.
page_lock
);
write_lock
(
&
mapping
->
page_lock
);
err
=
radix_tree_
reserve
(
&
swapper_space
.
page_tree
,
entry
.
val
,
&
pslot
);
err
=
radix_tree_
insert
(
&
swapper_space
.
page_tree
,
entry
.
val
,
page
);
if
(
!
err
)
{
__remove_from_page_cache
(
page
);
*
pslot
=
page
;
___add_to_page_cache
(
page
,
&
swapper_space
,
entry
.
val
);
}
...
...
@@ -231,7 +229,6 @@ int move_from_swap_cache(struct page *page, unsigned long index,
struct
address_space
*
mapping
)
{
swp_entry_t
entry
;
void
**
pslot
;
int
err
;
BUG_ON
(
!
PageLocked
(
page
));
...
...
@@ -243,10 +240,9 @@ int move_from_swap_cache(struct page *page, unsigned long index,
write_lock
(
&
swapper_space
.
page_lock
);
write_lock
(
&
mapping
->
page_lock
);
err
=
radix_tree_
reserve
(
&
mapping
->
page_tree
,
index
,
&
pslot
);
err
=
radix_tree_
insert
(
&
mapping
->
page_tree
,
index
,
page
);
if
(
!
err
)
{
__delete_from_swap_cache
(
page
);
*
pslot
=
page
;
___add_to_page_cache
(
page
,
mapping
,
index
);
}
...
...
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