diff options
author | Marcel Telka <marcel@telka.sk> | 2016-12-16 17:13:25 +0100 |
---|---|---|
committer | Dan McDonald <danmcd@omniti.com> | 2016-12-20 10:51:23 -0500 |
commit | 668487358738f1513a74ebbb1b8cda03947984c1 (patch) | |
tree | c9a0df1d3d1dbda30b1f24096cd035127ec43a46 /usr/src | |
parent | 540b2cc7a3cce4677bb918fec08d34cfd5f8c545 (diff) | |
download | illumos-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.c | 108 | ||||
-rw-r--r-- | usr/src/uts/common/os/flock.c | 56 | ||||
-rw-r--r-- | usr/src/uts/common/sys/flock.h | 1 |
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 */ |