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
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