From a08530a24e188ad05024916a92aa46d1f3a6a10f Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Wed, 23 Aug 2017 15:55:12 -0700 Subject: [PATCH] scoutfs: add LKF_TRYLOCK Add a flag that tells locking to return -EAGAIN if it hits contention. Signed-off-by: Zach Brown --- kmod/src/lock.c | 17 +++++++++++------ kmod/src/lock.h | 1 + 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/kmod/src/lock.c b/kmod/src/lock.c index 6b0dd76c..4dc1b254 100644 --- a/kmod/src/lock.c +++ b/kmod/src/lock.c @@ -401,7 +401,7 @@ static int lock_blocking(struct lock_info *linfo, struct scoutfs_lock *lock) * The caller provides the opaque lock structure used for storage and * their start and end pointers will be accessed while the lock is held. */ -static int lock_name_keys(struct super_block *sb, int mode, +static int lock_name_keys(struct super_block *sb, int mode, int flags, struct scoutfs_lock_name *lock_name, struct ocfs2_lock_res_ops *type, struct scoutfs_key_buf *start, @@ -410,6 +410,7 @@ static int lock_name_keys(struct super_block *sb, int mode, { DECLARE_LOCK_INFO(sb, linfo); struct scoutfs_lock *lock; + int lkm_flags; int ret; lock = find_alloc_scoutfs_lock(sb, lock_name, type, start, end); @@ -418,8 +419,12 @@ static int lock_name_keys(struct super_block *sb, int mode, trace_scoutfs_lock_resource(sb, lock); + lkm_flags = DLM_LKF_NOORDER; + if (flags & SCOUTFS_LKF_TRYLOCK) + lkm_flags |= DLM_LKF_NOQUEUE; /* maybe also NONBLOCK? */ + ret = ocfs2_cluster_lock(&linfo->dlmglue, &lock->lockres, mode, - DLM_LKF_NOORDER, 0); + lkm_flags, 0); if (ret) return ret; @@ -510,8 +515,8 @@ int scoutfs_lock_ino(struct super_block *sb, int mode, int flags, u64 ino, end_ikey.type = ~0; scoutfs_key_init(&end, &end_ikey, sizeof(end_ikey)); - return lock_name_keys(sb, mode, &lock_name, &scoufs_ino_lops, &start, - &end, ret_lock); + return lock_name_keys(sb, mode, flags, &lock_name, &scoufs_ino_lops, + &start, &end, ret_lock); } /* @@ -604,8 +609,8 @@ int scoutfs_lock_inode_index(struct super_block *sb, int mode, end_ikey.ino = cpu_to_be64(ino | ino_mask); scoutfs_key_init(&end, &end_ikey, sizeof(end_ikey)); - return lock_name_keys(sb, mode, &lock_name, &scoufs_ino_index_lops, - &start, &end, ret_lock); + return lock_name_keys(sb, mode, 0, &lock_name, + &scoufs_ino_index_lops, &start, &end, ret_lock); } void scoutfs_unlock(struct super_block *sb, struct scoutfs_lock *lock, diff --git a/kmod/src/lock.h b/kmod/src/lock.h index aa3a9ff0..28be1794 100644 --- a/kmod/src/lock.h +++ b/kmod/src/lock.h @@ -9,6 +9,7 @@ #define SCOUTFS_LOCK_QUEUED 0x02 /* Put on drop workqueue */ #define SCOUTFS_LKF_REFRESH_INODE 0x01 /* update stale inode from item */ +#define SCOUTFS_LKF_TRYLOCK 0x02 /* EAGAIN if contention */ struct scoutfs_lock { struct super_block *sb;