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
Kirill Smelkov
linux
Commits
f3d40e81
Commit
f3d40e81
authored
Nov 23, 2007
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Import 2.2.3pre2
parent
9ffb8c3a
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
86 additions
and
58 deletions
+86
-58
MAINTAINERS
MAINTAINERS
+1
-1
fs/buffer.c
fs/buffer.c
+4
-14
fs/nfs/dir.c
fs/nfs/dir.c
+8
-20
fs/nfs/nfs2xdr.c
fs/nfs/nfs2xdr.c
+1
-0
include/linux/mm.h
include/linux/mm.h
+16
-14
include/linux/nfs.h
include/linux/nfs.h
+1
-0
include/linux/sched.h
include/linux/sched.h
+52
-0
kernel/printk.c
kernel/printk.c
+3
-9
No files found.
MAINTAINERS
View file @
f3d40e81
...
@@ -522,7 +522,7 @@ S: Maintained
...
@@ -522,7 +522,7 @@ S: Maintained
NETWORKING [IPv4/IPv6]
NETWORKING [IPv4/IPv6]
P: David S. Miller
P: David S. Miller
M: davem@
dm.cobaltmicro
.com
M: davem@
redhat
.com
P: Andi Kleen
P: Andi Kleen
M: ak@muc.de
M: ak@muc.de
P: Alexey Kuznetsov
P: Alexey Kuznetsov
...
...
fs/buffer.c
View file @
f3d40e81
...
@@ -74,7 +74,6 @@ static struct wait_queue * buffer_wait = NULL;
...
@@ -74,7 +74,6 @@ static struct wait_queue * buffer_wait = NULL;
static
int
nr_buffers
=
0
;
static
int
nr_buffers
=
0
;
static
int
nr_buffers_type
[
NR_LIST
]
=
{
0
,};
static
int
nr_buffers_type
[
NR_LIST
]
=
{
0
,};
static
int
size_buffers_type
[
NR_LIST
]
=
{
0
,};
static
int
nr_buffer_heads
=
0
;
static
int
nr_buffer_heads
=
0
;
static
int
nr_unused_buffer_heads
=
0
;
static
int
nr_unused_buffer_heads
=
0
;
...
@@ -100,8 +99,7 @@ union bdflush_param{
...
@@ -100,8 +99,7 @@ union bdflush_param{
each time we call refill */
each time we call refill */
int
nref_dirt
;
/* Dirty buffer threshold for activating bdflush
int
nref_dirt
;
/* Dirty buffer threshold for activating bdflush
when trying to refill buffers. */
when trying to refill buffers. */
int
pct_dirt
;
/* Max %age of mem for dirty buffers before
int
dummy1
;
/* unused */
activating bdflush */
int
age_buffer
;
/* Time for normal buffer to age before
int
age_buffer
;
/* Time for normal buffer to age before
we flush it */
we flush it */
int
age_super
;
/* Time for superblock to age before we
int
age_super
;
/* Time for superblock to age before we
...
@@ -482,7 +480,6 @@ static void remove_from_queues(struct buffer_head * bh)
...
@@ -482,7 +480,6 @@ static void remove_from_queues(struct buffer_head * bh)
return
;
return
;
}
}
nr_buffers_type
[
bh
->
b_list
]
--
;
nr_buffers_type
[
bh
->
b_list
]
--
;
size_buffers_type
[
bh
->
b_list
]
-=
bh
->
b_size
;
remove_from_hash_queue
(
bh
);
remove_from_hash_queue
(
bh
);
remove_from_lru_list
(
bh
);
remove_from_lru_list
(
bh
);
}
}
...
@@ -556,7 +553,6 @@ static void insert_into_queues(struct buffer_head * bh)
...
@@ -556,7 +553,6 @@ static void insert_into_queues(struct buffer_head * bh)
(
*
bhp
)
->
b_prev_free
=
bh
;
(
*
bhp
)
->
b_prev_free
=
bh
;
nr_buffers_type
[
bh
->
b_list
]
++
;
nr_buffers_type
[
bh
->
b_list
]
++
;
size_buffers_type
[
bh
->
b_list
]
+=
bh
->
b_size
;
/* Put the buffer in new hash-queue if it has a device. */
/* Put the buffer in new hash-queue if it has a device. */
bh
->
b_next
=
NULL
;
bh
->
b_next
=
NULL
;
...
@@ -808,19 +804,13 @@ void refile_buffer(struct buffer_head * buf)
...
@@ -808,19 +804,13 @@ void refile_buffer(struct buffer_head * buf)
file_buffer
(
buf
,
dispose
);
file_buffer
(
buf
,
dispose
);
if
(
dispose
==
BUF_DIRTY
)
{
if
(
dispose
==
BUF_DIRTY
)
{
int
too_many
=
(
nr_buffers
*
bdf_prm
.
b_un
.
nfract
/
100
);
int
too_many
=
(
nr_buffers
*
bdf_prm
.
b_un
.
nfract
/
100
);
int
too_large
=
(
num_physpages
*
bdf_prm
.
b_un
.
pct_dirt
/
100
);
/* This buffer is dirty, maybe we need to start flushing.
/* This buffer is dirty, maybe we need to start flushing.
* If too high a percentage of the buffers are dirty...
* If too high a percentage of the buffers are dirty...
*/
*/
if
(
nr_buffers_type
[
BUF_DIRTY
]
>
too_many
||
if
(
nr_buffers_type
[
BUF_DIRTY
]
>
too_many
)
size_buffers_type
[
BUF_DIRTY
]
/
PAGE_SIZE
>
too_large
)
{
wakeup_bdflush
(
1
);
if
(
nr_buffers_type
[
BUF_LOCKED
]
>
3
*
bdf_prm
.
b_un
.
ndirty
)
wakeup_bdflush
(
1
);
else
wakeup_bdflush
(
0
);
}
/* If this is a loop device, and
/* If this is a loop device, and
* more than half of the buffers are dirty...
* more than half of the buffers are dirty...
* (Prevents no-free-buffers deadlock with loop device.)
* (Prevents no-free-buffers deadlock with loop device.)
...
...
fs/nfs/dir.c
View file @
f3d40e81
...
@@ -713,17 +713,6 @@ static int nfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
...
@@ -713,17 +713,6 @@ static int nfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
return
error
;
return
error
;
}
}
/*
* To avoid retaining a stale inode reference, we check the dentry
* use count prior to the operation, and return EBUSY if it has
* multiple users.
*
* We update inode->i_nlink and free the inode prior to the operation
* to avoid possible races if the server reuses the inode.
*
* FIXME! We don't do it anymore (2.1.131) - it interacts badly with
* new rmdir(). -- AV
*/
static
int
nfs_rmdir
(
struct
inode
*
dir
,
struct
dentry
*
dentry
)
static
int
nfs_rmdir
(
struct
inode
*
dir
,
struct
dentry
*
dentry
)
{
{
int
error
;
int
error
;
...
@@ -735,10 +724,6 @@ static int nfs_rmdir(struct inode *dir, struct dentry *dentry)
...
@@ -735,10 +724,6 @@ static int nfs_rmdir(struct inode *dir, struct dentry *dentry)
if
(
dentry
->
d_name
.
len
>
NFS_MAXNAMLEN
)
if
(
dentry
->
d_name
.
len
>
NFS_MAXNAMLEN
)
goto
out
;
goto
out
;
error
=
-
EBUSY
;
if
(
!
list_empty
(
&
dentry
->
d_hash
))
goto
out
;
#ifdef NFS_PARANOIA
#ifdef NFS_PARANOIA
if
(
dentry
->
d_inode
->
i_count
>
1
)
if
(
dentry
->
d_inode
->
i_count
>
1
)
printk
(
"nfs_rmdir: %s/%s inode busy?? i_count=%d, i_nlink=%d
\n
"
,
printk
(
"nfs_rmdir: %s/%s inode busy?? i_count=%d, i_nlink=%d
\n
"
,
...
@@ -746,14 +731,17 @@ dentry->d_parent->d_name.name, dentry->d_name.name,
...
@@ -746,14 +731,17 @@ dentry->d_parent->d_name.name, dentry->d_name.name,
dentry
->
d_inode
->
i_count
,
dentry
->
d_inode
->
i_nlink
);
dentry
->
d_inode
->
i_count
,
dentry
->
d_inode
->
i_nlink
);
#endif
#endif
/*
* Update i_nlink and free the inode before unlinking.
*/
if
(
dentry
->
d_inode
->
i_nlink
)
dentry
->
d_inode
->
i_nlink
--
;
nfs_invalidate_dircache
(
dir
);
nfs_invalidate_dircache
(
dir
);
error
=
nfs_proc_rmdir
(
NFS_SERVER
(
dir
),
NFS_FH
(
dentry
->
d_parent
),
error
=
nfs_proc_rmdir
(
NFS_SERVER
(
dir
),
NFS_FH
(
dentry
->
d_parent
),
dentry
->
d_name
.
name
);
dentry
->
d_name
.
name
);
/* Update i_nlink and invalidate dentry. */
if
(
!
error
)
{
d_drop
(
dentry
);
if
(
dentry
->
d_inode
->
i_nlink
)
dentry
->
d_inode
->
i_nlink
--
;
}
out:
out:
return
error
;
return
error
;
}
}
...
...
fs/nfs/nfs2xdr.c
View file @
f3d40e81
...
@@ -612,6 +612,7 @@ static struct {
...
@@ -612,6 +612,7 @@ static struct {
{
NFSERR_FBIG
,
EFBIG
},
{
NFSERR_FBIG
,
EFBIG
},
{
NFSERR_NOSPC
,
ENOSPC
},
{
NFSERR_NOSPC
,
ENOSPC
},
{
NFSERR_ROFS
,
EROFS
},
{
NFSERR_ROFS
,
EROFS
},
{
NFSERR_OPNOTSUPP
,
EOPNOTSUPP
},
{
NFSERR_NAMETOOLONG
,
ENAMETOOLONG
},
{
NFSERR_NAMETOOLONG
,
ENAMETOOLONG
},
{
NFSERR_NOTEMPTY
,
ENOTEMPTY
},
{
NFSERR_NOTEMPTY
,
ENOTEMPTY
},
{
NFSERR_DQUOT
,
EDQUOT
},
{
NFSERR_DQUOT
,
EDQUOT
},
...
...
include/linux/mm.h
View file @
f3d40e81
...
@@ -177,10 +177,12 @@ typedef struct page {
...
@@ -177,10 +177,12 @@ typedef struct page {
(test_and_clear_bit(PG_swap_cache, &(page)->flags))
(test_and_clear_bit(PG_swap_cache, &(page)->flags))
/*
/*
* page->reserved denotes a page which must never be accessed (which
* Various page->flags bits:
*
* PG_reserved is set for a page which must never be accessed (which
* may not even be present).
* may not even be present).
*
*
*
page->dma
is set for those pages which lie in the range of
*
PG_DMA
is set for those pages which lie in the range of
* physical addresses capable of carrying DMA transfers.
* physical addresses capable of carrying DMA transfers.
*
*
* Multiple processes may "see" the same page. E.g. for untouched
* Multiple processes may "see" the same page. E.g. for untouched
...
@@ -204,8 +206,8 @@ typedef struct page {
...
@@ -204,8 +206,8 @@ typedef struct page {
* The following discussion applies only to them.
* The following discussion applies only to them.
*
*
* A page may belong to an inode's memory mapping. In this case,
* A page may belong to an inode's memory mapping. In this case,
* page->inode is the
inode, and page->offset is the file offset
* page->inode is the
pointer to the inode, and page->offset is the
* of the page (not necessarily a multiple of PAGE_SIZE).
*
file offset
of the page (not necessarily a multiple of PAGE_SIZE).
*
*
* A page may have buffers allocated to it. In this case,
* A page may have buffers allocated to it. In this case,
* page->buffers is a circular list of these buffer heads. Else,
* page->buffers is a circular list of these buffer heads. Else,
...
@@ -219,7 +221,7 @@ typedef struct page {
...
@@ -219,7 +221,7 @@ typedef struct page {
* fields are also used for freelist management when page->count==0.)
* fields are also used for freelist management when page->count==0.)
* There is also a hash table mapping (inode,offset) to the page
* There is also a hash table mapping (inode,offset) to the page
* in memory if present. The lists for this hash table use the fields
* in memory if present. The lists for this hash table use the fields
* page->next_hash and page->prev_hash.
* page->next_hash and page->p
p
rev_hash.
*
*
* All process pages can do I/O:
* All process pages can do I/O:
* - inode pages may need to be read from disk,
* - inode pages may need to be read from disk,
...
@@ -227,18 +229,23 @@ typedef struct page {
...
@@ -227,18 +229,23 @@ typedef struct page {
* to be written to disk,
* to be written to disk,
* - private pages which have been modified may need to be swapped out
* - private pages which have been modified may need to be swapped out
* to swap space and (later) to be read back into memory.
* to swap space and (later) to be read back into memory.
* During disk I/O,
page->locked is true
. This bit is set before I/O
* During disk I/O,
PG_locked is used
. This bit is set before I/O
* and reset when I/O completes. page->wait is a wait queue of all
* and reset when I/O completes. page->wait is a wait queue of all
* tasks waiting for the I/O on this page to complete.
* tasks waiting for the I/O on this page to complete.
*
page->
uptodate tells whether the page's contents is valid.
*
PG_
uptodate tells whether the page's contents is valid.
* When a read completes, the page becomes uptodate, unless a disk I/O
* When a read completes, the page becomes uptodate, unless a disk I/O
* error happened.
* error happened.
* When a write completes, and
page->free_after is true
, the page is
* When a write completes, and
PG_free_after is set
, the page is
* freed without any further delay.
* freed without any further delay.
*
*
* For choosing which pages to swap out, inode pages carry a
* For choosing which pages to swap out, inode pages carry a
*
page->
referenced bit, which is set any time the system accesses
*
PG_
referenced bit, which is set any time the system accesses
* that page through the (inode,offset) hash table.
* that page through the (inode,offset) hash table.
*
* PG_skip is used on sparc/sparc64 architectures to "skip" certain
* parts of the address space.
*
* PG_error is set to indicate that an I/O error occurred on this page.
*/
*/
extern
mem_map_t
*
mem_map
;
extern
mem_map_t
*
mem_map
;
...
@@ -340,11 +347,6 @@ extern void put_cached_page(unsigned long);
...
@@ -340,11 +347,6 @@ extern void put_cached_page(unsigned long);
#define GFP_DMA __GFP_DMA
#define GFP_DMA __GFP_DMA
/*
* Decide if we should try to do some swapout..
*/
extern
int
free_memory_available
(
void
);
/* vma is the first one with address < vma->vm_end,
/* vma is the first one with address < vma->vm_end,
* and even address < vma->vm_start. Have to extend vma. */
* and even address < vma->vm_start. Have to extend vma. */
static
inline
int
expand_stack
(
struct
vm_area_struct
*
vma
,
unsigned
long
address
)
static
inline
int
expand_stack
(
struct
vm_area_struct
*
vma
,
unsigned
long
address
)
...
...
include/linux/nfs.h
View file @
f3d40e81
...
@@ -41,6 +41,7 @@ enum nfs_stat {
...
@@ -41,6 +41,7 @@ enum nfs_stat {
NFSERR_FBIG
=
27
,
NFSERR_FBIG
=
27
,
NFSERR_NOSPC
=
28
,
NFSERR_NOSPC
=
28
,
NFSERR_ROFS
=
30
,
NFSERR_ROFS
=
30
,
NFSERR_OPNOTSUPP
=
45
,
NFSERR_NAMETOOLONG
=
63
,
NFSERR_NAMETOOLONG
=
63
,
NFSERR_NOTEMPTY
=
66
,
NFSERR_NOTEMPTY
=
66
,
NFSERR_DQUOT
=
69
,
NFSERR_DQUOT
=
69
,
...
...
include/linux/sched.h
View file @
f3d40e81
...
@@ -672,6 +672,58 @@ extern inline void remove_wait_queue(struct wait_queue ** p, struct wait_queue *
...
@@ -672,6 +672,58 @@ extern inline void remove_wait_queue(struct wait_queue ** p, struct wait_queue *
write_unlock_irqrestore
(
&
waitqueue_lock
,
flags
);
write_unlock_irqrestore
(
&
waitqueue_lock
,
flags
);
}
}
#define __wait_event(wq, condition) \
do { \
struct wait_queue __wait; \
\
__wait.task = current; \
add_wait_queue(&wq, &__wait); \
for (;;) { \
current->state = TASK_UNINTERRUPTIBLE; \
if (condition) \
break; \
schedule(); \
} \
current->state = TASK_RUNNING; \
remove_wait_queue(&wq, &__wait); \
} while (0)
#define wait_event(wq, condition) \
do { \
if (condition) \
break; \
__wait_event(wq, condition); \
} while (0)
#define __wait_event_interruptible(wq, condition, ret) \
do { \
struct wait_queue __wait; \
\
__wait.task = current; \
add_wait_queue(&wq, &__wait); \
for (;;) { \
current->state = TASK_INTERRUPTIBLE; \
if (condition) \
break; \
if (!signal_pending(current)) { \
schedule(); \
continue; \
} \
ret = -ERESTARTSYS; \
break; \
} \
current->state = TASK_RUNNING; \
remove_wait_queue(&wq, &__wait); \
} while (0)
#define wait_event_interruptible(wq, condition) \
({ \
int __ret = 0; \
if (!(condition)) \
__wait_event_interruptible(wq, condition, __ret); \
__ret; \
})
#define REMOVE_LINKS(p) do { \
#define REMOVE_LINKS(p) do { \
(p)->next_task->prev_task = (p)->prev_task; \
(p)->next_task->prev_task = (p)->prev_task; \
(p)->prev_task->next_task = (p)->next_task; \
(p)->prev_task->next_task = (p)->next_task; \
...
...
kernel/printk.c
View file @
f3d40e81
...
@@ -137,15 +137,9 @@ int do_syslog(int type, char * buf, int len)
...
@@ -137,15 +137,9 @@ int do_syslog(int type, char * buf, int len)
error
=
verify_area
(
VERIFY_WRITE
,
buf
,
len
);
error
=
verify_area
(
VERIFY_WRITE
,
buf
,
len
);
if
(
error
)
if
(
error
)
goto
out
;
goto
out
;
cli
();
error
=
wait_event_interruptible
(
log_wait
,
log_size
);
error
=
-
ERESTARTSYS
;
if
(
error
)
while
(
!
log_size
)
{
goto
out
;
if
(
signal_pending
(
current
))
{
sti
();
goto
out
;
}
interruptible_sleep_on
(
&
log_wait
);
}
i
=
0
;
i
=
0
;
while
(
log_size
&&
i
<
len
)
{
while
(
log_size
&&
i
<
len
)
{
c
=
*
((
char
*
)
log_buf
+
log_start
);
c
=
*
((
char
*
)
log_buf
+
log_start
);
...
...
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