* Author: Prakash Surya <surya1@llnl.gov>
* Author: Bobi Jam <bobijam.xu@intel.com>
*/
+#ifdef HAVE_SCHED_HEADERS
+#include <linux/sched/signal.h>
+#endif
#include "range_lock.h"
-#include <lustre/lustre_user.h>
+#include <uapi/linux/lustre/lustre_user.h>
/**
* Initialize a range lock tree
* Pre: Caller should have allocated the range lock node.
* Post: The range lock node is meant to cover [start, end] region
*/
-void range_lock_init(struct range_lock *lock, __u64 start, __u64 end)
+int range_lock_init(struct range_lock *lock, __u64 start, __u64 end)
{
+ int rc;
+
interval_init(&lock->rl_node);
if (end != LUSTRE_EOF)
end >>= PAGE_SHIFT;
- interval_set(&lock->rl_node, start >> PAGE_SHIFT, end);
+ rc = interval_set(&lock->rl_node, start >> PAGE_SHIFT, end);
+ if (rc)
+ return rc;
+
INIT_LIST_HEAD(&lock->rl_next_lock);
lock->rl_task = NULL;
lock->rl_lock_count = 0;
lock->rl_blocking_ranges = 0;
lock->rl_sequence = 0;
+ return rc;
}
static inline struct range_lock *next_lock(struct range_lock *lock)
* overlapping range node
* \retval INTERVAL_ITER_STOP indicate to stop the search
*/
-enum interval_iter range_unlock_cb(struct interval_node *node, void *arg)
+static enum interval_iter range_unlock_cb(struct interval_node *node, void *arg)
{
struct range_lock *lock = arg;
struct range_lock *overlap = node2rangelock(node);
* overlapping range node
* \retval INTERVAL_ITER_STOP indicate to stop the search
*/
-enum interval_iter range_lock_cb(struct interval_node *node, void *arg)
+static enum interval_iter range_lock_cb(struct interval_node *node, void *arg)
{
struct range_lock *lock = (struct range_lock *)arg;
struct range_lock *overlap = node2rangelock(node);
if (signal_pending(current)) {
range_unlock(tree, lock);
- GOTO(out, rc = -EINTR);
+ GOTO(out, rc = -ERESTARTSYS);
}
spin_lock(&tree->rlt_lock);
}