4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 only,
8 * as published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License version 2 for more details (a copy is included
14 * in the LICENSE file that accompanied this code).
16 * You should have received a copy of the GNU General Public License
17 * version 2 along with this program; If not, see
18 * http://www.gnu.org/licenses/gpl-2.0.html
23 * Range lock is used to allow multiple threads writing a single shared
24 * file given each thread is writing to a non-overlapping portion of the
27 * Refer to the possible upstream kernel version of range lock by
28 * Jan Kara <jack@suse.cz>: https://lkml.org/lkml/2013/1/31/480
30 * This file could later replaced by the upstream kernel version.
33 * Author: Prakash Surya <surya1@llnl.gov>
34 * Author: Bobi Jam <bobijam.xu@intel.com>
39 #include <libcfs/libcfs.h>
41 #define RL_FMT "[%llu, %llu]"
42 #define RL_PARA(range) \
43 (unsigned long long)(range)->rl_start, \
44 (unsigned long long)(range)->rl_end
52 * Process to enqueue this lock.
54 struct task_struct *rl_task;
56 * Number of ranges which are blocking acquisition of the lock
58 unsigned int rl_blocking_ranges;
60 * Sequence number of range lock. This number is used to get to know
61 * the order the locks are queued. One lock can only block another
62 * if it has a higher rl_sequence.
67 struct range_lock_tree {
68 struct interval_tree_root rlt_root;
73 void range_lock_tree_init(struct range_lock_tree *tree);
74 void range_lock_init(struct range_lock *lock, __u64 start, __u64 end);
75 int range_lock(struct range_lock_tree *tree, struct range_lock *lock);
76 void range_unlock(struct range_lock_tree *tree, struct range_lock *lock);