ipc: replace costly bailout check in sysvipc_find_ipc()
[sfrench/cifs-2.6.git] / ipc / util.c
index 0027e47626b7bbc582c964af5e9bd02887218fb3..d48d8cfa1f3fa3d37dd190d38211f69b5c00e4eb 100644 (file)
@@ -788,21 +788,13 @@ struct pid_namespace *ipc_seq_pid_ns(struct seq_file *s)
 static struct kern_ipc_perm *sysvipc_find_ipc(struct ipc_ids *ids, loff_t pos,
                                              loff_t *new_pos)
 {
-       struct kern_ipc_perm *ipc;
-       int total, id;
-
-       total = 0;
-       for (id = 0; id < pos && total < ids->in_use; id++) {
-               ipc = idr_find(&ids->ipcs_idr, id);
-               if (ipc != NULL)
-                       total++;
-       }
+       struct kern_ipc_perm *ipc = NULL;
+       int max_idx = ipc_get_maxidx(ids);
 
-       ipc = NULL;
-       if (total >= ids->in_use)
+       if (max_idx == -1 || pos > max_idx)
                goto out;
 
-       for (; pos < ipc_mni; pos++) {
+       for (; pos <= max_idx; pos++) {
                ipc = idr_find(&ids->ipcs_idr, pos);
                if (ipc != NULL) {
                        rcu_read_lock();