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
3ef3aca5
Commit
3ef3aca5
authored
Oct 11, 2002
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://bk.arm.linux.org.uk
into home.transmeta.com:/home/torvalds/v2.5/linux
parents
7c05bbf9
f55b6cfb
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
249 additions
and
166 deletions
+249
-166
arch/i386/kernel/timers/timer_pit.c
arch/i386/kernel/timers/timer_pit.c
+1
-0
fs/nfs/dir.c
fs/nfs/dir.c
+0
-1
fs/nfs/nfs3proc.c
fs/nfs/nfs3proc.c
+115
-3
fs/nfs/proc.c
fs/nfs/proc.c
+59
-2
fs/nfs/unlink.c
fs/nfs/unlink.c
+2
-3
fs/nfs/write.c
fs/nfs/write.c
+39
-135
include/linux/nfs_fs.h
include/linux/nfs_fs.h
+8
-21
include/linux/nfs_xdr.h
include/linux/nfs_xdr.h
+23
-1
net/sunrpc/xprt.c
net/sunrpc/xprt.c
+2
-0
No files found.
arch/i386/kernel/timers/timer_pit.c
View file @
3ef3aca5
...
...
@@ -6,6 +6,7 @@
#include <linux/spinlock.h>
#include <linux/module.h>
#include <linux/device.h>
#include <asm/mpspec.h>
#include <asm/timer.h>
#include <asm/io.h>
...
...
fs/nfs/dir.c
View file @
3ef3aca5
...
...
@@ -130,7 +130,6 @@ int nfs_readdir_filler(nfs_readdir_descriptor_t *desc, struct page *page)
return
0
;
error:
SetPageError
(
page
);
kunmap
(
page
);
unlock_page
(
page
);
invalidate_inode_pages
(
inode
->
i_mapping
);
desc
->
error
=
error
;
...
...
fs/nfs/nfs3proc.c
View file @
3ef3aca5
...
...
@@ -54,6 +54,17 @@ nfs3_rpc_call_wrapper(struct rpc_clnt *clnt, u32 proc, void *argp, void *resp, i
#define rpc_call_sync(clnt, msg, flags) \
nfs3_rpc_wrapper(clnt, msg, flags)
static
int
nfs3_async_handle_jukebox
(
struct
rpc_task
*
task
)
{
if
(
task
->
tk_status
!=
-
EJUKEBOX
)
return
0
;
task
->
tk_status
=
0
;
rpc_restart_call
(
task
);
rpc_delay
(
task
,
NFS_JUKEBOX_RETRY_TIME
);
return
1
;
}
/*
* Bare-bones access to getattr: this is for nfs_read_super.
*/
...
...
@@ -392,16 +403,20 @@ nfs3_proc_unlink_setup(struct rpc_message *msg, struct dentry *dir, struct qstr
return
0
;
}
static
void
nfs3_proc_unlink_done
(
struct
dentry
*
dir
,
struct
rpc_
message
*
msg
)
static
int
nfs3_proc_unlink_done
(
struct
dentry
*
dir
,
struct
rpc_
task
*
task
)
{
struct
rpc_message
*
msg
=
&
task
->
tk_msg
;
struct
nfs_fattr
*
dir_attr
;
if
(
nfs3_async_handle_jukebox
(
task
))
return
1
;
if
(
msg
->
rpc_argp
)
{
dir_attr
=
(
struct
nfs_fattr
*
)
msg
->
rpc_resp
;
nfs_refresh_inode
(
dir
->
d_inode
,
dir_attr
);
kfree
(
msg
->
rpc_argp
);
}
return
0
;
}
static
int
...
...
@@ -652,7 +667,7 @@ nfs3_read_done(struct rpc_task *task)
{
struct
nfs_read_data
*
data
=
(
struct
nfs_read_data
*
)
task
->
tk_calldata
;
if
(
nfs_async_handle_jukebox
(
task
))
if
(
nfs
3
_async_handle_jukebox
(
task
))
return
;
nfs_readpage_result
(
task
,
data
->
u
.
v3
.
res
.
count
,
data
->
u
.
v3
.
res
.
eof
);
}
...
...
@@ -692,6 +707,101 @@ nfs3_proc_read_setup(struct nfs_read_data *data, unsigned int count)
rpc_call_setup
(
&
data
->
task
,
&
msg
,
0
);
}
static
void
nfs3_write_done
(
struct
rpc_task
*
task
)
{
struct
nfs_write_data
*
data
=
(
struct
nfs_write_data
*
)
task
->
tk_calldata
;
if
(
nfs3_async_handle_jukebox
(
task
))
return
;
nfs_writeback_done
(
task
,
data
->
u
.
v3
.
args
.
stable
,
data
->
u
.
v3
.
args
.
count
,
data
->
u
.
v3
.
res
.
count
);
}
static
void
nfs3_proc_write_setup
(
struct
nfs_write_data
*
data
,
unsigned
int
count
,
int
how
)
{
struct
rpc_task
*
task
=
&
data
->
task
;
struct
inode
*
inode
=
data
->
inode
;
struct
nfs_page
*
req
;
int
stable
;
int
flags
;
struct
rpc_message
msg
;
if
(
how
&
FLUSH_STABLE
)
{
if
(
!
NFS_I
(
inode
)
->
ncommit
)
stable
=
NFS_FILE_SYNC
;
else
stable
=
NFS_DATA_SYNC
;
}
else
stable
=
NFS_UNSTABLE
;
req
=
nfs_list_entry
(
data
->
pages
.
next
);
data
->
u
.
v3
.
args
.
fh
=
NFS_FH
(
inode
);
data
->
u
.
v3
.
args
.
offset
=
req_offset
(
req
)
+
req
->
wb_offset
;
data
->
u
.
v3
.
args
.
pgbase
=
req
->
wb_offset
;
data
->
u
.
v3
.
args
.
count
=
count
;
data
->
u
.
v3
.
args
.
stable
=
stable
;
data
->
u
.
v3
.
args
.
pages
=
data
->
pagevec
;
data
->
u
.
v3
.
res
.
fattr
=
&
data
->
fattr
;
data
->
u
.
v3
.
res
.
count
=
count
;
data
->
u
.
v3
.
res
.
verf
=
&
data
->
verf
;
/* Set the initial flags for the task. */
flags
=
(
how
&
FLUSH_SYNC
)
?
0
:
RPC_TASK_ASYNC
;
/* Finalize the task. */
rpc_init_task
(
task
,
NFS_CLIENT
(
inode
),
nfs3_write_done
,
flags
);
task
->
tk_calldata
=
data
;
/* Release requests */
task
->
tk_release
=
nfs_writedata_release
;
msg
.
rpc_proc
=
NFS3PROC_WRITE
;
msg
.
rpc_argp
=
&
data
->
u
.
v3
.
args
;
msg
.
rpc_resp
=
&
data
->
u
.
v3
.
res
;
msg
.
rpc_cred
=
data
->
cred
;
rpc_call_setup
(
&
data
->
task
,
&
msg
,
0
);
}
static
void
nfs3_commit_done
(
struct
rpc_task
*
task
)
{
if
(
nfs3_async_handle_jukebox
(
task
))
return
;
nfs_commit_done
(
task
);
}
static
void
nfs3_proc_commit_setup
(
struct
nfs_write_data
*
data
,
u64
start
,
u32
len
,
int
how
)
{
struct
rpc_task
*
task
=
&
data
->
task
;
struct
inode
*
inode
=
data
->
inode
;
int
flags
;
struct
rpc_message
msg
;
data
->
u
.
v3
.
args
.
fh
=
NFS_FH
(
data
->
inode
);
data
->
u
.
v3
.
args
.
offset
=
start
;
data
->
u
.
v3
.
args
.
count
=
len
;
data
->
u
.
v3
.
res
.
count
=
len
;
data
->
u
.
v3
.
res
.
fattr
=
&
data
->
fattr
;
data
->
u
.
v3
.
res
.
verf
=
&
data
->
verf
;
/* Set the initial flags for the task. */
flags
=
(
how
&
FLUSH_SYNC
)
?
0
:
RPC_TASK_ASYNC
;
/* Finalize the task. */
rpc_init_task
(
task
,
NFS_CLIENT
(
inode
),
nfs3_commit_done
,
flags
);
task
->
tk_calldata
=
data
;
/* Release requests */
task
->
tk_release
=
nfs_writedata_release
;
msg
.
rpc_proc
=
NFS3PROC_COMMIT
;
msg
.
rpc_argp
=
&
data
->
u
.
v3
.
args
;
msg
.
rpc_resp
=
&
data
->
u
.
v3
.
res
;
msg
.
rpc_cred
=
data
->
cred
;
rpc_call_setup
(
&
data
->
task
,
&
msg
,
0
);
}
struct
nfs_rpc_ops
nfs_v3_clientops
=
{
.
version
=
3
,
/* protocol version */
.
getroot
=
nfs3_proc_get_root
,
...
...
@@ -716,4 +826,6 @@ struct nfs_rpc_ops nfs_v3_clientops = {
.
statfs
=
nfs3_proc_statfs
,
.
decode_dirent
=
nfs3_decode_dirent
,
.
read_setup
=
nfs3_proc_read_setup
,
.
write_setup
=
nfs3_proc_write_setup
,
.
commit_setup
=
nfs3_proc_commit_setup
,
};
fs/nfs/proc.c
View file @
3ef3aca5
...
...
@@ -312,13 +312,16 @@ nfs_proc_unlink_setup(struct rpc_message *msg, struct dentry *dir, struct qstr *
return
0
;
}
static
void
nfs_proc_unlink_done
(
struct
dentry
*
dir
,
struct
rpc_
message
*
msg
)
static
int
nfs_proc_unlink_done
(
struct
dentry
*
dir
,
struct
rpc_
task
*
task
)
{
struct
rpc_message
*
msg
=
&
task
->
tk_msg
;
if
(
msg
->
rpc_argp
)
{
NFS_CACHEINV
(
dir
->
d_inode
);
kfree
(
msg
->
rpc_argp
);
}
return
0
;
}
static
int
...
...
@@ -512,6 +515,58 @@ nfs_proc_read_setup(struct nfs_read_data *data, unsigned int count)
rpc_call_setup
(
&
data
->
task
,
&
msg
,
0
);
}
static
void
nfs_write_done
(
struct
rpc_task
*
task
)
{
struct
nfs_write_data
*
data
=
(
struct
nfs_write_data
*
)
task
->
tk_calldata
;
nfs_writeback_done
(
task
,
data
->
u
.
v3
.
args
.
stable
,
data
->
u
.
v3
.
args
.
count
,
data
->
u
.
v3
.
res
.
count
);
}
static
void
nfs_proc_write_setup
(
struct
nfs_write_data
*
data
,
unsigned
int
count
,
int
how
)
{
struct
rpc_task
*
task
=
&
data
->
task
;
struct
inode
*
inode
=
data
->
inode
;
struct
nfs_page
*
req
;
int
flags
;
struct
rpc_message
msg
;
/* Note: NFSv2 ignores @stable and always uses NFS_FILE_SYNC */
req
=
nfs_list_entry
(
data
->
pages
.
next
);
data
->
u
.
v3
.
args
.
fh
=
NFS_FH
(
inode
);
data
->
u
.
v3
.
args
.
offset
=
req_offset
(
req
)
+
req
->
wb_offset
;
data
->
u
.
v3
.
args
.
pgbase
=
req
->
wb_offset
;
data
->
u
.
v3
.
args
.
count
=
count
;
data
->
u
.
v3
.
args
.
stable
=
NFS_FILE_SYNC
;
data
->
u
.
v3
.
args
.
pages
=
data
->
pagevec
;
data
->
u
.
v3
.
res
.
fattr
=
&
data
->
fattr
;
data
->
u
.
v3
.
res
.
count
=
count
;
data
->
u
.
v3
.
res
.
verf
=
&
data
->
verf
;
/* Set the initial flags for the task. */
flags
=
(
how
&
FLUSH_SYNC
)
?
0
:
RPC_TASK_ASYNC
;
/* Finalize the task. */
rpc_init_task
(
task
,
NFS_CLIENT
(
inode
),
nfs_write_done
,
flags
);
task
->
tk_calldata
=
data
;
/* Release requests */
task
->
tk_release
=
nfs_writedata_release
;
msg
.
rpc_proc
=
NFSPROC_WRITE
;
msg
.
rpc_argp
=
&
data
->
u
.
v3
.
args
;
msg
.
rpc_resp
=
&
data
->
u
.
v3
.
res
;
msg
.
rpc_cred
=
data
->
cred
;
rpc_call_setup
(
&
data
->
task
,
&
msg
,
0
);
}
static
void
nfs_proc_commit_setup
(
struct
nfs_write_data
*
data
,
u64
start
,
u32
len
,
int
how
)
{
BUG
();
}
struct
nfs_rpc_ops
nfs_v2_clientops
=
{
.
version
=
2
,
/* protocol version */
.
getroot
=
nfs_proc_get_root
,
...
...
@@ -537,4 +592,6 @@ struct nfs_rpc_ops nfs_v2_clientops = {
.
statfs
=
nfs_proc_statfs
,
.
decode_dirent
=
nfs_decode_dirent
,
.
read_setup
=
nfs_proc_read_setup
,
.
write_setup
=
nfs_proc_write_setup
,
.
commit_setup
=
nfs_proc_commit_setup
,
};
fs/nfs/unlink.c
View file @
3ef3aca5
...
...
@@ -123,13 +123,12 @@ nfs_async_unlink_done(struct rpc_task *task)
struct
dentry
*
dir
=
data
->
dir
;
struct
inode
*
dir_i
;
if
(
nfs_async_handle_jukebox
(
task
))
return
;
if
(
!
dir
)
return
;
dir_i
=
dir
->
d_inode
;
nfs_zap_caches
(
dir_i
);
NFS_PROTO
(
dir_i
)
->
unlink_done
(
dir
,
&
task
->
tk_msg
);
if
(
NFS_PROTO
(
dir_i
)
->
unlink_done
(
dir
,
task
))
return
;
put_rpccred
(
data
->
cred
);
data
->
cred
=
NULL
;
dput
(
dir
);
...
...
fs/nfs/write.c
View file @
3ef3aca5
...
...
@@ -63,23 +63,6 @@
#define NFSDBG_FACILITY NFSDBG_PAGECACHE
/*
* Local structures
*
* This is the struct where the WRITE/COMMIT arguments go.
*/
struct
nfs_write_data
{
struct
rpc_task
task
;
struct
inode
*
inode
;
struct
rpc_cred
*
cred
;
struct
nfs_writeargs
args
;
/* argument struct */
struct
nfs_writeres
res
;
/* result struct */
struct
nfs_fattr
fattr
;
struct
nfs_writeverf
verf
;
struct
list_head
pages
;
/* Coalesced requests we wish to flush */
struct
page
*
pagevec
[
NFS_WRITE_MAXIOV
];
};
/*
* Local function declarations
*/
...
...
@@ -87,15 +70,6 @@ static struct nfs_page * nfs_update_request(struct file*, struct inode *,
struct
page
*
,
unsigned
int
,
unsigned
int
);
static
void
nfs_strategy
(
struct
inode
*
inode
);
static
void
nfs_writeback_done
(
struct
rpc_task
*
);
#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
static
void
nfs_commit_done
(
struct
rpc_task
*
);
#endif
/* Hack for future NFS swap support */
#ifndef IS_SWAPFILE
# define IS_SWAPFILE(inode) (0)
#endif
static
kmem_cache_t
*
nfs_wdata_cachep
;
...
...
@@ -106,7 +80,6 @@ static __inline__ struct nfs_write_data *nfs_writedata_alloc(void)
if
(
p
)
{
memset
(
p
,
0
,
sizeof
(
*
p
));
INIT_LIST_HEAD
(
&
p
->
pages
);
p
->
args
.
pages
=
p
->
pagevec
;
}
return
p
;
}
...
...
@@ -116,7 +89,7 @@ static __inline__ void nfs_writedata_free(struct nfs_write_data *p)
kmem_cache_free
(
nfs_wdata_cachep
,
p
);
}
static
void
nfs_writedata_release
(
struct
rpc_task
*
task
)
void
nfs_writedata_release
(
struct
rpc_task
*
task
)
{
struct
nfs_write_data
*
wdata
=
(
struct
nfs_write_data
*
)
task
->
tk_calldata
;
nfs_writedata_free
(
wdata
);
...
...
@@ -860,8 +833,10 @@ nfs_updatepage(struct file *file, struct page *page, unsigned int offset, unsign
* Set up the argument/result storage required for the RPC call.
*/
static
void
nfs_write_rpcsetup
(
struct
list_head
*
head
,
struct
nfs_write_data
*
data
)
nfs_write_rpcsetup
(
struct
list_head
*
head
,
struct
nfs_write_data
*
data
,
int
how
)
{
struct
rpc_task
*
task
=
&
data
->
task
;
struct
inode
*
inode
;
struct
nfs_page
*
req
;
struct
page
**
pages
;
unsigned
int
count
;
...
...
@@ -869,27 +844,28 @@ nfs_write_rpcsetup(struct list_head *head, struct nfs_write_data *data)
/* Set up the RPC argument and reply structs
* NB: take care not to mess about with data->commit et al. */
pages
=
data
->
args
.
pages
;
pages
=
data
->
pagevec
;
count
=
0
;
while
(
!
list_empty
(
head
))
{
struct
nfs_page
*
req
=
nfs_list_entry
(
head
->
next
);
req
=
nfs_list_entry
(
head
->
next
);
nfs_list_remove_request
(
req
);
nfs_list_add_request
(
req
,
&
data
->
pages
);
*
pages
++
=
req
->
wb_page
;
count
+=
req
->
wb_bytes
;
}
req
=
nfs_list_entry
(
data
->
pages
.
next
);
data
->
inode
=
req
->
wb_inode
;
data
->
inode
=
inode
=
req
->
wb_inode
;
data
->
cred
=
req
->
wb_cred
;
data
->
args
.
fh
=
NFS_FH
(
req
->
wb_inode
);
data
->
args
.
offset
=
req_offset
(
req
)
+
req
->
wb_offset
;
data
->
args
.
pgbase
=
req
->
wb_offset
;
data
->
args
.
count
=
count
;
data
->
res
.
fattr
=
&
data
->
fattr
;
data
->
res
.
count
=
count
;
data
->
res
.
verf
=
&
data
->
verf
;
}
NFS_PROTO
(
inode
)
->
write_setup
(
data
,
count
,
how
);
dprintk
(
"NFS: %4d initiated write call (req %s/%Ld, %u bytes @ offset %Lu)
\n
"
,
task
->
tk_pid
,
inode
->
i_sb
->
s_id
,
(
long
long
)
NFS_FILEID
(
inode
),
count
,
(
unsigned
long
long
)
req_offset
(
req
)
+
req
->
wb_offset
);
}
/*
* Create an RPC task for the given write request and kick it.
...
...
@@ -902,64 +878,20 @@ nfs_write_rpcsetup(struct list_head *head, struct nfs_write_data *data)
static
int
nfs_flush_one
(
struct
list_head
*
head
,
struct
inode
*
inode
,
int
how
)
{
struct
nfs_inode
*
nfsi
=
NFS_I
(
inode
);
struct
rpc_clnt
*
clnt
=
NFS_CLIENT
(
inode
);
struct
nfs_write_data
*
data
;
struct
rpc_task
*
task
;
struct
rpc_message
msg
;
int
flags
,
nfsvers
=
NFS_PROTO
(
inode
)
->
version
,
async
=
!
(
how
&
FLUSH_SYNC
),
stable
=
(
how
&
FLUSH_STABLE
);
sigset_t
oldset
;
data
=
nfs_writedata_alloc
();
if
(
!
data
)
goto
out_bad
;
task
=
&
data
->
task
;
/* Set the initial flags for the task. */
flags
=
(
async
)
?
RPC_TASK_ASYNC
:
0
;
/* Set up the argument struct */
nfs_write_rpcsetup
(
head
,
data
);
if
(
nfsvers
<
3
)
data
->
args
.
stable
=
NFS_FILE_SYNC
;
else
if
(
stable
)
{
if
(
!
nfsi
->
ncommit
)
data
->
args
.
stable
=
NFS_FILE_SYNC
;
else
data
->
args
.
stable
=
NFS_DATA_SYNC
;
}
else
data
->
args
.
stable
=
NFS_UNSTABLE
;
/* Finalize the task. */
rpc_init_task
(
task
,
clnt
,
nfs_writeback_done
,
flags
);
task
->
tk_calldata
=
data
;
/* Release requests */
task
->
tk_release
=
nfs_writedata_release
;
#ifdef CONFIG_NFS_V3
msg
.
rpc_proc
=
(
nfsvers
==
3
)
?
NFS3PROC_WRITE
:
NFSPROC_WRITE
;
#else
msg
.
rpc_proc
=
NFSPROC_WRITE
;
#endif
msg
.
rpc_argp
=
&
data
->
args
;
msg
.
rpc_resp
=
&
data
->
res
;
msg
.
rpc_cred
=
data
->
cred
;
dprintk
(
"NFS: %4d initiated write call (req %s/%Ld, %u bytes @ offset %Lu)
\n
"
,
task
->
tk_pid
,
inode
->
i_sb
->
s_id
,
(
long
long
)
NFS_FILEID
(
inode
),
(
unsigned
int
)
data
->
args
.
count
,
(
unsigned
long
long
)
data
->
args
.
offset
);
nfs_write_rpcsetup
(
head
,
data
,
how
);
rpc_clnt_sigmask
(
clnt
,
&
oldset
);
rpc_call_setup
(
task
,
&
msg
,
0
);
lock_kernel
();
rpc_execute
(
task
);
rpc_execute
(
&
data
->
task
);
unlock_kernel
();
rpc_clnt_sigunmask
(
clnt
,
&
oldset
);
return
0
;
...
...
@@ -1004,12 +936,11 @@ nfs_flush_list(struct list_head *head, int wpages, int how)
/*
* This function is called when the WRITE call is complete.
*/
static
void
nfs_writeback_done
(
struct
rpc_task
*
task
)
void
nfs_writeback_done
(
struct
rpc_task
*
task
,
int
stable
,
unsigned
int
arg_count
,
unsigned
int
res_count
)
{
struct
nfs_write_data
*
data
=
(
struct
nfs_write_data
*
)
task
->
tk_calldata
;
struct
nfs_writeargs
*
argp
=
&
data
->
args
;
struct
nfs_writeres
*
resp
=
&
data
->
res
;
struct
inode
*
inode
=
data
->
inode
;
struct
nfs_page
*
req
;
struct
page
*
page
;
...
...
@@ -1017,11 +948,8 @@ nfs_writeback_done(struct rpc_task *task)
dprintk
(
"NFS: %4d nfs_writeback_done (status %d)
\n
"
,
task
->
tk_pid
,
task
->
tk_status
);
if
(
nfs_async_handle_jukebox
(
task
))
return
;
/* We can't handle that yet but we check for it nevertheless */
if
(
res
p
->
count
<
argp
->
count
&&
task
->
tk_status
>=
0
)
{
if
(
res
_count
<
arg_
count
&&
task
->
tk_status
>=
0
)
{
static
unsigned
long
complain
;
if
(
time_before
(
complain
,
jiffies
))
{
printk
(
KERN_WARNING
...
...
@@ -1033,7 +961,7 @@ nfs_writeback_done(struct rpc_task *task)
task
->
tk_status
=
-
EIO
;
}
#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
if
(
resp
->
verf
->
committed
<
argp
->
stable
&&
task
->
tk_status
>=
0
)
{
if
(
data
->
verf
.
committed
<
stable
&&
task
->
tk_status
>=
0
)
{
/* We tried a write call, but the server did not
* commit data to stable storage even though we
* requested it.
...
...
@@ -1045,10 +973,10 @@ nfs_writeback_done(struct rpc_task *task)
static
unsigned
long
complain
;
if
(
time_before
(
complain
,
jiffies
))
{
dprintk
(
"NFS: faulty NFS
v3
server %s:"
dprintk
(
"NFS: faulty NFS server %s:"
" (committed = %d) != (stable = %d)
\n
"
,
NFS_SERVER
(
inode
)
->
hostname
,
resp
->
verf
->
committed
,
argp
->
stable
);
data
->
verf
.
committed
,
stable
);
complain
=
jiffies
+
300
*
HZ
;
}
}
...
...
@@ -1060,7 +988,7 @@ nfs_writeback_done(struct rpc_task *task)
* writebacks since the page->count is kept > 1 for as long
* as the page has a write request pending.
*/
nfs_write_attributes
(
inode
,
resp
->
fattr
);
nfs_write_attributes
(
inode
,
&
data
->
fattr
);
while
(
!
list_empty
(
&
data
->
pages
))
{
req
=
nfs_list_entry
(
data
->
pages
.
next
);
nfs_list_remove_request
(
req
);
...
...
@@ -1083,12 +1011,12 @@ nfs_writeback_done(struct rpc_task *task)
}
#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
if
(
argp
->
stable
!=
NFS_UNSTABLE
||
resp
->
verf
->
committed
==
NFS_FILE_SYNC
)
{
if
(
stable
!=
NFS_UNSTABLE
||
data
->
verf
.
committed
==
NFS_FILE_SYNC
)
{
nfs_inode_remove_request
(
req
);
dprintk
(
" OK
\n
"
);
goto
next
;
}
memcpy
(
&
req
->
wb_verf
,
resp
->
verf
,
sizeof
(
req
->
wb_verf
));
memcpy
(
&
req
->
wb_verf
,
&
data
->
verf
,
sizeof
(
req
->
wb_verf
));
req
->
wb_timeout
=
jiffies
+
NFS_COMMIT_DELAY
;
nfs_mark_request_commit
(
req
);
dprintk
(
" marked for commit
\n
"
);
...
...
@@ -1106,8 +1034,9 @@ nfs_writeback_done(struct rpc_task *task)
* Set up the argument/result storage required for the RPC call.
*/
static
void
nfs_commit_rpcsetup
(
struct
list_head
*
head
,
struct
nfs_write_data
*
data
)
nfs_commit_rpcsetup
(
struct
list_head
*
head
,
struct
nfs_write_data
*
data
,
int
how
)
{
struct
rpc_task
*
task
=
&
data
->
task
;
struct
nfs_page
*
first
,
*
last
;
struct
inode
*
inode
;
loff_t
start
,
end
,
len
;
...
...
@@ -1133,11 +1062,10 @@ nfs_commit_rpcsetup(struct list_head *head, struct nfs_write_data *data)
data
->
inode
=
inode
;
data
->
cred
=
first
->
wb_cred
;
data
->
args
.
fh
=
NFS_FH
(
inode
);
data
->
args
.
offset
=
start
;
data
->
res
.
count
=
data
->
args
.
count
=
(
u32
)
len
;
data
->
res
.
fattr
=
&
data
->
fattr
;
data
->
res
.
verf
=
&
data
->
verf
;
NFS_PROTO
(
inode
)
->
commit_setup
(
data
,
start
,
len
,
how
);
dprintk
(
"NFS: %4d initiated commit call
\n
"
,
task
->
tk_pid
);
}
/*
...
...
@@ -1146,43 +1074,23 @@ nfs_commit_rpcsetup(struct list_head *head, struct nfs_write_data *data)
int
nfs_commit_list
(
struct
list_head
*
head
,
int
how
)
{
struct
rpc_message
msg
;
struct
rpc_clnt
*
clnt
;
struct
nfs_write_data
*
data
;
struct
rpc_task
*
task
;
struct
nfs_page
*
req
;
int
flags
,
async
=
!
(
how
&
FLUSH_SYNC
);
sigset_t
oldset
;
data
=
nfs_writedata_alloc
();
if
(
!
data
)
goto
out_bad
;
task
=
&
data
->
task
;
flags
=
(
async
)
?
RPC_TASK_ASYNC
:
0
;
/* Set up the argument struct */
nfs_commit_rpcsetup
(
head
,
data
);
req
=
nfs_list_entry
(
data
->
pages
.
next
);
clnt
=
NFS_CLIENT
(
req
->
wb_inode
);
rpc_init_task
(
task
,
clnt
,
nfs_commit_done
,
flags
);
task
->
tk_calldata
=
data
;
/* Release requests */
task
->
tk_release
=
nfs_writedata_release
;
nfs_commit_rpcsetup
(
head
,
data
,
how
);
clnt
=
NFS_CLIENT
(
data
->
inode
);
msg
.
rpc_proc
=
NFS3PROC_COMMIT
;
msg
.
rpc_argp
=
&
data
->
args
;
msg
.
rpc_resp
=
&
data
->
res
;
msg
.
rpc_cred
=
data
->
cred
;
dprintk
(
"NFS: %4d initiated commit call
\n
"
,
task
->
tk_pid
);
rpc_clnt_sigmask
(
clnt
,
&
oldset
);
rpc_call_setup
(
task
,
&
msg
,
0
);
lock_kernel
();
rpc_execute
(
task
);
rpc_execute
(
&
data
->
task
);
unlock_kernel
();
rpc_clnt_sigunmask
(
clnt
,
&
oldset
);
return
0
;
...
...
@@ -1199,21 +1107,17 @@ nfs_commit_list(struct list_head *head, int how)
/*
* COMMIT call returned
*/
static
void
void
nfs_commit_done
(
struct
rpc_task
*
task
)
{
struct
nfs_write_data
*
data
=
(
struct
nfs_write_data
*
)
task
->
tk_calldata
;
struct
nfs_writeres
*
resp
=
&
data
->
res
;
struct
nfs_page
*
req
;
struct
inode
*
inode
=
data
->
inode
;
dprintk
(
"NFS: %4d nfs_commit_done (status %d)
\n
"
,
task
->
tk_pid
,
task
->
tk_status
);
if
(
nfs_async_handle_jukebox
(
task
))
return
;
nfs_write_attributes
(
inode
,
resp
->
fattr
);
nfs_write_attributes
(
inode
,
&
data
->
fattr
);
while
(
!
list_empty
(
&
data
->
pages
))
{
req
=
nfs_list_entry
(
data
->
pages
.
next
);
nfs_list_remove_request
(
req
);
...
...
include/linux/nfs_fs.h
View file @
3ef3aca5
...
...
@@ -323,6 +323,14 @@ extern void nfs_complete_unlink(struct dentry *);
extern
int
nfs_writepage
(
struct
page
*
);
extern
int
nfs_flush_incompatible
(
struct
file
*
file
,
struct
page
*
page
);
extern
int
nfs_updatepage
(
struct
file
*
,
struct
page
*
,
unsigned
int
,
unsigned
int
);
extern
void
nfs_writeback_done
(
struct
rpc_task
*
task
,
int
stable
,
unsigned
int
arg_count
,
unsigned
int
res_count
);
extern
void
nfs_writedata_release
(
struct
rpc_task
*
task
);
#if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4)
extern
void
nfs_commit_done
(
struct
rpc_task
*
);
#endif
/*
* Try to write back everything synchronously (but check the
* return value!)
...
...
@@ -462,28 +470,7 @@ extern void * nfs_root_data(void);
__retval; \
})
#ifdef CONFIG_NFS_V3
#define NFS_JUKEBOX_RETRY_TIME (5 * HZ)
static
inline
int
nfs_async_handle_jukebox
(
struct
rpc_task
*
task
)
{
if
(
task
->
tk_status
!=
-
EJUKEBOX
)
return
0
;
task
->
tk_status
=
0
;
rpc_restart_call
(
task
);
rpc_delay
(
task
,
NFS_JUKEBOX_RETRY_TIME
);
return
1
;
}
#else
static
inline
int
nfs_async_handle_jukebox
(
struct
rpc_task
*
task
)
{
return
0
;
}
#endif
/* CONFIG_NFS_V3 */
#endif
/* __KERNEL__ */
...
...
include/linux/nfs_xdr.h
View file @
3ef3aca5
...
...
@@ -67,6 +67,7 @@ struct nfs_fsinfo {
__u64
afiles
;
/* # of files available to user */
__u32
linkmax
;
/* max # of hard links */
__u32
namelen
;
/* max name length */
__u32
lease_time
;
/* in seconds */
};
/*
...
...
@@ -326,6 +327,25 @@ struct nfs_read_data {
}
u
;
};
struct
nfs_write_data
{
struct
rpc_task
task
;
struct
inode
*
inode
;
struct
rpc_cred
*
cred
;
struct
nfs_fattr
fattr
;
struct
nfs_writeverf
verf
;
struct
list_head
pages
;
/* Coalesced requests we wish to flush */
struct
page
*
pagevec
[
NFS_WRITE_MAXIOV
];
union
{
struct
{
struct
nfs_writeargs
args
;
struct
nfs_writeres
res
;
}
v3
;
#ifdef CONFIG_NFS_V4
/* NFSv4 data to come here... */
#endif
}
u
;
};
/*
* RPC procedure vector for NFSv2/NFSv3 demuxing
*/
...
...
@@ -356,7 +376,7 @@ struct nfs_rpc_ops {
int
(
*
remove
)
(
struct
inode
*
,
struct
qstr
*
);
int
(
*
unlink_setup
)
(
struct
rpc_message
*
,
struct
dentry
*
,
struct
qstr
*
);
void
(
*
unlink_done
)
(
struct
dentry
*
,
struct
rpc_message
*
);
int
(
*
unlink_done
)
(
struct
dentry
*
,
struct
rpc_task
*
);
int
(
*
rename
)
(
struct
inode
*
,
struct
qstr
*
,
struct
inode
*
,
struct
qstr
*
);
int
(
*
link
)
(
struct
inode
*
,
struct
inode
*
,
struct
qstr
*
);
...
...
@@ -374,6 +394,8 @@ struct nfs_rpc_ops {
struct
nfs_fsinfo
*
);
u32
*
(
*
decode_dirent
)(
u32
*
,
struct
nfs_entry
*
,
int
plus
);
void
(
*
read_setup
)
(
struct
nfs_read_data
*
,
unsigned
int
count
);
void
(
*
write_setup
)
(
struct
nfs_write_data
*
,
unsigned
int
count
,
int
how
);
void
(
*
commit_setup
)
(
struct
nfs_write_data
*
,
u64
start
,
u32
len
,
int
how
);
};
/*
...
...
net/sunrpc/xprt.c
View file @
3ef3aca5
...
...
@@ -1446,6 +1446,8 @@ xprt_bind_socket(struct rpc_xprt *xprt, struct socket *sock)
sk
->
no_check
=
UDP_CSUM_NORCV
;
xprt_set_connected
(
xprt
);
}
else
{
struct
tcp_opt
*
tp
=
tcp_sk
(
sk
);
tp
->
nonagle
=
1
;
/* disable Nagle's algorithm */
sk
->
data_ready
=
tcp_data_ready
;
sk
->
state_change
=
tcp_state_change
;
xprt_clear_connected
(
xprt
);
...
...
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