NFSv4: Fix an Oops in nfs4_free_lock_state
The oops http://www.kerneloops.org/raw.php?rawid=537858&msgid= appears to be due to the nfs4_lock_state->ls_state field being uninitialised. This happens if the call to nfs4_free_lock_state() is triggered at the end of nfs4_get_lock_state(). The fix is to move the initialisation of ls_state into the allocator. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
Родитель
aea1f7964a
Коммит
b64aec8d1e
|
@ -553,6 +553,7 @@ static struct nfs4_lock_state *nfs4_alloc_lock_state(struct nfs4_state *state, f
|
||||||
INIT_LIST_HEAD(&lsp->ls_sequence.list);
|
INIT_LIST_HEAD(&lsp->ls_sequence.list);
|
||||||
lsp->ls_seqid.sequence = &lsp->ls_sequence;
|
lsp->ls_seqid.sequence = &lsp->ls_sequence;
|
||||||
atomic_set(&lsp->ls_count, 1);
|
atomic_set(&lsp->ls_count, 1);
|
||||||
|
lsp->ls_state = state;
|
||||||
lsp->ls_owner = fl_owner;
|
lsp->ls_owner = fl_owner;
|
||||||
spin_lock(&clp->cl_lock);
|
spin_lock(&clp->cl_lock);
|
||||||
nfs_alloc_unique_id(&clp->cl_lockowner_id, &lsp->ls_id, 1, 64);
|
nfs_alloc_unique_id(&clp->cl_lockowner_id, &lsp->ls_id, 1, 64);
|
||||||
|
@ -587,7 +588,6 @@ static struct nfs4_lock_state *nfs4_get_lock_state(struct nfs4_state *state, fl_
|
||||||
if (lsp != NULL)
|
if (lsp != NULL)
|
||||||
break;
|
break;
|
||||||
if (new != NULL) {
|
if (new != NULL) {
|
||||||
new->ls_state = state;
|
|
||||||
list_add(&new->ls_locks, &state->lock_states);
|
list_add(&new->ls_locks, &state->lock_states);
|
||||||
set_bit(LK_STATE_IN_USE, &state->flags);
|
set_bit(LK_STATE_IN_USE, &state->flags);
|
||||||
lsp = new;
|
lsp = new;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче