Print this page
195 Need replacement for nfs/lockd+klm
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Reviewed by: Jeremy Jones <jeremy@delphix.com>
Reviewed by: Jeff Biseda <jbiseda@delphix.com>
*** 21,30 ****
--- 21,34 ----
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
+ /*
+ * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
+ */
+
#include <sys/types.h>
#include <sys/sysmacros.h>
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/fcntl.h>
*** 44,54 ****
--- 48,60 ----
static void print_shares(struct vnode *);
static void print_share(struct shrlock *);
#endif
static int isreadonly(struct vnode *);
+ static void do_cleanshares(struct vnode *, pid_t, int32_t);
+
/*
* Add the share reservation shr to vp.
*/
int
add_share(struct vnode *vp, struct shrlock *shr)
*** 333,351 ****
* the given file.
*/
void
cleanshares(struct vnode *vp, pid_t pid)
{
struct shrlock shr;
if (vp->v_shrlocks == NULL)
return;
shr.s_access = 0;
shr.s_deny = 0;
shr.s_pid = pid;
! shr.s_sysid = 0;
shr.s_own_len = 0;
shr.s_owner = NULL;
(void) del_share(vp, &shr);
}
--- 339,383 ----
* the given file.
*/
void
cleanshares(struct vnode *vp, pid_t pid)
{
+ do_cleanshares(vp, pid, 0);
+ }
+
+ /*
+ * Cleanup all remote share reservations that
+ * were made by the given sysid on given vnode.
+ */
+ void
+ cleanshares_by_sysid(struct vnode *vp, int32_t sysid)
+ {
+ if (sysid == 0)
+ return;
+
+ do_cleanshares(vp, 0, sysid);
+ }
+
+ /*
+ * Cleanup share reservations on given vnode made
+ * by the either given pid or sysid.
+ * If sysid is 0, remove all shares made by given pid,
+ * otherwise all shares made by the given sysid will
+ * be removed.
+ */
+ static void
+ do_cleanshares(struct vnode *vp, pid_t pid, int32_t sysid)
+ {
struct shrlock shr;
if (vp->v_shrlocks == NULL)
return;
shr.s_access = 0;
shr.s_deny = 0;
shr.s_pid = pid;
! shr.s_sysid = sysid;
shr.s_own_len = 0;
shr.s_owner = NULL;
(void) del_share(vp, &shr);
}