OSDN Git Service

bpf: error handling when map_lookup_elem isn't supported
authorPrashant Bhole <bhole_prashant_q7@lab.ntt.co.jp>
Tue, 9 Oct 2018 01:04:49 +0000 (10:04 +0900)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 10 Oct 2018 04:52:20 +0000 (21:52 -0700)
The error value returned by map_lookup_elem doesn't differentiate
whether lookup was failed because of invalid key or lookup is not
supported.

Lets add handling for -EOPNOTSUPP return value of map_lookup_elem()
method of map, with expectation from map's implementation that it
should return -EOPNOTSUPP if lookup is not supported.

The errno for bpf syscall for BPF_MAP_LOOKUP_ELEM command will be set
to EOPNOTSUPP if map lookup is not supported.

Signed-off-by: Prashant Bhole <bhole_prashant_q7@lab.ntt.co.jp>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Song Liu <songliubraving@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/syscall.c

index 5742df2..4f41623 100644 (file)
@@ -719,10 +719,15 @@ static int map_lookup_elem(union bpf_attr *attr)
        } else {
                rcu_read_lock();
                ptr = map->ops->map_lookup_elem(map, key);
-               if (ptr)
+               if (IS_ERR(ptr)) {
+                       err = PTR_ERR(ptr);
+               } else if (!ptr) {
+                       err = -ENOENT;
+               } else {
+                       err = 0;
                        memcpy(value, ptr, value_size);
+               }
                rcu_read_unlock();
-               err = ptr ? 0 : -ENOENT;
        }
 
        if (err)