Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci-2.6.23
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-2.6.23
Commits
e21195a7
Commit
e21195a7
authored
Dec 05, 2006
by
Trond Myklebust
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
NFS: More cleanups of fs/nfs/write.c
Signed-off-by:
Trond Myklebust
<
Trond.Myklebust@netapp.com
>
parent
87a4ce16
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
24 additions
and
44 deletions
+24
-44
fs/nfs/write.c
fs/nfs/write.c
+24
-44
No files found.
fs/nfs/write.c
View file @
e21195a7
...
...
@@ -75,7 +75,6 @@
* Local function declarations
*/
static
struct
nfs_page
*
nfs_update_request
(
struct
nfs_open_context
*
,
struct
inode
*
,
struct
page
*
,
unsigned
int
,
unsigned
int
);
static
int
nfs_wait_on_write_congestion
(
struct
address_space
*
,
int
);
...
...
@@ -215,10 +214,10 @@ static void nfs_mark_uptodate(struct page *page, unsigned int base, unsigned int
* Write a page synchronously.
* Offset is the data offset within the page.
*/
static
int
nfs_writepage_sync
(
struct
nfs_open_context
*
ctx
,
struct
inode
*
inode
,
struct
page
*
page
,
unsigned
int
offset
,
unsigned
int
count
,
int
how
)
static
int
nfs_writepage_sync
(
struct
nfs_open_context
*
ctx
,
struct
page
*
page
,
unsigned
int
offset
,
unsigned
int
count
,
int
how
)
{
struct
inode
*
inode
=
page
->
mapping
->
host
;
unsigned
int
wsize
=
NFS_SERVER
(
inode
)
->
wsize
;
int
result
,
written
=
0
;
struct
nfs_write_data
*
wdata
;
...
...
@@ -283,15 +282,23 @@ io_error:
return
written
?
written
:
result
;
}
static
int
nfs_writepage_async
(
struct
nfs_open_context
*
ctx
,
struct
inode
*
inode
,
struct
page
*
page
,
static
int
nfs_writepage_setup
(
struct
nfs_open_context
*
ctx
,
struct
page
*
page
,
unsigned
int
offset
,
unsigned
int
count
)
{
struct
nfs_page
*
req
;
int
ret
;
req
=
nfs_update_request
(
ctx
,
inode
,
page
,
offset
,
count
);
if
(
IS_ERR
(
req
))
return
PTR_ERR
(
req
);
for
(;;)
{
req
=
nfs_update_request
(
ctx
,
page
,
offset
,
count
);
if
(
!
IS_ERR
(
req
))
break
;
ret
=
PTR_ERR
(
req
);
if
(
ret
!=
-
EBUSY
)
return
ret
;
ret
=
nfs_wb_page
(
page
->
mapping
->
host
,
page
);
if
(
ret
!=
0
)
return
ret
;
}
/* Update file length */
nfs_grow_file
(
page
,
offset
,
count
);
/* Set the PG_uptodate flag? */
...
...
@@ -317,14 +324,13 @@ int nfs_writepage(struct page *page, struct writeback_control *wbc)
struct
nfs_open_context
*
ctx
;
struct
inode
*
inode
=
page
->
mapping
->
host
;
unsigned
offset
;
int
priority
=
wb_priority
(
wbc
);
int
err
;
nfs_inc_stats
(
inode
,
NFSIOS_VFSWRITEPAGE
);
nfs_add_stats
(
inode
,
NFSIOS_WRITEPAGES
,
1
);
/* Ensure we've flushed out any previous writes */
nfs_wb_page_priority
(
inode
,
page
,
priority
);
nfs_wb_page_priority
(
inode
,
page
,
wb_priority
(
wbc
)
);
err
=
0
;
offset
=
nfs_page_length
(
page
);
...
...
@@ -338,12 +344,11 @@ int nfs_writepage(struct page *page, struct writeback_control *wbc)
}
lock_kernel
();
if
(
!
IS_SYNC
(
inode
))
{
err
=
nfs_writepage_
async
(
ctx
,
inode
,
page
,
0
,
offset
);
err
=
nfs_writepage_
setup
(
ctx
,
page
,
0
,
offset
);
if
(
!
wbc
->
for_writepages
)
nfs_flush_mapping
(
page
->
mapping
,
wbc
,
wb_priority
(
wbc
));
}
else
{
err
=
nfs_writepage_sync
(
ctx
,
inode
,
page
,
0
,
offset
,
priority
);
err
=
nfs_writepage_sync
(
ctx
,
page
,
0
,
offset
,
wb_priority
(
wbc
));
if
(
err
>=
0
)
{
if
(
err
!=
offset
)
redirty_page_for_writepage
(
wbc
,
page
);
...
...
@@ -643,17 +648,16 @@ static int nfs_wait_on_write_congestion(struct address_space *mapping, int intr)
* Note: Should always be called with the Page Lock held!
*/
static
struct
nfs_page
*
nfs_update_request
(
struct
nfs_open_context
*
ctx
,
struct
inode
*
inode
,
struct
page
*
page
,
unsigned
int
offset
,
unsigned
int
bytes
)
struct
page
*
page
,
unsigned
int
offset
,
unsigned
int
bytes
)
{
struct
nfs_server
*
server
=
NFS_SERVER
(
inode
)
;
struct
inode
*
inode
=
page
->
mapping
->
host
;
struct
nfs_inode
*
nfsi
=
NFS_I
(
inode
);
struct
nfs_page
*
req
,
*
new
=
NULL
;
unsigned
long
rqend
,
end
;
end
=
offset
+
bytes
;
if
(
nfs_wait_on_write_congestion
(
page
->
mapping
,
server
->
flags
&
NFS_MOUNT_INTR
))
if
(
nfs_wait_on_write_congestion
(
page
->
mapping
,
NFS_SERVER
(
inode
)
->
flags
&
NFS_MOUNT_INTR
))
return
ERR_PTR
(
-
ERESTARTSYS
);
for
(;;)
{
/* Loop over all inode entries and see if we find
...
...
@@ -764,7 +768,6 @@ int nfs_updatepage(struct file *file, struct page *page,
{
struct
nfs_open_context
*
ctx
=
(
struct
nfs_open_context
*
)
file
->
private_data
;
struct
inode
*
inode
=
page
->
mapping
->
host
;
struct
nfs_page
*
req
;
int
status
=
0
;
nfs_inc_stats
(
inode
,
NFSIOS_VFSUPDATEPAGE
);
...
...
@@ -775,7 +778,7 @@ int nfs_updatepage(struct file *file, struct page *page,
(
long
long
)(
page_offset
(
page
)
+
offset
));
if
(
IS_SYNC
(
inode
))
{
status
=
nfs_writepage_sync
(
ctx
,
inode
,
page
,
offset
,
count
,
0
);
status
=
nfs_writepage_sync
(
ctx
,
page
,
offset
,
count
,
0
);
if
(
status
>
0
)
{
if
(
offset
==
0
&&
status
==
PAGE_CACHE_SIZE
)
SetPageUptodate
(
page
);
...
...
@@ -793,31 +796,8 @@ int nfs_updatepage(struct file *file, struct page *page,
offset
=
0
;
}
/*
* Try to find an NFS request corresponding to this page
* and update it.
* If the existing request cannot be updated, we must flush
* it out now.
*/
do
{
req
=
nfs_update_request
(
ctx
,
inode
,
page
,
offset
,
count
);
status
=
(
IS_ERR
(
req
))
?
PTR_ERR
(
req
)
:
0
;
if
(
status
!=
-
EBUSY
)
break
;
/* Request could not be updated. Flush it out and try again */
status
=
nfs_wb_page
(
inode
,
page
);
}
while
(
status
>=
0
);
if
(
status
<
0
)
goto
done
;
status
=
0
;
status
=
nfs_writepage_setup
(
ctx
,
page
,
offset
,
count
);
/* Update file length */
nfs_grow_file
(
page
,
offset
,
count
);
/* Set the PG_uptodate flag? */
nfs_mark_uptodate
(
page
,
req
->
wb_pgbase
,
req
->
wb_bytes
);
nfs_unlock_request
(
req
);
done:
dprintk
(
"NFS: nfs_updatepage returns %d (isize %Ld)
\n
"
,
status
,
(
long
long
)
i_size_read
(
inode
));
if
(
status
<
0
)
...
...
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