浏览代码

[PATCH] Document idr_get_new_above() semantics, update inotify

There is an off by one problem with idr_get_new_above.

The comment and function name suggest that it will return an id >
starting_id, but it actually returned an id >= starting_id, and kernel
callers other than inotify treated it as such.

The patch below fixes the comment, and fixes inotifys usage.  The
function name still doesn't match the behaviour, but it never did.

Signed-off-by: John McCutchan <ttb@tentacle.dhs.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
John McCutchan 19 年之前
父节点
当前提交
7c657f2f25
共有 2 个文件被更改,包括 2 次插入2 次删除
  1. 1 1
      fs/inotify.c
  2. 1 1
      lib/idr.c

+ 1 - 1
fs/inotify.c

@@ -353,7 +353,7 @@ static int inotify_dev_get_wd(struct inotify_device *dev,
 	do {
 	do {
 		if (unlikely(!idr_pre_get(&dev->idr, GFP_KERNEL)))
 		if (unlikely(!idr_pre_get(&dev->idr, GFP_KERNEL)))
 			return -ENOSPC;
 			return -ENOSPC;
-		ret = idr_get_new_above(&dev->idr, watch, dev->last_wd, &watch->wd);
+		ret = idr_get_new_above(&dev->idr, watch, dev->last_wd+1, &watch->wd);
 	} while (ret == -EAGAIN);
 	} while (ret == -EAGAIN);
 
 
 	return ret;
 	return ret;

+ 1 - 1
lib/idr.c

@@ -207,7 +207,7 @@ build_up:
 }
 }
 
 
 /**
 /**
- * idr_get_new_above - allocate new idr entry above a start id
+ * idr_get_new_above - allocate new idr entry above or equal to a start id
  * @idp: idr handle
  * @idp: idr handle
  * @ptr: pointer you want associated with the ide
  * @ptr: pointer you want associated with the ide
  * @start_id: id to start search at
  * @start_id: id to start search at