blob: 2aa276220068f2812bf098271f364bf534b26689 [file] [log] [blame]
/*
* Copyright (C) 2015 Samsung Electronics, Inc.
*
* This software is licensed under the terms of the GNU General Public
* License version 2, as published by the Free Software Foundation, and
* may be copied, distributed, and modified under those terms.
*
* 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 for more details.
*/
#include <linux/gfp.h>
#include <linux/spinlock.h>
#include "sysdep.h"
int sysdep_idr_alloc(struct idr *idr, void *mem)
{
int res;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
res = idr_alloc(idr, mem, 1, 0, GFP_KERNEL);
#else
int tmp_id;
do {
if (!idr_pre_get(idr, GFP_KERNEL)) {
res = -ENOMEM;
break;
}
/* Reserving zero value helps with special case handling elsewhere */
res = idr_get_new_above(idr, mem, 1, &tmp_id);
if (res != -EAGAIN)
break;
} while (1);
/* Simulate behaviour of new version */
res = res ? -ENOMEM : tmp_id;
#endif
return res;
}