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
3a649b88
Commit
3a649b88
authored
Mar 20, 2006
by
Trond Myklebust
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
NLM: Simplify client locks
Signed-off-by:
Trond Myklebust
<
Trond.Myklebust@netapp.com
>
parent
d72b7a6b
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
35 additions
and
54 deletions
+35
-54
fs/lockd/clntlock.c
fs/lockd/clntlock.c
+16
-27
fs/lockd/clntproc.c
fs/lockd/clntproc.c
+16
-23
include/linux/lockd/lockd.h
include/linux/lockd/lockd.h
+3
-4
No files found.
fs/lockd/clntlock.c
View file @
3a649b88
...
...
@@ -44,32 +44,25 @@ static LIST_HEAD(nlm_blocked);
/*
* Queue up a lock for blocking so that the GRANTED request can see it
*/
int
nlmclnt_prepare_block
(
struct
nlm_rqst
*
req
,
struct
nlm_host
*
host
,
struct
file_lock
*
fl
)
struct
nlm_wait
*
nlmclnt_prepare_block
(
struct
nlm_host
*
host
,
struct
file_lock
*
fl
)
{
struct
nlm_wait
*
block
;
BUG_ON
(
req
->
a_block
!=
NULL
);
block
=
kmalloc
(
sizeof
(
*
block
),
GFP_KERNEL
);
if
(
block
==
NULL
)
return
-
ENOMEM
;
block
->
b_host
=
host
;
block
->
b_lock
=
fl
;
init_waitqueue_head
(
&
block
->
b_wait
);
block
->
b_status
=
NLM_LCK_BLOCKED
;
list_add
(
&
block
->
b_list
,
&
nlm_blocked
);
req
->
a_block
=
block
;
return
0
;
if
(
block
!=
NULL
)
{
block
->
b_host
=
host
;
block
->
b_lock
=
fl
;
init_waitqueue_head
(
&
block
->
b_wait
);
block
->
b_status
=
NLM_LCK_BLOCKED
;
list_add
(
&
block
->
b_list
,
&
nlm_blocked
);
}
return
block
;
}
void
nlmclnt_finish_block
(
struct
nlm_
rqst
*
req
)
void
nlmclnt_finish_block
(
struct
nlm_
wait
*
block
)
{
struct
nlm_wait
*
block
=
req
->
a_block
;
if
(
block
==
NULL
)
return
;
req
->
a_block
=
NULL
;
list_del
(
&
block
->
b_list
);
kfree
(
block
);
}
...
...
@@ -77,15 +70,14 @@ void nlmclnt_finish_block(struct nlm_rqst *req)
/*
* Block on a lock
*/
long
nlmclnt_block
(
struct
nlm_rqst
*
req
,
long
timeout
)
int
nlmclnt_block
(
struct
nlm_wait
*
block
,
struct
nlm_rqst
*
req
,
long
timeout
)
{
struct
nlm_wait
*
block
=
req
->
a_block
;
long
ret
;
/* A borken server might ask us to block even if we didn't
* request it. Just say no!
*/
if
(
!
req
->
a_args
.
block
)
if
(
block
==
NULL
)
return
-
EAGAIN
;
/* Go to sleep waiting for GRANT callback. Some servers seem
...
...
@@ -99,13 +91,10 @@ long nlmclnt_block(struct nlm_rqst *req, long timeout)
ret
=
wait_event_interruptible_timeout
(
block
->
b_wait
,
block
->
b_status
!=
NLM_LCK_BLOCKED
,
timeout
);
if
(
block
->
b_status
!=
NLM_LCK_BLOCKED
)
{
req
->
a_res
.
status
=
block
->
b_status
;
block
->
b_status
=
NLM_LCK_BLOCKED
;
}
return
ret
;
if
(
ret
<
0
)
return
-
ERESTARTSYS
;
req
->
a_res
.
status
=
block
->
b_status
;
return
0
;
}
/*
...
...
fs/lockd/clntproc.c
View file @
3a649b88
...
...
@@ -136,15 +136,14 @@ static void nlmclnt_setlockargs(struct nlm_rqst *req, struct file_lock *fl)
(
unsigned
int
)
fl
->
fl_u
.
nfs_fl
.
owner
->
pid
,
system_utsname
.
nodename
);
lock
->
svid
=
fl
->
fl_u
.
nfs_fl
.
owner
->
pid
;
locks_copy_lock
(
&
lock
->
fl
,
fl
);
lock
->
fl
.
fl_start
=
fl
->
fl_start
;
lock
->
fl
.
fl_end
=
fl
->
fl_end
;
lock
->
fl
.
fl_type
=
fl
->
fl_type
;
}
static
void
nlmclnt_release_lockargs
(
struct
nlm_rqst
*
req
)
{
struct
file_lock
*
fl
=
&
req
->
a_args
.
lock
.
fl
;
if
(
fl
->
fl_ops
&&
fl
->
fl_ops
->
fl_release_private
)
fl
->
fl_ops
->
fl_release_private
(
fl
);
BUG_ON
(
req
->
a_args
.
lock
.
fl
.
fl_ops
!=
NULL
);
}
/*
...
...
@@ -455,7 +454,6 @@ static void nlmclnt_locks_release_private(struct file_lock *fl)
{
list_del
(
&
fl
->
fl_u
.
nfs_fl
.
list
);
nlm_put_lockowner
(
fl
->
fl_u
.
nfs_fl
.
owner
);
fl
->
fl_ops
=
NULL
;
}
static
struct
file_lock_operations
nlmclnt_lock_ops
=
{
...
...
@@ -515,41 +513,36 @@ nlmclnt_lock(struct nlm_rqst *req, struct file_lock *fl)
{
struct
nlm_host
*
host
=
req
->
a_host
;
struct
nlm_res
*
resp
=
&
req
->
a_res
;
long
timeout
;
int
status
;
struct
nlm_wait
*
block
=
NULL
;
int
status
=
-
ENOLCK
;
if
(
!
host
->
h_monitored
&&
nsm_monitor
(
host
)
<
0
)
{
printk
(
KERN_NOTICE
"lockd: failed to monitor %s
\n
"
,
host
->
h_name
);
status
=
-
ENOLCK
;
goto
out
;
}
if
(
req
->
a_args
.
block
)
{
status
=
nlmclnt_prepare_block
(
req
,
host
,
fl
);
if
(
status
<
0
)
goto
out
;
}
block
=
nlmclnt_prepare_block
(
host
,
fl
);
for
(;;)
{
status
=
nlmclnt_call
(
req
,
NLMPROC_LOCK
);
if
(
status
<
0
)
goto
out_unblock
;
if
(
resp
->
status
!=
NLM_LCK_BLOCKED
)
if
(
!
req
->
a_args
.
block
)
break
;
/* Wait on an NLM blocking lock */
timeout
=
nlmclnt_block
(
req
,
NLMCLNT_POLL_TIMEOUT
);
/* Did a reclaimer thread notify us of a server reboot? */
if
(
resp
->
status
==
NLM_LCK_DENIED_GRACE_PERIOD
)
continue
;
if
(
resp
->
status
!=
NLM_LCK_BLOCKED
)
break
;
if
(
timeout
>=
0
)
continue
;
/*
W
e were interrupted. Send a CANCEL request to the server
/* Wait on an NLM blocking lock */
status
=
nlmclnt_block
(
block
,
req
,
NLMCLNT_POLL_TIMEOUT
)
;
/*
if w
e were interrupted. Send a CANCEL request to the server
* and exit
*/
status
=
(
int
)
timeout
;
goto
out_unblock
;
if
(
status
<
0
)
goto
out_unblock
;
if
(
resp
->
status
!=
NLM_LCK_BLOCKED
)
break
;
}
if
(
resp
->
status
==
NLM_LCK_GRANTED
)
{
...
...
@@ -560,7 +553,7 @@ nlmclnt_lock(struct nlm_rqst *req, struct file_lock *fl)
}
status
=
nlm_stat_to_errno
(
resp
->
status
);
out_unblock:
nlmclnt_finish_block
(
req
);
nlmclnt_finish_block
(
block
);
/* Cancel the blocked request if it is still pending */
if
(
resp
->
status
==
NLM_LCK_BLOCKED
)
nlmclnt_cancel
(
host
,
req
->
a_args
.
block
,
fl
);
...
...
include/linux/lockd/lockd.h
View file @
3a649b88
...
...
@@ -86,7 +86,6 @@ struct nlm_rqst {
struct
nlm_host
*
a_host
;
/* host handle */
struct
nlm_args
a_args
;
/* arguments */
struct
nlm_res
a_res
;
/* result */
struct
nlm_wait
*
a_block
;
unsigned
int
a_retries
;
/* Retry count */
char
a_owner
[
NLMCLNT_OHSIZE
];
};
...
...
@@ -149,9 +148,9 @@ extern unsigned long nlmsvc_timeout;
* Lockd client functions
*/
struct
nlm_rqst
*
nlmclnt_alloc_call
(
void
);
int
nlmclnt_prepare_block
(
struct
nlm_rqst
*
req
,
struct
nlm_host
*
host
,
struct
file_lock
*
fl
);
void
nlmclnt_finish_block
(
struct
nlm_
rqst
*
req
);
long
nlmclnt_block
(
struct
nlm_rqst
*
req
,
long
timeout
);
struct
nlm_wait
*
nlmclnt_prepare_block
(
struct
nlm_host
*
host
,
struct
file_lock
*
fl
);
void
nlmclnt_finish_block
(
struct
nlm_
wait
*
block
);
int
nlmclnt_block
(
struct
nlm_wait
*
block
,
struct
nlm_rqst
*
req
,
long
timeout
);
u32
nlmclnt_grant
(
const
struct
sockaddr_in
*
addr
,
const
struct
nlm_lock
*
);
void
nlmclnt_recovery
(
struct
nlm_host
*
,
u32
);
int
nlmclnt_reclaim
(
struct
nlm_host
*
,
struct
file_lock
*
);
...
...
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