u32 s_mode; /* deny mode */
};
-__be32 nlmsvc_share_file(struct nlm_host *, struct nlm_file *,
- struct nlm_args *);
-__be32 nlmsvc_unshare_file(struct nlm_host *, struct nlm_file *,
- struct nlm_args *);
+__be32 nlmsvc_share_file(struct nlm_host *host, struct nlm_file *file,
+ struct xdr_netobj *oh, u32 access, u32 mode);
+__be32 nlmsvc_unshare_file(struct nlm_host *host, struct nlm_file *file,
+ struct xdr_netobj *oh);
void nlmsvc_traverse_shares(struct nlm_host *, struct nlm_file *,
nlm_host_match_fn_t);
rpc_drop_reply : rpc_success;
/* Now try to create the share */
- resp->status = nlmsvc_share_file(host, file, argp);
+ resp->status = nlmsvc_share_file(host, file, &lock->oh,
+ argp->fsm_access, argp->fsm_mode);
dprintk("lockd: SHARE status %d\n", ntohl(resp->status));
nlmsvc_release_lockowner(lock);
return resp->status == nlm__int__drop_reply ?
rpc_drop_reply : rpc_success;
- /* Now try to lock the file */
- resp->status = nlmsvc_unshare_file(host, file, argp);
+ /* Now try to unshare the file */
+ resp->status = nlmsvc_unshare_file(host, file, &lock->oh);
dprintk("lockd: UNSHARE status %d\n", ntohl(resp->status));
nlmsvc_release_lockowner(lock);
rpc_drop_reply : rpc_success;
/* Now try to create the share */
- resp->status = cast_status(nlmsvc_share_file(host, file, argp));
+ resp->status = cast_status(nlmsvc_share_file(host, file, &argp->lock.oh,
+ argp->fsm_access,
+ argp->fsm_mode));
dprintk("lockd: SHARE status %d\n", ntohl(resp->status));
nlmsvc_release_lockowner(&argp->lock);
rpc_drop_reply : rpc_success;
/* Now try to unshare the file */
- resp->status = cast_status(nlmsvc_unshare_file(host, file, argp));
+ resp->status = cast_status(nlmsvc_unshare_file(host, file,
+ &argp->lock.oh));
dprintk("lockd: UNSHARE status %d\n", ntohl(resp->status));
nlmsvc_release_lockowner(&argp->lock);
&& !memcmp(share->s_owner.data, oh->data, oh->len);
}
+/**
+ * nlmsvc_share_file - create a share
+ * @host: Network client peer
+ * @file: File to be shared
+ * @oh: Share owner handle
+ * @access: Requested access mode
+ * @mode: Requested file sharing mode
+ *
+ * Returns an NLM status code.
+ */
__be32
nlmsvc_share_file(struct nlm_host *host, struct nlm_file *file,
- struct nlm_args *argp)
+ struct xdr_netobj *oh, u32 access, u32 mode)
{
struct nlm_share *share;
- struct xdr_netobj *oh = &argp->lock.oh;
u8 *ohdata;
if (nlmsvc_file_cannot_lock(file))
for (share = file->f_shares; share; share = share->s_next) {
if (share->s_host == host && nlm_cmp_owner(share, oh))
goto update;
- if ((argp->fsm_access & share->s_mode)
- || (argp->fsm_mode & share->s_access ))
+ if ((access & share->s_mode) || (mode & share->s_access))
return nlm_lck_denied;
}
- share = kmalloc(sizeof(*share) + oh->len,
- GFP_KERNEL);
+ share = kmalloc(sizeof(*share) + oh->len, GFP_KERNEL);
if (share == NULL)
return nlm_lck_denied_nolocks;
file->f_shares = share;
update:
- share->s_access = argp->fsm_access;
- share->s_mode = argp->fsm_mode;
+ share->s_access = access;
+ share->s_mode = mode;
return nlm_granted;
}
-/*
- * Delete a share.
+/**
+ * nlmsvc_unshare_file - delete a share
+ * @host: Network client peer
+ * @file: File to be unshared
+ * @oh: Share owner handle
+ *
+ * Returns an NLM status code.
*/
__be32
nlmsvc_unshare_file(struct nlm_host *host, struct nlm_file *file,
- struct nlm_args *argp)
+ struct xdr_netobj *oh)
{
struct nlm_share *share, **shpp;
- struct xdr_netobj *oh = &argp->lock.oh;
if (nlmsvc_file_cannot_lock(file))
return nlm_lck_denied_nolocks;