|
Lines 2629-2635
alloc_init_lock_stateowner(unsigned int
Link Here
|
| 2629 |
sop->so_is_open_owner = 0; |
2629 |
sop->so_is_open_owner = 0; |
| 2630 |
sop->so_id = current_ownerid++; |
2630 |
sop->so_id = current_ownerid++; |
| 2631 |
sop->so_client = clp; |
2631 |
sop->so_client = clp; |
| 2632 |
sop->so_seqid = lock->lk_new_lock_seqid; |
2632 |
/* It is the openowner seqid that will be incremented in encode in the |
|
|
2633 |
* case of new lockowners; so increment the lock seqid manually: */ |
| 2634 |
sop->so_seqid = lock->lk_new_lock_seqid + 1; |
| 2633 |
sop->so_confirmed = 1; |
2635 |
sop->so_confirmed = 1; |
| 2634 |
rp = &sop->so_replay; |
2636 |
rp = &sop->so_replay; |
| 2635 |
rp->rp_status = NFSERR_SERVERFAULT; |
2637 |
rp->rp_status = NFSERR_SERVERFAULT; |
|
Lines 2684-2689
int
Link Here
|
| 2684 |
nfsd4_lock(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_lock *lock, struct nfs4_stateowner **replay_owner) |
2686 |
nfsd4_lock(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_lock *lock, struct nfs4_stateowner **replay_owner) |
| 2685 |
{ |
2687 |
{ |
| 2686 |
struct nfs4_stateowner *open_sop = NULL; |
2688 |
struct nfs4_stateowner *open_sop = NULL; |
|
|
2689 |
struct nfs4_stateowner *lock_sop = NULL; |
| 2687 |
struct nfs4_stateid *lock_stp; |
2690 |
struct nfs4_stateid *lock_stp; |
| 2688 |
struct file *filp; |
2691 |
struct file *filp; |
| 2689 |
struct file_lock file_lock; |
2692 |
struct file_lock file_lock; |
|
Lines 2718-2726
nfsd4_lock(struct svc_rqst *rqstp, struc
Link Here
|
| 2718 |
lock->lk_new_open_seqid, |
2721 |
lock->lk_new_open_seqid, |
| 2719 |
&lock->lk_new_open_stateid, |
2722 |
&lock->lk_new_open_stateid, |
| 2720 |
CHECK_FH | OPEN_STATE, |
2723 |
CHECK_FH | OPEN_STATE, |
| 2721 |
&open_sop, &open_stp, lock); |
2724 |
&lock->lk_stateowner, &open_stp, |
|
|
2725 |
lock); |
| 2722 |
if (status) |
2726 |
if (status) |
| 2723 |
goto out; |
2727 |
goto out; |
|
|
2728 |
open_sop = lock->lk_stateowner; |
| 2724 |
/* create lockowner and lock stateid */ |
2729 |
/* create lockowner and lock stateid */ |
| 2725 |
fp = open_stp->st_file; |
2730 |
fp = open_stp->st_file; |
| 2726 |
strhashval = lock_ownerstr_hashval(fp->fi_inode, |
2731 |
strhashval = lock_ownerstr_hashval(fp->fi_inode, |
|
Lines 2730-2745
nfsd4_lock(struct svc_rqst *rqstp, struc
Link Here
|
| 2730 |
* the same file, or should they just be allowed (and |
2735 |
* the same file, or should they just be allowed (and |
| 2731 |
* create new stateids)? */ |
2736 |
* create new stateids)? */ |
| 2732 |
status = nfserr_resource; |
2737 |
status = nfserr_resource; |
| 2733 |
if (!(lock->lk_stateowner = alloc_init_lock_stateowner(strhashval, open_sop->so_client, open_stp, lock))) |
2738 |
lock_sop = alloc_init_lock_stateowner(strhashval, |
|
|
2739 |
open_sop->so_client, open_stp, lock); |
| 2740 |
if (lock_sop == NULL) |
| 2734 |
goto out; |
2741 |
goto out; |
| 2735 |
if ((lock_stp = alloc_init_lock_stateid(lock->lk_stateowner, |
2742 |
lock_stp = alloc_init_lock_stateid(lock_sop, fp, open_stp); |
| 2736 |
fp, open_stp)) == NULL) { |
2743 |
if (lock_stp == NULL) { |
| 2737 |
release_stateowner(lock->lk_stateowner); |
2744 |
release_stateowner(lock_sop); |
| 2738 |
lock->lk_stateowner = NULL; |
|
|
| 2739 |
goto out; |
2745 |
goto out; |
| 2740 |
} |
2746 |
} |
| 2741 |
/* bump the open seqid used to create the lock */ |
|
|
| 2742 |
open_sop->so_seqid++; |
| 2743 |
} else { |
2747 |
} else { |
| 2744 |
/* lock (lock owner + lock stateid) already exists */ |
2748 |
/* lock (lock owner + lock stateid) already exists */ |
| 2745 |
status = nfs4_preprocess_seqid_op(current_fh, |
2749 |
status = nfs4_preprocess_seqid_op(current_fh, |
|
Lines 2749-2754
nfsd4_lock(struct svc_rqst *rqstp, struc
Link Here
|
| 2749 |
&lock->lk_stateowner, &lock_stp, lock); |
2753 |
&lock->lk_stateowner, &lock_stp, lock); |
| 2750 |
if (status) |
2754 |
if (status) |
| 2751 |
goto out; |
2755 |
goto out; |
|
|
2756 |
lock_sop = lock->lk_stateowner; |
| 2752 |
} |
2757 |
} |
| 2753 |
/* lock->lk_stateowner and lock_stp have been created or found */ |
2758 |
/* lock->lk_stateowner and lock_stp have been created or found */ |
| 2754 |
filp = lock_stp->st_vfs_file; |
2759 |
filp = lock_stp->st_vfs_file; |
|
Lines 2779-2785
nfsd4_lock(struct svc_rqst *rqstp, struc
Link Here
|
| 2779 |
status = nfserr_inval; |
2784 |
status = nfserr_inval; |
| 2780 |
goto out; |
2785 |
goto out; |
| 2781 |
} |
2786 |
} |
| 2782 |
file_lock.fl_owner = (fl_owner_t) lock->lk_stateowner; |
2787 |
file_lock.fl_owner = (fl_owner_t)lock_sop; |
| 2783 |
file_lock.fl_pid = current->tgid; |
2788 |
file_lock.fl_pid = current->tgid; |
| 2784 |
file_lock.fl_file = filp; |
2789 |
file_lock.fl_file = filp; |
| 2785 |
file_lock.fl_flags = FL_POSIX; |
2790 |
file_lock.fl_flags = FL_POSIX; |
|
Lines 2835-2843
out_destroy_new_stateid:
Link Here
|
| 2835 |
* An error encountered after instantiation of the new |
2840 |
* An error encountered after instantiation of the new |
| 2836 |
* stateid has forced us to destroy it. |
2841 |
* stateid has forced us to destroy it. |
| 2837 |
*/ |
2842 |
*/ |
| 2838 |
if (!seqid_mutating_err(status)) |
|
|
| 2839 |
open_sop->so_seqid--; |
| 2840 |
|
| 2841 |
release_state_owner(lock_stp, LOCK_STATE); |
2843 |
release_state_owner(lock_stp, LOCK_STATE); |
| 2842 |
} |
2844 |
} |
| 2843 |
out: |
2845 |
out: |