summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorMarcel Telka <marcel@telka.sk>2016-12-16 17:13:25 +0100
committerDan McDonald <danmcd@omniti.com>2016-12-20 10:51:23 -0500
commit668487358738f1513a74ebbb1b8cda03947984c1 (patch)
treec9a0df1d3d1dbda30b1f24096cd035127ec43a46 /usr/src
parent540b2cc7a3cce4677bb918fec08d34cfd5f8c545 (diff)
downloadillumos-joyent-668487358738f1513a74ebbb1b8cda03947984c1.tar.gz
7671 fs_frlock() should remove installed callback
Reviewed by: Robert Mustacchi <rm@joyent.com> Reviewed by: Toomas Soome <tsoome@me.com> Approved by: Dan McDonald <danmcd@omniti.com>
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/fs/fs_subr.c108
-rw-r--r--usr/src/uts/common/os/flock.c56
-rw-r--r--usr/src/uts/common/sys/flock.h1
3 files changed, 58 insertions, 107 deletions
diff --git a/usr/src/uts/common/fs/fs_subr.c b/usr/src/uts/common/fs/fs_subr.c
index ec5b145a86..28a3866015 100644
--- a/usr/src/uts/common/fs/fs_subr.c
+++ b/usr/src/uts/common/fs/fs_subr.c
@@ -113,44 +113,26 @@ fs_freevfs(vfs_t *vfsp)
/* ARGSUSED */
int
-fs_nosys_map(struct vnode *vp,
- offset_t off,
- struct as *as,
- caddr_t *addrp,
- size_t len,
- uchar_t prot,
- uchar_t maxprot,
- uint_t flags,
- struct cred *cr,
- caller_context_t *ct)
+fs_nosys_map(struct vnode *vp, offset_t off, struct as *as, caddr_t *addrp,
+ size_t len, uchar_t prot, uchar_t maxprot, uint_t flags, struct cred *cr,
+ caller_context_t *ct)
{
return (ENOSYS);
}
/* ARGSUSED */
int
-fs_nosys_addmap(struct vnode *vp,
- offset_t off,
- struct as *as,
- caddr_t addr,
- size_t len,
- uchar_t prot,
- uchar_t maxprot,
- uint_t flags,
- struct cred *cr,
- caller_context_t *ct)
+fs_nosys_addmap(struct vnode *vp, offset_t off, struct as *as, caddr_t addr,
+ size_t len, uchar_t prot, uchar_t maxprot, uint_t flags, struct cred *cr,
+ caller_context_t *ct)
{
return (ENOSYS);
}
/* ARGSUSED */
int
-fs_nosys_poll(vnode_t *vp,
- register short events,
- int anyyet,
- register short *reventsp,
- struct pollhead **phpp,
- caller_context_t *ct)
+fs_nosys_poll(vnode_t *vp, short events, int anyyet, short *reventsp,
+ struct pollhead **phpp, caller_context_t *ct)
{
return (ENOSYS);
}
@@ -183,7 +165,7 @@ fs_fsync(vnode_t *vp, int syncflag, cred_t *cr, caller_context_t *ct)
/* ARGSUSED */
int
fs_putpage(vnode_t *vp, offset_t off, size_t len, int flags, cred_t *cr,
- caller_context_t *ctp)
+ caller_context_t *ctp)
{
return (0);
}
@@ -194,7 +176,7 @@ fs_putpage(vnode_t *vp, offset_t off, size_t len, int flags, cred_t *cr,
/* ARGSUSED */
int
fs_ioctl(vnode_t *vp, int com, intptr_t data, int flag, cred_t *cred,
- int *rvalp)
+ int *rvalp)
{
return (0);
}
@@ -240,9 +222,8 @@ fs_seek(vnode_t *vp, offset_t ooff, offset_t *noffp, caller_context_t *ct)
*/
/* ARGSUSED */
int
-fs_frlock(register vnode_t *vp, int cmd, struct flock64 *bfp, int flag,
- offset_t offset, flk_callback_t *flk_cbp, cred_t *cr,
- caller_context_t *ct)
+fs_frlock(vnode_t *vp, int cmd, struct flock64 *bfp, int flag, offset_t offset,
+ flk_callback_t *flk_cbp, cred_t *cr, caller_context_t *ct)
{
int frcmd;
int nlmid;
@@ -384,6 +365,9 @@ fs_frlock(register vnode_t *vp, int cmd, struct flock64 *bfp, int flag,
if (!skip_lock)
error = reclock(vp, bfp, frcmd, flag, offset, flk_cbp);
+ if (serialize && (frcmd & SLPFLCK) != 0)
+ flk_del_callback(&serialize_callback);
+
done:
if (serialize)
nbl_end_crit(vp);
@@ -416,12 +400,7 @@ frlock_serialize_blocked(flk_cb_when_t when, void *infop)
*/
/* ARGSUSED */
int
-fs_setfl(
- vnode_t *vp,
- int oflags,
- int nflags,
- cred_t *cr,
- caller_context_t *ct)
+fs_setfl(vnode_t *vp, int oflags, int nflags, cred_t *cr, caller_context_t *ct)
{
return (0);
}
@@ -434,12 +413,8 @@ struct pollhead fs_pollhd;
/* ARGSUSED */
int
-fs_poll(vnode_t *vp,
- register short events,
- int anyyet,
- register short *reventsp,
- struct pollhead **phpp,
- caller_context_t *ct)
+fs_poll(vnode_t *vp, short events, int anyyet, short *reventsp,
+ struct pollhead **phpp, caller_context_t *ct)
{
*reventsp = 0;
if (events & POLLIN)
@@ -461,15 +436,11 @@ fs_poll(vnode_t *vp,
*/
/* ARGSUSED */
int
-fs_pathconf(
- vnode_t *vp,
- int cmd,
- ulong_t *valp,
- cred_t *cr,
- caller_context_t *ct)
+fs_pathconf(vnode_t *vp, int cmd, ulong_t *valp, cred_t *cr,
+ caller_context_t *ct)
{
- register ulong_t val;
- register int error = 0;
+ ulong_t val;
+ int error = 0;
struct statvfs64 vfsbuf;
switch (cmd) {
@@ -568,13 +539,8 @@ fs_pathconf(
*/
/* ARGSUSED */
void
-fs_dispose(
- struct vnode *vp,
- page_t *pp,
- int fl,
- int dn,
- struct cred *cr,
- caller_context_t *ct)
+fs_dispose(struct vnode *vp, page_t *pp, int fl, int dn, struct cred *cr,
+ caller_context_t *ct)
{
ASSERT(fl == B_FREE || fl == B_INVAL);
@@ -587,13 +553,8 @@ fs_dispose(
/* ARGSUSED */
void
-fs_nodispose(
- struct vnode *vp,
- page_t *pp,
- int fl,
- int dn,
- struct cred *cr,
- caller_context_t *ct)
+fs_nodispose(struct vnode *vp, page_t *pp, int fl, int dn, struct cred *cr,
+ caller_context_t *ct)
{
cmn_err(CE_PANIC, "fs_nodispose invoked");
}
@@ -603,12 +564,8 @@ fs_nodispose(
*/
/* ARGSUSED */
int
-fs_fab_acl(
- vnode_t *vp,
- vsecattr_t *vsecattr,
- int flag,
- cred_t *cr,
- caller_context_t *ct)
+fs_fab_acl(vnode_t *vp, vsecattr_t *vsecattr, int flag, cred_t *cr,
+ caller_context_t *ct)
{
aclent_t *aclentp;
struct vattr vattr;
@@ -664,13 +621,8 @@ fs_fab_acl(
*/
/* ARGSUSED4 */
int
-fs_shrlock(
- struct vnode *vp,
- int cmd,
- struct shrlock *shr,
- int flag,
- cred_t *cr,
- caller_context_t *ct)
+fs_shrlock(struct vnode *vp, int cmd, struct shrlock *shr, int flag, cred_t *cr,
+ caller_context_t *ct)
{
int error;
diff --git a/usr/src/uts/common/os/flock.c b/usr/src/uts/common/os/flock.c
index 0f92f1a38d..c79038aca7 100644
--- a/usr/src/uts/common/os/flock.c
+++ b/usr/src/uts/common/os/flock.c
@@ -532,12 +532,8 @@ ofdcleanlock(file_t *fp)
* scheme.
*/
int
-reclock(vnode_t *vp,
- flock64_t *lckdat,
- int cmd,
- int flag,
- u_offset_t offset,
- flk_callback_t *flk_cbp)
+reclock(vnode_t *vp, flock64_t *lckdat, int cmd, int flag, u_offset_t offset,
+ flk_callback_t *flk_cbp)
{
lock_descriptor_t stack_lock_request;
lock_descriptor_t *lock_request;
@@ -869,7 +865,7 @@ flk_invoke_callbacks(flk_callback_t *cblist, flk_cb_when_t when)
void
flk_init_callback(flk_callback_t *flk_cb,
- callb_cpr_t *(*cb_fcn)(flk_cb_when_t, void *), void *cbdata)
+ callb_cpr_t *(*cb_fcn)(flk_cb_when_t, void *), void *cbdata)
{
flk_cb->cb_next = flk_cb;
flk_cb->cb_prev = flk_cb;
@@ -884,8 +880,8 @@ flk_init_callback(flk_callback_t *flk_cb,
void
flk_add_callback(flk_callback_t *newcb,
- callb_cpr_t *(*cb_fcn)(flk_cb_when_t, void *),
- void *cbdata, flk_callback_t *cblist)
+ callb_cpr_t *(*cb_fcn)(flk_cb_when_t, void *),
+ void *cbdata, flk_callback_t *cblist)
{
flk_init_callback(newcb, cb_fcn, cbdata);
@@ -899,6 +895,20 @@ flk_add_callback(flk_callback_t *newcb,
}
/*
+ * Remove the callback from a list.
+ */
+
+void
+flk_del_callback(flk_callback_t *flk_cb)
+{
+ flk_cb->cb_next->cb_prev = flk_cb->cb_prev;
+ flk_cb->cb_prev->cb_next = flk_cb->cb_next;
+
+ flk_cb->cb_prev = flk_cb;
+ flk_cb->cb_next = flk_cb;
+}
+
+/*
* Initialize the flk_edge_cache data structure and create the
* nlm_reg_status array.
*/
@@ -1470,7 +1480,7 @@ flk_wait_execute_request(lock_descriptor_t *request)
static int
flk_add_edge(lock_descriptor_t *from_lock, lock_descriptor_t *to_lock,
- int check_cycle, int update_graph)
+ int check_cycle, int update_graph)
{
edge_t *edge;
edge_t *ep;
@@ -2153,8 +2163,7 @@ flk_wakeup(lock_descriptor_t *lock, int adj_list_remove)
static void
flk_recompute_dependencies(lock_descriptor_t *request,
- lock_descriptor_t **topology,
- int nvertex, int update_graph)
+ lock_descriptor_t **topology, int nvertex, int update_graph)
{
lock_descriptor_t *vertex, *lock;
graph_t *gp = request->l_graph;
@@ -2984,13 +2993,8 @@ cleanlocks(vnode_t *vp, pid_t pid, int sysid)
*/
int
-chklock(
- struct vnode *vp,
- int iomode,
- u_offset_t offset,
- ssize_t len,
- int fmode,
- caller_context_t *ct)
+chklock(struct vnode *vp, int iomode, u_offset_t offset, ssize_t len, int fmode,
+ caller_context_t *ct)
{
register int i;
struct flock64 bf;
@@ -3019,11 +3023,7 @@ chklock(
* given whence.
*/
int
-convoff(vp, lckdat, whence, offset)
- struct vnode *vp;
- struct flock64 *lckdat;
- int whence;
- offset_t offset;
+convoff(struct vnode *vp, struct flock64 *lckdat, int whence, offset_t offset)
{
int error;
struct vattr vattr;
@@ -3658,7 +3658,7 @@ flk_set_lockmgr_status(flk_lockmgr_status_t status)
locklist_t *
get_lock_list(int list_type, int lock_state, int sysid, boolean_t use_sysid,
- pid_t pid, const vnode_t *vp, zoneid_t zoneid)
+ pid_t pid, const vnode_t *vp, zoneid_t zoneid)
{
lock_descriptor_t *lock;
lock_descriptor_t *graph_head;
@@ -4118,8 +4118,6 @@ create_flock(lock_descriptor_t *lp, flock64_t *flp)
* Convert flock_t data describing a lock range into unsigned long starting
* and ending points, which are put into lock_request. Returns 0 or an
* errno value.
- * Large Files: max is passed by the caller and we return EOVERFLOW
- * as defined by LFS API.
*/
int
@@ -4287,7 +4285,7 @@ cl_flk_change_nlm_state_to_unknown(int nlmid)
int
nbl_lock_conflict(vnode_t *vp, nbl_op_t op, u_offset_t offset,
- ssize_t length, int svmand, caller_context_t *ct)
+ ssize_t length, int svmand, caller_context_t *ct)
{
int conflict = 0;
graph_t *gp;
@@ -4333,7 +4331,7 @@ nbl_lock_conflict(vnode_t *vp, nbl_op_t op, u_offset_t offset,
static int
lock_blocks_io(nbl_op_t op, u_offset_t offset, ssize_t length,
- int lock_type, u_offset_t lock_start, u_offset_t lock_end)
+ int lock_type, u_offset_t lock_start, u_offset_t lock_end)
{
ASSERT(op == NBL_READ || op == NBL_WRITE || op == NBL_READWRITE);
ASSERT(lock_type == F_RDLCK || lock_type == F_WRLCK);
diff --git a/usr/src/uts/common/sys/flock.h b/usr/src/uts/common/sys/flock.h
index 3d4b3626b9..fd743ddebb 100644
--- a/usr/src/uts/common/sys/flock.h
+++ b/usr/src/uts/common/sys/flock.h
@@ -253,6 +253,7 @@ void flk_init_callback(flk_callback_t *,
void flk_add_callback(flk_callback_t *,
callb_cpr_t *(*)(flk_cb_when_t, void *), void *,
flk_callback_t *);
+void flk_del_callback(flk_callback_t *);
callb_cpr_t *flk_invoke_callbacks(flk_callback_t *, flk_cb_when_t);
/* Zones hooks */