/*
 * GPL HEADER START
 *
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 only,
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License version 2 for more details (a copy is included
 * in the LICENSE file that accompanied this code).
 *
 * You should have received a copy of the GNU General Public License
 * version 2 along with this program; If not, see
 * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 *
 * GPL HEADER END
 */
/*
 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
 * Use is subject to license terms.
 *
 * Copyright (c) 2011, 2012, Intel Corporation.
 */
/*
 * This file is part of Lustre, http://www.lustre.org/
 * Lustre is a trademark of Sun Microsystems, Inc.
 */

#ifndef __LINUX_OBD_H
#define __LINUX_OBD_H

#ifndef __OBD_H
#error Do not #include this file directly. #include <obd.h> instead
#endif

#include "../obd_support.h"

#include <linux/fs.h>
#include <linux/list.h>
#include <linux/sched.h>  /* for struct task_struct, for current.h */
#include <linux/mount.h>

#include "../lustre_intent.h"

struct ll_iattr {
	struct iattr	iattr;
	unsigned int	ia_attr_flags;
};

#define CLIENT_OBD_LIST_LOCK_DEBUG 1

typedef struct {
	spinlock_t		lock;

	unsigned long       time;
	struct task_struct *task;
	const char	 *func;
	int		 line;
} client_obd_lock_t;

static inline void __client_obd_list_lock(client_obd_lock_t *lock,
					  const char *func, int line)
{
	unsigned long cur = jiffies;

	while (1) {
		if (spin_trylock(&lock->lock)) {
			LASSERT(lock->task == NULL);
			lock->task = current;
			lock->func = func;
			lock->line = line;
			lock->time = jiffies;
			break;
		}

		if (time_before(cur + 5 * HZ, jiffies) &&
		    time_before(lock->time + 5 * HZ, jiffies)) {
			struct task_struct *task = lock->task;

			if (task == NULL)
				continue;

			LCONSOLE_WARN("%s:%d: lock %p was acquired by <%s:%d:%s:%d> for %lu seconds.\n",
				      current->comm, current->pid,
				      lock, task->comm, task->pid,
				      lock->func, lock->line,
				      (jiffies - lock->time) / HZ);
			LCONSOLE_WARN("====== for current process =====\n");
			dump_stack();
			LCONSOLE_WARN("====== end =======\n");
			set_current_state(TASK_UNINTERRUPTIBLE);
			schedule_timeout(1000 * HZ);
		}
		cpu_relax();
	}
}

#define client_obd_list_lock(lock) \
	__client_obd_list_lock(lock, __func__, __LINE__)

static inline void client_obd_list_unlock(client_obd_lock_t *lock)
{
	LASSERT(lock->task != NULL);
	lock->task = NULL;
	lock->time = jiffies;
	spin_unlock(&lock->lock);
}

static inline void client_obd_list_lock_init(client_obd_lock_t *lock)
{
	spin_lock_init(&lock->lock);
}

static inline void client_obd_list_lock_done(client_obd_lock_t *lock)
{}

#endif /* __LINUX_OBD_H */
