Re: [RFC PATCH 05/13] futex2: Add compatibility entry point for x86_x32 ABI
by kernel test robot
Hi "André,
[FYI, it's a private test report for your RFC patch.]
[auto build test WARNING on tip/locking/core]
[also build test WARNING on tip/x86/asm arm64/for-next/core tip/perf/core linus/master v5.11]
[cannot apply to next-20210216]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Andr-Almeida/Add-futex2-syscalls...
base: https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git 3765d01bab73bdb920ef711203978f02cd26e4da
config: x86_64-randconfig-s022-20210215 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
reproduce:
# apt-get install sparse
# sparse version: v0.6.3-215-g0fb77bb6-dirty
# https://github.com/0day-ci/linux/commit/e6093387f473950baee3fada6d63ff846...
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Andr-Almeida/Add-futex2-syscalls/20210215-233004
git checkout e6093387f473950baee3fada6d63ff84621c5463
# save the attached .config to linux build tree
make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=x86_64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp(a)intel.com>
"sparse warnings: (new ones prefixed by >>)"
kernel/futex2.c:111:21: sparse: sparse: symbol 'futex_table' was not declared. Should it be static?
kernel/futex2.c:112:14: sparse: sparse: symbol 'futex2_hashsize' was not declared. Should it be static?
kernel/futex2.c:358:13: sparse: sparse: incorrect type in argument 1 (different base types) @@ expected void const volatile [noderef] __user *ptr @@ got unsigned long [usertype] address @@
kernel/futex2.c:358:13: sparse: expected void const volatile [noderef] __user *ptr
kernel/futex2.c:358:13: sparse: got unsigned long [usertype] address
kernel/futex2.c:517:51: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void [noderef] __user *uaddr @@ got void * @@
kernel/futex2.c:517:51: sparse: expected void [noderef] __user *uaddr
kernel/futex2.c:517:51: sparse: got void *
kernel/futex2.c:532:45: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected unsigned int [noderef] [usertype] __user *uaddr @@ got unsigned int [usertype] *[assigned] uaddr @@
kernel/futex2.c:532:45: sparse: expected unsigned int [noderef] [usertype] __user *uaddr
kernel/futex2.c:532:45: sparse: got unsigned int [usertype] *[assigned] uaddr
kernel/futex2.c:541:29: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __user *ptr @@ got unsigned int [usertype] *[assigned] uaddr @@
kernel/futex2.c:541:29: sparse: expected void const volatile [noderef] __user *ptr
kernel/futex2.c:541:29: sparse: got unsigned int [usertype] *[assigned] uaddr
kernel/futex2.c:828:48: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void [noderef] __user *uaddr @@ got void *[addressable] uaddr @@
kernel/futex2.c:828:48: sparse: expected void [noderef] __user *uaddr
kernel/futex2.c:828:48: sparse: got void *[addressable] uaddr
kernel/futex2.c:1115:19: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected void *uaddr @@ got void [noderef] __user * @@
kernel/futex2.c:1115:19: sparse: expected void *uaddr
kernel/futex2.c:1115:19: sparse: got void [noderef] __user *
>> kernel/futex2.c:884:57: sparse: sparse: cast removes address space '__user' of expression
>> kernel/futex2.c:884:57: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected struct compat_futex_waitv [noderef] __user *uwaitv @@ got struct compat_futex_waitv * @@
kernel/futex2.c:884:57: sparse: expected struct compat_futex_waitv [noderef] __user *uwaitv
kernel/futex2.c:884:57: sparse: got struct compat_futex_waitv *
kernel/futex2.c:993:13: sparse: sparse: context imbalance in 'futex_double_unlock' - unexpected unlock
kernel/futex2.c:1012:34: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void [noderef] __user *uaddr @@ got void *uaddr @@
kernel/futex2.c:1012:34: sparse: expected void [noderef] __user *uaddr
kernel/futex2.c:1012:34: sparse: got void *uaddr
kernel/futex2.c:1016:34: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void [noderef] __user *uaddr @@ got void *uaddr @@
kernel/futex2.c:1016:34: sparse: expected void [noderef] __user *uaddr
kernel/futex2.c:1016:34: sparse: got void *uaddr
kernel/futex2.c:1022:42: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void [noderef] __user *uaddr @@ got void *uaddr @@
kernel/futex2.c:1022:42: sparse: expected void [noderef] __user *uaddr
kernel/futex2.c:1022:42: sparse: got void *uaddr
kernel/futex2.c:1028:42: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void [noderef] __user *uaddr @@ got void *uaddr @@
kernel/futex2.c:1028:42: sparse: expected void [noderef] __user *uaddr
kernel/futex2.c:1028:42: sparse: got void *uaddr
kernel/futex2.c:1047:40: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected unsigned int [noderef] [usertype] __user *uaddr @@ got void *uaddr @@
kernel/futex2.c:1047:40: sparse: expected unsigned int [noderef] [usertype] __user *uaddr
kernel/futex2.c:1047:40: sparse: got void *uaddr
kernel/futex2.c:1051:21: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __user *ptr @@ got unsigned int [usertype] *[noderef] __user @@
kernel/futex2.c:1051:21: sparse: expected void const volatile [noderef] __user *ptr
kernel/futex2.c:1051:21: sparse: got unsigned int [usertype] *[noderef] __user
kernel/futex2.c:1000:19: sparse: sparse: context imbalance in '__se_compat_sys_futex_requeue' - different lock contexts for basic block
kernel/futex2.c:1199:57: sparse: sparse: cast removes address space '__user' of expression
>> kernel/futex2.c:1199:57: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected struct compat_futex_requeue [noderef] __user *uaddr @@ got struct compat_futex_requeue * @@
kernel/futex2.c:1199:57: sparse: expected struct compat_futex_requeue [noderef] __user *uaddr
kernel/futex2.c:1199:57: sparse: got struct compat_futex_requeue *
kernel/futex2.c:1204:57: sparse: sparse: cast removes address space '__user' of expression
kernel/futex2.c:1204:57: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected struct compat_futex_requeue [noderef] __user *uaddr @@ got struct compat_futex_requeue * @@
kernel/futex2.c:1204:57: sparse: expected struct compat_futex_requeue [noderef] __user *uaddr
kernel/futex2.c:1204:57: sparse: got struct compat_futex_requeue *
kernel/futex2.c:1012:34: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void [noderef] __user *uaddr @@ got void *uaddr @@
kernel/futex2.c:1012:34: sparse: expected void [noderef] __user *uaddr
kernel/futex2.c:1012:34: sparse: got void *uaddr
kernel/futex2.c:1016:34: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void [noderef] __user *uaddr @@ got void *uaddr @@
kernel/futex2.c:1016:34: sparse: expected void [noderef] __user *uaddr
kernel/futex2.c:1016:34: sparse: got void *uaddr
kernel/futex2.c:1022:42: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void [noderef] __user *uaddr @@ got void *uaddr @@
kernel/futex2.c:1022:42: sparse: expected void [noderef] __user *uaddr
kernel/futex2.c:1022:42: sparse: got void *uaddr
kernel/futex2.c:1028:42: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void [noderef] __user *uaddr @@ got void *uaddr @@
kernel/futex2.c:1028:42: sparse: expected void [noderef] __user *uaddr
kernel/futex2.c:1028:42: sparse: got void *uaddr
kernel/futex2.c:1047:40: sparse: sparse: incorrect type in argument 2 (different address spaces) @@ expected unsigned int [noderef] [usertype] __user *uaddr @@ got void *uaddr @@
kernel/futex2.c:1047:40: sparse: expected unsigned int [noderef] [usertype] __user *uaddr
kernel/futex2.c:1047:40: sparse: got void *uaddr
kernel/futex2.c:1051:21: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __user *ptr @@ got unsigned int [usertype] *[noderef] __user @@
kernel/futex2.c:1051:21: sparse: expected void const volatile [noderef] __user *ptr
kernel/futex2.c:1051:21: sparse: got unsigned int [usertype] *[noderef] __user
kernel/futex2.c:1000:19: sparse: sparse: context imbalance in '__se_sys_futex_requeue' - different lock contexts for basic block
vim +/__user +884 kernel/futex2.c
841
842 /**
843 * sys_futex_waitv - Wait on a list of futexes
844 * @waiters: List of futexes to wait on
845 * @nr_futexes: Length of futexv
846 * @flags: Flag for timeout (monotonic/realtime)
847 * @timo: Optional absolute timeout.
848 *
849 * Given an array of `struct futex_waitv`, wait on each uaddr. The thread wakes
850 * if a futex_wake() is performed at any uaddr. The syscall returns immediately
851 * if any waiter has *uaddr != val. *timo is an optional timeout value for the
852 * operation. Each waiter has individual flags. The `flags` argument for the
853 * syscall should be used solely for specifying the timeout as realtime, if
854 * needed. Flags for shared futexes, sizes, etc. should be used on the
855 * individual flags of each waiter.
856 *
857 * Returns the array index of one of the awaken futexes. There's no given
858 * information of how many were awakened, or any particular attribute of it (if
859 * it's the first awakened, if it is of the smaller index...).
860 */
861 SYSCALL_DEFINE4(futex_waitv, struct futex_waitv __user *, waiters,
862 unsigned int, nr_futexes, unsigned int, flags,
863 struct __kernel_timespec __user *, timo)
864 {
865 struct futexv_head *futexv;
866 int ret;
867
868 if (flags & ~FUTEXV_MASK)
869 return -EINVAL;
870
871 if (!nr_futexes || nr_futexes > FUTEX_WAITV_MAX || !waiters)
872 return -EINVAL;
873
874 futexv = kmalloc((sizeof(struct futex_waiter) * nr_futexes) +
875 sizeof(*futexv), GFP_KERNEL);
876 if (!futexv)
877 return -ENOMEM;
878
879 futexv->hint = false;
880 futexv->task = current;
881
882 #ifdef CONFIG_X86_X32_ABI
883 if (in_x32_syscall()) {
> 884 ret = compat_futex_parse_waitv(futexv, (struct compat_futex_waitv *)waiters,
885 nr_futexes);
886 } else
887 #endif
888 {
889 ret = futex_parse_waitv(futexv, waiters, nr_futexes);
890 }
891
892 if (!ret)
893 ret = futex_set_timer_and_wait(futexv, nr_futexes, timo, flags);
894
895 kfree(futexv);
896
897 return ret;
898 }
899
900 /**
901 * futex_get_parent - For a given futex in a futexv list, get a pointer to the futexv
902 * @waiter: Address of futex in the list
903 * @index: Index of futex in the list
904 *
905 * Return: A pointer to its futexv struct
906 */
907 static inline struct futexv_head *futex_get_parent(uintptr_t waiter,
908 unsigned int index)
909 {
910 uintptr_t parent = waiter - sizeof(struct futexv_head)
911 - (uintptr_t)(index * sizeof(struct futex_waiter));
912
913 return (struct futexv_head *)parent;
914 }
915
916 /**
917 * futex_mark_wake - Find the task to be wake and add it in wake queue
918 * @waiter: Waiter to be wake
919 * @bucket: Bucket to be decremented
920 * @wake_q: Wake queue to insert the task
921 */
922 static void futex_mark_wake(struct futex_waiter *waiter,
923 struct futex_bucket *bucket,
924 struct wake_q_head *wake_q)
925 {
926 struct task_struct *task;
927 struct futexv_head *parent = futex_get_parent((uintptr_t)waiter,
928 waiter->index);
929
930 parent->hint = true;
931 task = parent->task;
932 get_task_struct(task);
933 list_del_init_careful(&waiter->list);
934 wake_q_add_safe(wake_q, task);
935 bucket_dec_waiters(bucket);
936 }
937
938 static inline bool futex_match(struct futex_key key1, struct futex_key key2)
939 {
940 return (key1.index == key2.index &&
941 key1.pointer == key2.pointer &&
942 key1.offset == key2.offset);
943 }
944
945 /**
946 * sys_futex_wake - Wake a number of futexes waiting on an address
947 * @uaddr: Address of futex to be woken up
948 * @nr_wake: Number of futexes waiting in uaddr to be woken up
949 * @flags: Flags for size and shared
950 *
951 * Wake `nr_wake` threads waiting at uaddr.
952 *
953 * Returns the number of woken threads on success, error code otherwise.
954 */
955 SYSCALL_DEFINE3(futex_wake, void __user *, uaddr, unsigned int, nr_wake,
956 unsigned int, flags)
957 {
958 bool shared = (flags & FUTEX_SHARED_FLAG) ? true : false;
959 unsigned int size = flags & FUTEX_SIZE_MASK;
960 struct futex_waiter waiter, *aux, *tmp;
961 struct futex_bucket *bucket;
962 DEFINE_WAKE_Q(wake_q);
963 int ret = 0;
964
965 if (flags & ~FUTEX2_MASK)
966 return -EINVAL;
967
968 if (size != FUTEX_32)
969 return -EINVAL;
970
971 bucket = futex_get_bucket(uaddr, &waiter.key, shared);
972 if (IS_ERR(bucket))
973 return PTR_ERR(bucket);
974
975 if (!bucket_get_waiters(bucket) || !nr_wake)
976 return 0;
977
978 spin_lock(&bucket->lock);
979 list_for_each_entry_safe(aux, tmp, &bucket->list, list) {
980 if (futex_match(waiter.key, aux->key)) {
981 futex_mark_wake(aux, bucket, &wake_q);
982 if (++ret >= nr_wake)
983 break;
984 }
985 }
986 spin_unlock(&bucket->lock);
987
988 wake_up_q(&wake_q);
989
990 return ret;
991 }
992
993 static void futex_double_unlock(struct futex_bucket *b1, struct futex_bucket *b2)
994 {
995 spin_unlock(&b1->lock);
996 if (b1 != b2)
997 spin_unlock(&b2->lock);
998 }
999
1000 static inline int __futex_requeue(struct futex_requeue rq1,
1001 struct futex_requeue rq2, unsigned int nr_wake,
1002 unsigned int nr_requeue, unsigned int cmpval,
1003 bool shared1, bool shared2)
1004 {
1005 struct futex_waiter w1, w2, *aux, *tmp;
1006 bool retry = false;
1007 struct futex_bucket *b1, *b2;
1008 DEFINE_WAKE_Q(wake_q);
1009 u32 uval;
1010 int ret;
1011
1012 b1 = futex_get_bucket(rq1.uaddr, &w1.key, shared1);
1013 if (IS_ERR(b1))
1014 return PTR_ERR(b1);
1015
1016 b2 = futex_get_bucket(rq2.uaddr, &w2.key, shared2);
1017 if (IS_ERR(b2))
1018 return PTR_ERR(b2);
1019
1020 retry:
1021 if (shared1 && retry) {
1022 b1 = futex_get_bucket(rq1.uaddr, &w1.key, shared1);
1023 if (IS_ERR(b1))
1024 return PTR_ERR(b1);
1025 }
1026
1027 if (shared2 && retry) {
> 1028 b2 = futex_get_bucket(rq2.uaddr, &w2.key, shared2);
1029 if (IS_ERR(b2))
1030 return PTR_ERR(b2);
1031 }
1032
1033 bucket_inc_waiters(b2);
1034 /*
1035 * To ensure the locks are taken in the same order for all threads (and
1036 * thus avoiding deadlocks), take the "smaller" one first
1037 */
1038 if (b1 <= b2) {
1039 spin_lock(&b1->lock);
1040 if (b1 < b2)
1041 spin_lock_nested(&b2->lock, SINGLE_DEPTH_NESTING);
1042 } else {
1043 spin_lock(&b2->lock);
1044 spin_lock_nested(&b1->lock, SINGLE_DEPTH_NESTING);
1045 }
1046
1047 ret = futex_get_user(&uval, rq1.uaddr);
1048
1049 if (unlikely(ret)) {
1050 futex_double_unlock(b1, b2);
1051 if (__get_user(uval, (u32 * __user)rq1.uaddr))
1052 return -EFAULT;
1053
1054 bucket_dec_waiters(b2);
1055 retry = true;
1056 goto retry;
1057 }
1058
1059 if (uval != cmpval) {
1060 futex_double_unlock(b1, b2);
1061
1062 bucket_dec_waiters(b2);
1063 return -EAGAIN;
1064 }
1065
1066 list_for_each_entry_safe(aux, tmp, &b1->list, list) {
1067 if (futex_match(w1.key, aux->key)) {
1068 if (ret < nr_wake) {
1069 futex_mark_wake(aux, b1, &wake_q);
1070 ret++;
1071 continue;
1072 }
1073
1074 if (ret >= nr_wake + nr_requeue)
1075 break;
1076
1077 aux->key.pointer = w2.key.pointer;
1078 aux->key.index = w2.key.index;
1079 aux->key.offset = w2.key.offset;
1080
1081 if (b1 != b2) {
1082 list_del_init_careful(&aux->list);
1083 bucket_dec_waiters(b1);
1084
1085 list_add_tail(&aux->list, &b2->list);
1086 bucket_inc_waiters(b2);
1087 }
1088 ret++;
1089 }
1090 }
1091
1092 futex_double_unlock(b1, b2);
1093 wake_up_q(&wake_q);
1094 bucket_dec_waiters(b2);
1095
1096 return ret;
1097 }
1098
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
1 year, 7 months
Re: [rdma-rdma:wip/jgg-for-next 198/203] drivers/infiniband/ulp/rtrs/rtrs-srv.c:1805 rtrs_rdma_connect() warn: passing zero to 'PTR_ERR'
by Dan Carpenter
On Mon, Feb 15, 2021 at 02:03:31PM +0100, Jinpu Wang wrote:
> Hi, Dan,
>
> On Mon, Feb 15, 2021 at 1:44 PM Dan Carpenter <dan.carpenter(a)oracle.com> wrote:
> >
> > tree: https://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma.git wip/jgg-for-next
> > head: c88b31c46cefe50f524a1ad3deaf1599bc9ee2e6
> > commit: f0751419d3a15fb06d9b7d9435312472c3cb122d [198/203] RDMA/rtrs: Only allow addition of path to an already established session
> > config: ia64-randconfig-m031-20210209 (attached as .config)
> > compiler: ia64-linux-gcc (GCC) 9.3.0
> >
> > If you fix the issue, kindly add following tag as appropriate
> > Reported-by: kernel test robot <lkp(a)intel.com>
> > Reported-by: Dan Carpenter <dan.carpenter(a)oracle.com>
> >
> > smatch warnings:
> > drivers/infiniband/ulp/rtrs/rtrs-srv.c:1805 rtrs_rdma_connect() warn: passing zero to 'PTR_ERR'
> >
> > vim +/PTR_ERR +1805 drivers/infiniband/ulp/rtrs/rtrs-srv.c
> >
> > 9cb837480424e7 Jack Wang 2020-05-11 1760 static int rtrs_rdma_connect(struct rdma_cm_id *cm_id,
> > 9cb837480424e7 Jack Wang 2020-05-11 1761 const struct rtrs_msg_conn_req *msg,
> > 9cb837480424e7 Jack Wang 2020-05-11 1762 size_t len)
> > 9cb837480424e7 Jack Wang 2020-05-11 1763 {
> > 9cb837480424e7 Jack Wang 2020-05-11 1764 struct rtrs_srv_ctx *ctx = cm_id->context;
> > 9cb837480424e7 Jack Wang 2020-05-11 1765 struct rtrs_srv_sess *sess;
> > 9cb837480424e7 Jack Wang 2020-05-11 1766 struct rtrs_srv *srv;
> > 9cb837480424e7 Jack Wang 2020-05-11 1767
> > 9cb837480424e7 Jack Wang 2020-05-11 1768 u16 version, con_num, cid;
> > 9cb837480424e7 Jack Wang 2020-05-11 1769 u16 recon_cnt;
> > 9cb837480424e7 Jack Wang 2020-05-11 1770 int err;
> > 9cb837480424e7 Jack Wang 2020-05-11 1771
> > 9cb837480424e7 Jack Wang 2020-05-11 1772 if (len < sizeof(*msg)) {
> > 9cb837480424e7 Jack Wang 2020-05-11 1773 pr_err("Invalid RTRS connection request\n");
> > 9cb837480424e7 Jack Wang 2020-05-11 1774 goto reject_w_econnreset;
> > 9cb837480424e7 Jack Wang 2020-05-11 1775 }
> > 9cb837480424e7 Jack Wang 2020-05-11 1776 if (le16_to_cpu(msg->magic) != RTRS_MAGIC) {
> > 9cb837480424e7 Jack Wang 2020-05-11 1777 pr_err("Invalid RTRS magic\n");
> > 9cb837480424e7 Jack Wang 2020-05-11 1778 goto reject_w_econnreset;
> > 9cb837480424e7 Jack Wang 2020-05-11 1779 }
> > 9cb837480424e7 Jack Wang 2020-05-11 1780 version = le16_to_cpu(msg->version);
> > 9cb837480424e7 Jack Wang 2020-05-11 1781 if (version >> 8 != RTRS_PROTO_VER_MAJOR) {
> > 9cb837480424e7 Jack Wang 2020-05-11 1782 pr_err("Unsupported major RTRS version: %d, expected %d\n",
> > 9cb837480424e7 Jack Wang 2020-05-11 1783 version >> 8, RTRS_PROTO_VER_MAJOR);
> > 9cb837480424e7 Jack Wang 2020-05-11 1784 goto reject_w_econnreset;
> > 9cb837480424e7 Jack Wang 2020-05-11 1785 }
> > 9cb837480424e7 Jack Wang 2020-05-11 1786 con_num = le16_to_cpu(msg->cid_num);
> > 9cb837480424e7 Jack Wang 2020-05-11 1787 if (con_num > 4096) {
> > 9cb837480424e7 Jack Wang 2020-05-11 1788 /* Sanity check */
> > 9cb837480424e7 Jack Wang 2020-05-11 1789 pr_err("Too many connections requested: %d\n", con_num);
> > 9cb837480424e7 Jack Wang 2020-05-11 1790 goto reject_w_econnreset;
> > 9cb837480424e7 Jack Wang 2020-05-11 1791 }
> > 9cb837480424e7 Jack Wang 2020-05-11 1792 cid = le16_to_cpu(msg->cid);
> > 9cb837480424e7 Jack Wang 2020-05-11 1793 if (cid >= con_num) {
> > 9cb837480424e7 Jack Wang 2020-05-11 1794 /* Sanity check */
> > 9cb837480424e7 Jack Wang 2020-05-11 1795 pr_err("Incorrect cid: %d >= %d\n", cid, con_num);
> > 9cb837480424e7 Jack Wang 2020-05-11 1796 goto reject_w_econnreset;
> > 9cb837480424e7 Jack Wang 2020-05-11 1797 }
> > 9cb837480424e7 Jack Wang 2020-05-11 1798 recon_cnt = le16_to_cpu(msg->recon_cnt);
> > f0751419d3a15f Md Haris Iqbal 2021-02-12 1799 srv = get_or_create_srv(ctx, &msg->paths_uuid, msg->first_conn);
> > d715ff8acbd587 Guoqing Jiang 2020-10-23 1800 /*
> > d715ff8acbd587 Guoqing Jiang 2020-10-23 1801 * "refcount == 0" happens if a previous thread calls get_or_create_srv
> > d715ff8acbd587 Guoqing Jiang 2020-10-23 1802 * allocate srv, but chunks of srv are not allocated yet.
> > d715ff8acbd587 Guoqing Jiang 2020-10-23 1803 */
> > f0751419d3a15f Md Haris Iqbal 2021-02-12 1804 if (IS_ERR(srv) || refcount_read(&srv->refcount) == 0) {
> > f0751419d3a15f Md Haris Iqbal 2021-02-12 @1805 err = PTR_ERR(srv);
> >
> > It's not 100% clear to me that an error code is required when
> > refcount_read() is zero. Maybe "err = 0;" is okay in that situation?
> I don't see how srv can be zero
The cross function database was probably out of date.
regards,
dan carpenter
1 year, 7 months
[jpirko-mlxsw:net_next_queue 12/45] drivers/net/netdevsim/psample.c:97: undefined reference to `__umoddi3'
by kernel test robot
tree: https://github.com/jpirko/linux_mlxsw net_next_queue
head: 155708977245e88ae7b14ead8238a83ad007743d
commit: 4a9b9f5dbabac830cad950a4b25d218e2c515541 [12/45] netdevsim: Add dummy psample implementation
config: i386-randconfig-a015-20210216 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
reproduce (this is a W=1 build):
# https://github.com/jpirko/linux_mlxsw/commit/4a9b9f5dbabac830cad950a4b25d...
git remote add jpirko-mlxsw https://github.com/jpirko/linux_mlxsw
git fetch --no-tags jpirko-mlxsw net_next_queue
git checkout 4a9b9f5dbabac830cad950a4b25d218e2c515541
# save the attached .config to linux build tree
make W=1 ARCH=i386
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp(a)intel.com>
All errors (new ones prefixed by >>):
ld: drivers/net/netdevsim/psample.o: in function `nsim_dev_psample_md_prepare':
>> drivers/net/netdevsim/psample.c:97: undefined reference to `__umoddi3'
>> ld: drivers/net/netdevsim/psample.c:105: undefined reference to `__umoddi3'
vim +97 drivers/net/netdevsim/psample.c
80
81 static void nsim_dev_psample_md_prepare(const struct nsim_dev_psample *psample,
82 struct psample_metadata *md)
83 {
84 md->trunc_size = psample->trunc_size;
85 md->in_ifindex = psample->in_ifindex;
86 md->out_ifindex = psample->out_ifindex;
87
88 if (psample->out_tc != NSIM_PSAMPLE_INVALID_TC) {
89 md->out_tc = psample->out_tc;
90 md->out_tc_valid = 1;
91 }
92
93 if (psample->out_tc_occ_max) {
94 u64 out_tc_occ;
95
96 get_random_bytes(&out_tc_occ, sizeof(u64));
> 97 md->out_tc_occ = out_tc_occ % psample->out_tc_occ_max;
98 md->out_tc_occ_valid = 1;
99 }
100
101 if (psample->latency_max) {
102 u64 latency;
103
104 get_random_bytes(&latency, sizeof(u64));
> 105 md->latency = latency % psample->latency_max;
106 md->latency_valid = 1;
107 }
108 }
109
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
1 year, 7 months
[sashal-linux-stable:queue-4.19 19/27] net/netfilter/nf_tables_api.c:7395:3: error: 'struct pernet_operations' has no member named 'pre_exit'
by kernel test robot
tree: https://git.kernel.org/pub/scm/linux/kernel/git/sashal/linux-stable.git queue-4.19
head: 44e67a183b957910c92ce954ecf443dc9a5bad2d
commit: 142e293ce46a1c63cb167af6743e2b8abb6581df [19/27] netfilter: nftables: fix possible UAF over chains from packet path in netns
config: arm-randconfig-c004-20210215 (attached as .config)
compiler: arm-linux-gnueabi-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://git.kernel.org/pub/scm/linux/kernel/git/sashal/linux-stable.git/c...
git remote add sashal-linux-stable https://git.kernel.org/pub/scm/linux/kernel/git/sashal/linux-stable.git
git fetch --no-tags sashal-linux-stable queue-4.19
git checkout 142e293ce46a1c63cb167af6743e2b8abb6581df
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=arm
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp(a)intel.com>
All error/warnings (new ones prefixed by >>):
net/netfilter/nf_tables_api.c: In function 'nft_request_module':
net/netfilter/nf_tables_api.c:518:2: warning: function 'nft_request_module' might be a candidate for 'gnu_printf' format attribute [-Wsuggest-attribute=format]
518 | ret = vsnprintf(module_name, MODULE_NAME_LEN, fmt, args);
| ^~~
net/netfilter/nf_tables_api.c: At top level:
>> net/netfilter/nf_tables_api.c:7395:3: error: 'struct pernet_operations' has no member named 'pre_exit'
7395 | .pre_exit = nf_tables_pre_exit_net,
| ^~~~~~~~
>> net/netfilter/nf_tables_api.c:7396:11: warning: initialized field overwritten [-Woverride-init]
7396 | .exit = nf_tables_exit_net,
| ^~~~~~~~~~~~~~~~~~
net/netfilter/nf_tables_api.c:7396:11: note: (near initialization for 'nf_tables_net_ops.exit')
vim +7395 net/netfilter/nf_tables_api.c
7392
7393 static struct pernet_operations nf_tables_net_ops = {
7394 .init = nf_tables_init_net,
> 7395 .pre_exit = nf_tables_pre_exit_net,
> 7396 .exit = nf_tables_exit_net,
7397 };
7398
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
1 year, 7 months
[shenki:microwatt-5.11 16/17] drivers/net/ethernet/litex/litex_liteeth.c:350:18: warning: variable 'priv' set but not used
by kernel test robot
tree: https://github.com/shenki/linux microwatt-5.11
head: 752e38b97203f6617ac188ccf789c880947f58a5
commit: 04f15e4b7c4214c61eaff30bddcd659b0c466460 [16/17] net: Driver for LiteETH network interface
config: sh-allmodconfig (attached as .config)
compiler: sh4-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/shenki/linux/commit/04f15e4b7c4214c61eaff30bddcd659b0c...
git remote add shenki https://github.com/shenki/linux
git fetch --no-tags shenki microwatt-5.11
git checkout 04f15e4b7c4214c61eaff30bddcd659b0c466460
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=sh
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp(a)intel.com>
All warnings (new ones prefixed by >>):
drivers/net/ethernet/litex/litex_liteeth.c: In function 'liteeth_remove':
>> drivers/net/ethernet/litex/litex_liteeth.c:350:18: warning: variable 'priv' set but not used [-Wunused-but-set-variable]
350 | struct liteeth *priv;
| ^~~~
Kconfig warnings: (for reference only)
WARNING: unmet direct dependencies detected for SND_ATMEL_SOC_PDC
Depends on SOUND && !UML && SND && SND_SOC && SND_ATMEL_SOC && HAS_DMA
Selected by
- SND_ATMEL_SOC_SSC && SOUND && !UML && SND && SND_SOC && SND_ATMEL_SOC
- SND_ATMEL_SOC_SSC_PDC && SOUND && !UML && SND && SND_SOC && SND_ATMEL_SOC && ATMEL_SSC
vim +/priv +350 drivers/net/ethernet/litex/litex_liteeth.c
346
347 static int liteeth_remove(struct platform_device *pdev)
348 {
349 struct net_device *netdev;
> 350 struct liteeth *priv;
351
352 netdev = platform_get_drvdata(pdev);
353 priv = netdev_priv(netdev);
354
355 unregister_netdev(netdev);
356
357 free_netdev(netdev);
358
359 return 0;
360 }
361
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
1 year, 7 months
[driver-core:debugfs_remove_return_value 2/8] drivers/net/wireless/broadcom/b43legacy/debugfs.c:354:28: error: void value not ignored as it ought to be
by kernel test robot
tree: https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git debugfs_remove_return_value
head: 5187c2360ee1d023078e4302dad32fda1e895772
commit: 72f2bf74b31aae983fb200aa7e84a05943bf27fc [2/8] debugfs: remove return value of debugfs_create_bool()
config: i386-allyesconfig (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
reproduce (this is a W=1 build):
# https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git/co...
git remote add driver-core https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git
git fetch --no-tags driver-core debugfs_remove_return_value
git checkout 72f2bf74b31aae983fb200aa7e84a05943bf27fc
# save the attached .config to linux build tree
make W=1 ARCH=i386
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp(a)intel.com>
All errors (new ones prefixed by >>):
drivers/net/wireless/broadcom/b43legacy/debugfs.c: In function 'b43legacy_add_dynamic_debug':
>> drivers/net/wireless/broadcom/b43legacy/debugfs.c:354:28: error: void value not ignored as it ought to be
354 | e->dyn_debug_dentries[id] = \
| ^
drivers/net/wireless/broadcom/b43legacy/debugfs.c:359:2: note: in expansion of macro 'add_dyn_dbg'
359 | add_dyn_dbg("debug_xmitpower", B43legacy_DBG_XMITPOWER, false);
| ^~~~~~~~~~~
>> drivers/net/wireless/broadcom/b43legacy/debugfs.c:354:28: error: void value not ignored as it ought to be
354 | e->dyn_debug_dentries[id] = \
| ^
drivers/net/wireless/broadcom/b43legacy/debugfs.c:360:2: note: in expansion of macro 'add_dyn_dbg'
360 | add_dyn_dbg("debug_dmaoverflow", B43legacy_DBG_DMAOVERFLOW, false);
| ^~~~~~~~~~~
>> drivers/net/wireless/broadcom/b43legacy/debugfs.c:354:28: error: void value not ignored as it ought to be
354 | e->dyn_debug_dentries[id] = \
| ^
drivers/net/wireless/broadcom/b43legacy/debugfs.c:361:2: note: in expansion of macro 'add_dyn_dbg'
361 | add_dyn_dbg("debug_dmaverbose", B43legacy_DBG_DMAVERBOSE, false);
| ^~~~~~~~~~~
>> drivers/net/wireless/broadcom/b43legacy/debugfs.c:354:28: error: void value not ignored as it ought to be
354 | e->dyn_debug_dentries[id] = \
| ^
drivers/net/wireless/broadcom/b43legacy/debugfs.c:362:2: note: in expansion of macro 'add_dyn_dbg'
362 | add_dyn_dbg("debug_pwork_fast", B43legacy_DBG_PWORK_FAST, false);
| ^~~~~~~~~~~
>> drivers/net/wireless/broadcom/b43legacy/debugfs.c:354:28: error: void value not ignored as it ought to be
354 | e->dyn_debug_dentries[id] = \
| ^
drivers/net/wireless/broadcom/b43legacy/debugfs.c:363:2: note: in expansion of macro 'add_dyn_dbg'
363 | add_dyn_dbg("debug_pwork_stop", B43legacy_DBG_PWORK_STOP, false);
| ^~~~~~~~~~~
vim +354 drivers/net/wireless/broadcom/b43legacy/debugfs.c
75388acd0cd827 drivers/net/wireless/b43legacy/debugfs.c Larry Finger 2007-09-25 347
75388acd0cd827 drivers/net/wireless/b43legacy/debugfs.c Larry Finger 2007-09-25 348 static void b43legacy_add_dynamic_debug(struct b43legacy_wldev *dev)
75388acd0cd827 drivers/net/wireless/b43legacy/debugfs.c Larry Finger 2007-09-25 349 {
75388acd0cd827 drivers/net/wireless/b43legacy/debugfs.c Larry Finger 2007-09-25 350 struct b43legacy_dfsentry *e = dev->dfsentry;
75388acd0cd827 drivers/net/wireless/b43legacy/debugfs.c Larry Finger 2007-09-25 351
75388acd0cd827 drivers/net/wireless/b43legacy/debugfs.c Larry Finger 2007-09-25 352 #define add_dyn_dbg(name, id, initstate) do { \
75388acd0cd827 drivers/net/wireless/b43legacy/debugfs.c Larry Finger 2007-09-25 353 e->dyn_debug[id] = (initstate); \
32b4ebfe7f12c2 drivers/net/wireless/broadcom/b43legacy/debugfs.c Greg Kroah-Hartman 2019-01-22 @354 e->dyn_debug_dentries[id] = \
32b4ebfe7f12c2 drivers/net/wireless/broadcom/b43legacy/debugfs.c Greg Kroah-Hartman 2019-01-22 355 debugfs_create_bool(name, 0600, e->subdir, \
75388acd0cd827 drivers/net/wireless/b43legacy/debugfs.c Larry Finger 2007-09-25 356 &(e->dyn_debug[id])); \
75388acd0cd827 drivers/net/wireless/b43legacy/debugfs.c Larry Finger 2007-09-25 357 } while (0)
75388acd0cd827 drivers/net/wireless/b43legacy/debugfs.c Larry Finger 2007-09-25 358
621a5f7ad9cd1c drivers/net/wireless/b43legacy/debugfs.c Viresh Kumar 2015-09-26 359 add_dyn_dbg("debug_xmitpower", B43legacy_DBG_XMITPOWER, false);
621a5f7ad9cd1c drivers/net/wireless/b43legacy/debugfs.c Viresh Kumar 2015-09-26 360 add_dyn_dbg("debug_dmaoverflow", B43legacy_DBG_DMAOVERFLOW, false);
621a5f7ad9cd1c drivers/net/wireless/b43legacy/debugfs.c Viresh Kumar 2015-09-26 361 add_dyn_dbg("debug_dmaverbose", B43legacy_DBG_DMAVERBOSE, false);
621a5f7ad9cd1c drivers/net/wireless/b43legacy/debugfs.c Viresh Kumar 2015-09-26 362 add_dyn_dbg("debug_pwork_fast", B43legacy_DBG_PWORK_FAST, false);
621a5f7ad9cd1c drivers/net/wireless/b43legacy/debugfs.c Viresh Kumar 2015-09-26 363 add_dyn_dbg("debug_pwork_stop", B43legacy_DBG_PWORK_STOP, false);
75388acd0cd827 drivers/net/wireless/b43legacy/debugfs.c Larry Finger 2007-09-25 364
:::::: The code at line 354 was first introduced by commit
:::::: 32b4ebfe7f12c2481a2aea8372683142d1341a4e b43legacy: no need to check return value of debugfs_create functions
:::::: TO: Greg Kroah-Hartman <gregkh(a)linuxfoundation.org>
:::::: CC: Kalle Valo <kvalo(a)codeaurora.org>
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
1 year, 7 months
Re: [PATCH v4 bpf-next 2/6] netdevice: check for net_device::priv_flags bitfield overflow
by kernel test robot
Hi Alexander,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on bpf-next/master]
url: https://github.com/0day-ci/linux/commits/Alexander-Lobakin/xsk-build-skb-...
base: https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git master
config: riscv-randconfig-r014-20210216 (attached as .config)
compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project c9439ca36342fb6013187d0a69aef92736951476)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install riscv cross compiling tool for clang build
# apt-get install binutils-riscv64-linux-gnu
# https://github.com/0day-ci/linux/commit/ab71cd66e7a92a19ed9d78686970702fb...
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Alexander-Lobakin/xsk-build-skb-by-page-aka-generic-zerocopy-xmit/20210216-194634
git checkout ab71cd66e7a92a19ed9d78686970702fbbf0cd09
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=riscv
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp(a)intel.com>
All warnings (new ones prefixed by >>):
In file included from net/8021q/vlanproc.c:26:
include/linux/netdevice.h:1566:1: error: static_assert failed due to requirement 'sizeof(unsigned int) * 8 <= NETDEV_PRIV_FLAG_COUNT' "sizeof(netdev_priv_flags_t) * BITS_PER_BYTE <= NETDEV_PRIV_FLAG_COUNT"
static_assert(sizeof(netdev_priv_flags_t) * BITS_PER_BYTE <=
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/build_bug.h:77:34: note: expanded from macro 'static_assert'
#define static_assert(expr, ...) __static_assert(expr, ##__VA_ARGS__, #expr)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/build_bug.h:78:41: note: expanded from macro '__static_assert'
#define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
^ ~~~~
>> net/8021q/vlanproc.c:257:30: warning: format specifies type 'unsigned short' but the argument has type 'netdev_priv_flags_t' (aka 'unsigned int') [-Wformat]
(int)(vlan->flags & 1), vlandev->priv_flags);
^~~~~~~~~~~~~~~~~~~
net/8021q/vlanproc.c:284:22: warning: format specifies type 'unsigned short' but the argument has type 'int' [-Wformat]
mp->priority, ((mp->vlan_qos >> 13) & 0x7));
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
2 warnings and 1 error generated.
vim +257 net/8021q/vlanproc.c
^1da177e4c3f41 Linus Torvalds 2005-04-16 240
^1da177e4c3f41 Linus Torvalds 2005-04-16 241 static int vlandev_seq_show(struct seq_file *seq, void *offset)
^1da177e4c3f41 Linus Torvalds 2005-04-16 242 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 243 struct net_device *vlandev = (struct net_device *) seq->private;
7da82c06ded105 Jiri Pirko 2011-12-08 244 const struct vlan_dev_priv *vlan = vlan_dev_priv(vlandev);
28172739f0a276 Eric Dumazet 2010-07-07 245 struct rtnl_link_stats64 temp;
be1f3c2c027cc5 Ben Hutchings 2010-06-08 246 const struct rtnl_link_stats64 *stats;
be1f3c2c027cc5 Ben Hutchings 2010-06-08 247 static const char fmt64[] = "%30s %12llu\n";
^1da177e4c3f41 Linus Torvalds 2005-04-16 248 int i;
^1da177e4c3f41 Linus Torvalds 2005-04-16 249
26a25239d7a660 Joonwoo Park 2008-07-08 250 if (!is_vlan_dev(vlandev))
^1da177e4c3f41 Linus Torvalds 2005-04-16 251 return 0;
^1da177e4c3f41 Linus Torvalds 2005-04-16 252
28172739f0a276 Eric Dumazet 2010-07-07 253 stats = dev_get_stats(vlandev, &temp);
2029cc2c84fb11 Patrick McHardy 2008-01-21 254 seq_printf(seq,
2029cc2c84fb11 Patrick McHardy 2008-01-21 255 "%s VID: %d REORDER_HDR: %i dev->priv_flags: %hx\n",
7da82c06ded105 Jiri Pirko 2011-12-08 256 vlandev->name, vlan->vlan_id,
7da82c06ded105 Jiri Pirko 2011-12-08 @257 (int)(vlan->flags & 1), vlandev->priv_flags);
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
1 year, 7 months
[linux-stable-rc:linux-4.19.y 1850/3205] fs/xfs/xfs_rtalloc.c:875:1: warning: stack frame size of 1104 bytes in function 'xfs_growfs_rt'
by kernel test robot
tree: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-4.19.y
head: a4346d5d945c303262908275419f3e36d888fea7
commit: bda64b43564ac3eca39202db4f1462487ca4a6bf [1850/3205] xfs: fix realtime bitmap/summary file truncation when growing rt volume
config: powerpc64-randconfig-r031-20210215 (attached as .config)
compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project c9439ca36342fb6013187d0a69aef92736951476)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install powerpc64 cross compiling tool for clang build
# apt-get install binutils-powerpc64-linux-gnu
# https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gi...
git remote add linux-stable-rc https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
git fetch --no-tags linux-stable-rc linux-4.19.y
git checkout bda64b43564ac3eca39202db4f1462487ca4a6bf
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=powerpc64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp(a)intel.com>
All warnings (new ones prefixed by >>):
>> fs/xfs/xfs_rtalloc.c:875:1: warning: stack frame size of 1104 bytes in function 'xfs_growfs_rt' [-Wframe-larger-than=]
xfs_growfs_rt(
^
1 warning generated.
vim +/xfs_growfs_rt +875 fs/xfs/xfs_rtalloc.c
^1da177e4c3f41 Linus Torvalds 2005-04-16 866
^1da177e4c3f41 Linus Torvalds 2005-04-16 867 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 868 * Visible (exported) functions.
^1da177e4c3f41 Linus Torvalds 2005-04-16 869 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 870
^1da177e4c3f41 Linus Torvalds 2005-04-16 871 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 872 * Grow the realtime area of the filesystem.
^1da177e4c3f41 Linus Torvalds 2005-04-16 873 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 874 int
^1da177e4c3f41 Linus Torvalds 2005-04-16 @875 xfs_growfs_rt(
^1da177e4c3f41 Linus Torvalds 2005-04-16 876 xfs_mount_t *mp, /* mount point for filesystem */
^1da177e4c3f41 Linus Torvalds 2005-04-16 877 xfs_growfs_rt_t *in) /* growfs rt input struct */
^1da177e4c3f41 Linus Torvalds 2005-04-16 878 {
^1da177e4c3f41 Linus Torvalds 2005-04-16 879 xfs_rtblock_t bmbno; /* bitmap block number */
^1da177e4c3f41 Linus Torvalds 2005-04-16 880 xfs_buf_t *bp; /* temporary buffer */
^1da177e4c3f41 Linus Torvalds 2005-04-16 881 int error; /* error return value */
^1da177e4c3f41 Linus Torvalds 2005-04-16 882 xfs_mount_t *nmp; /* new (fake) mount structure */
d5cf09baced0ef Christoph Hellwig 2014-07-30 883 xfs_rfsblock_t nrblocks; /* new number of realtime blocks */
^1da177e4c3f41 Linus Torvalds 2005-04-16 884 xfs_extlen_t nrbmblocks; /* new number of rt bitmap blocks */
d5cf09baced0ef Christoph Hellwig 2014-07-30 885 xfs_rtblock_t nrextents; /* new number of realtime extents */
^1da177e4c3f41 Linus Torvalds 2005-04-16 886 uint8_t nrextslog; /* new log2 of sb_rextents */
^1da177e4c3f41 Linus Torvalds 2005-04-16 887 xfs_extlen_t nrsumblocks; /* new number of summary blocks */
^1da177e4c3f41 Linus Torvalds 2005-04-16 888 uint nrsumlevels; /* new rt summary levels */
^1da177e4c3f41 Linus Torvalds 2005-04-16 889 uint nrsumsize; /* new size of rt summary, bytes */
^1da177e4c3f41 Linus Torvalds 2005-04-16 890 xfs_sb_t *nsbp; /* new superblock */
^1da177e4c3f41 Linus Torvalds 2005-04-16 891 xfs_extlen_t rbmblocks; /* current number of rt bitmap blocks */
^1da177e4c3f41 Linus Torvalds 2005-04-16 892 xfs_extlen_t rsumblocks; /* current number of rt summary blks */
^1da177e4c3f41 Linus Torvalds 2005-04-16 893 xfs_sb_t *sbp; /* old superblock */
^1da177e4c3f41 Linus Torvalds 2005-04-16 894 xfs_fsblock_t sumbno; /* summary block number */
^1da177e4c3f41 Linus Torvalds 2005-04-16 895
^1da177e4c3f41 Linus Torvalds 2005-04-16 896 sbp = &mp->m_sb;
^1da177e4c3f41 Linus Torvalds 2005-04-16 897 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 898 * Initial error checking.
^1da177e4c3f41 Linus Torvalds 2005-04-16 899 */
743bb4650da9e2 sandeen(a)sandeen.net 2008-11-25 900 if (!capable(CAP_SYS_ADMIN))
2451337dd04390 Dave Chinner 2014-06-25 901 return -EPERM;
73024cf11522c0 Eric Sesterhenn 2006-06-28 902 if (mp->m_rtdev_targp == NULL || mp->m_rbmip == NULL ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 903 (nrblocks = in->newblocks) <= sbp->sb_rblocks ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 904 (sbp->sb_rblocks && (in->extsize != sbp->sb_rextsize)))
2451337dd04390 Dave Chinner 2014-06-25 905 return -EINVAL;
4cc929ee305c69 Nathan Scott 2007-05-14 906 if ((error = xfs_sb_validate_fsb_count(sbp, nrblocks)))
4cc929ee305c69 Nathan Scott 2007-05-14 907 return error;
^1da177e4c3f41 Linus Torvalds 2005-04-16 908 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 909 * Read in the last block of the device, make sure it exists.
^1da177e4c3f41 Linus Torvalds 2005-04-16 910 */
ba3726742c1712 Dave Chinner 2014-10-02 911 error = xfs_buf_read_uncached(mp->m_rtdev_targp,
4cc929ee305c69 Nathan Scott 2007-05-14 912 XFS_FSB_TO_BB(mp, nrblocks - 1),
ba3726742c1712 Dave Chinner 2014-10-02 913 XFS_FSB_TO_BB(mp, 1), 0, &bp, NULL);
ba3726742c1712 Dave Chinner 2014-10-02 914 if (error)
eab4e63368b4cf Dave Chinner 2012-11-12 915 return error;
^1da177e4c3f41 Linus Torvalds 2005-04-16 916 xfs_buf_relse(bp);
1922c949c59f93 Dave Chinner 2010-09-22 917
^1da177e4c3f41 Linus Torvalds 2005-04-16 918 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 919 * Calculate new parameters. These are the final values to be reached.
^1da177e4c3f41 Linus Torvalds 2005-04-16 920 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 921 nrextents = nrblocks;
^1da177e4c3f41 Linus Torvalds 2005-04-16 922 do_div(nrextents, in->extsize);
68c3271515f11f Nathan Scott 2006-09-28 923 nrbmblocks = howmany_64(nrextents, NBBY * sbp->sb_blocksize);
^1da177e4c3f41 Linus Torvalds 2005-04-16 924 nrextslog = xfs_highbit32(nrextents);
^1da177e4c3f41 Linus Torvalds 2005-04-16 925 nrsumlevels = nrextslog + 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 926 nrsumsize = (uint)sizeof(xfs_suminfo_t) * nrsumlevels * nrbmblocks;
^1da177e4c3f41 Linus Torvalds 2005-04-16 927 nrsumblocks = XFS_B_TO_FSB(mp, nrsumsize);
^1da177e4c3f41 Linus Torvalds 2005-04-16 928 nrsumsize = XFS_FSB_TO_B(mp, nrsumblocks);
^1da177e4c3f41 Linus Torvalds 2005-04-16 929 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 930 * New summary size can't be more than half the size of
^1da177e4c3f41 Linus Torvalds 2005-04-16 931 * the log. This prevents us from getting a log overflow,
^1da177e4c3f41 Linus Torvalds 2005-04-16 932 * since we'll log basically the whole summary file at once.
^1da177e4c3f41 Linus Torvalds 2005-04-16 933 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 934 if (nrsumblocks > (mp->m_sb.sb_logblocks >> 1))
2451337dd04390 Dave Chinner 2014-06-25 935 return -EINVAL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 936 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 937 * Get the old block counts for bitmap and summary inodes.
^1da177e4c3f41 Linus Torvalds 2005-04-16 938 * These can't change since other growfs callers are locked out.
^1da177e4c3f41 Linus Torvalds 2005-04-16 939 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 940 rbmblocks = XFS_B_TO_FSB(mp, mp->m_rbmip->i_d.di_size);
^1da177e4c3f41 Linus Torvalds 2005-04-16 941 rsumblocks = XFS_B_TO_FSB(mp, mp->m_rsumip->i_d.di_size);
^1da177e4c3f41 Linus Torvalds 2005-04-16 942 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 943 * Allocate space to the bitmap and summary files, as necessary.
^1da177e4c3f41 Linus Torvalds 2005-04-16 944 */
1050c71e2925ab Christoph Hellwig 2011-02-13 945 error = xfs_growfs_rt_alloc(mp, rbmblocks, nrbmblocks, mp->m_rbmip);
1050c71e2925ab Christoph Hellwig 2011-02-13 946 if (error)
^1da177e4c3f41 Linus Torvalds 2005-04-16 947 return error;
1050c71e2925ab Christoph Hellwig 2011-02-13 948 error = xfs_growfs_rt_alloc(mp, rsumblocks, nrsumblocks, mp->m_rsumip);
1050c71e2925ab Christoph Hellwig 2011-02-13 949 if (error)
^1da177e4c3f41 Linus Torvalds 2005-04-16 950 return error;
d432c80e68e3c2 Nathan Scott 2006-09-28 951 /*
d432c80e68e3c2 Nathan Scott 2006-09-28 952 * Allocate a new (fake) mount/sb.
d432c80e68e3c2 Nathan Scott 2006-09-28 953 */
d432c80e68e3c2 Nathan Scott 2006-09-28 954 nmp = kmem_alloc(sizeof(*nmp), KM_SLEEP);
^1da177e4c3f41 Linus Torvalds 2005-04-16 955 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 956 * Loop over the bitmap blocks.
^1da177e4c3f41 Linus Torvalds 2005-04-16 957 * We will do everything one bitmap block at a time.
^1da177e4c3f41 Linus Torvalds 2005-04-16 958 * Skip the current block if it is exactly full.
^1da177e4c3f41 Linus Torvalds 2005-04-16 959 * This also deals with the case where there were no rtextents before.
^1da177e4c3f41 Linus Torvalds 2005-04-16 960 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 961 for (bmbno = sbp->sb_rbmblocks -
^1da177e4c3f41 Linus Torvalds 2005-04-16 962 ((sbp->sb_rextents & ((1 << mp->m_blkbit_log) - 1)) != 0);
^1da177e4c3f41 Linus Torvalds 2005-04-16 963 bmbno < nrbmblocks;
^1da177e4c3f41 Linus Torvalds 2005-04-16 964 bmbno++) {
0924b585fc49bf Dave Chinner 2008-11-28 965 xfs_trans_t *tp;
0924b585fc49bf Dave Chinner 2008-11-28 966
^1da177e4c3f41 Linus Torvalds 2005-04-16 967 *nmp = *mp;
^1da177e4c3f41 Linus Torvalds 2005-04-16 968 nsbp = &nmp->m_sb;
^1da177e4c3f41 Linus Torvalds 2005-04-16 969 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 970 * Calculate new sb and mount fields for this round.
^1da177e4c3f41 Linus Torvalds 2005-04-16 971 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 972 nsbp->sb_rextsize = in->extsize;
^1da177e4c3f41 Linus Torvalds 2005-04-16 973 nsbp->sb_rbmblocks = bmbno + 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 974 nsbp->sb_rblocks =
^1da177e4c3f41 Linus Torvalds 2005-04-16 975 XFS_RTMIN(nrblocks,
^1da177e4c3f41 Linus Torvalds 2005-04-16 976 nsbp->sb_rbmblocks * NBBY *
^1da177e4c3f41 Linus Torvalds 2005-04-16 977 nsbp->sb_blocksize * nsbp->sb_rextsize);
^1da177e4c3f41 Linus Torvalds 2005-04-16 978 nsbp->sb_rextents = nsbp->sb_rblocks;
^1da177e4c3f41 Linus Torvalds 2005-04-16 979 do_div(nsbp->sb_rextents, nsbp->sb_rextsize);
79071eb0b2f142 David Chinner 2008-08-13 980 ASSERT(nsbp->sb_rextents != 0);
^1da177e4c3f41 Linus Torvalds 2005-04-16 981 nsbp->sb_rextslog = xfs_highbit32(nsbp->sb_rextents);
^1da177e4c3f41 Linus Torvalds 2005-04-16 982 nrsumlevels = nmp->m_rsumlevels = nsbp->sb_rextslog + 1;
^1da177e4c3f41 Linus Torvalds 2005-04-16 983 nrsumsize =
^1da177e4c3f41 Linus Torvalds 2005-04-16 984 (uint)sizeof(xfs_suminfo_t) * nrsumlevels *
^1da177e4c3f41 Linus Torvalds 2005-04-16 985 nsbp->sb_rbmblocks;
^1da177e4c3f41 Linus Torvalds 2005-04-16 986 nrsumblocks = XFS_B_TO_FSB(mp, nrsumsize);
^1da177e4c3f41 Linus Torvalds 2005-04-16 987 nmp->m_rsumsize = nrsumsize = XFS_FSB_TO_B(mp, nrsumblocks);
^1da177e4c3f41 Linus Torvalds 2005-04-16 988 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 989 * Start a transaction, get the log reservation.
^1da177e4c3f41 Linus Torvalds 2005-04-16 990 */
253f4911f297b8 Christoph Hellwig 2016-04-06 991 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_growrtfree, 0, 0, 0,
253f4911f297b8 Christoph Hellwig 2016-04-06 992 &tp);
3d3c8b5222b924 Jie Liu 2013-08-12 993 if (error)
253f4911f297b8 Christoph Hellwig 2016-04-06 994 break;
^1da177e4c3f41 Linus Torvalds 2005-04-16 995 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 996 * Lock out other callers by grabbing the bitmap inode lock.
^1da177e4c3f41 Linus Torvalds 2005-04-16 997 */
1050c71e2925ab Christoph Hellwig 2011-02-13 998 xfs_ilock(mp->m_rbmip, XFS_ILOCK_EXCL);
ddc3415aba1cb2 Christoph Hellwig 2011-09-19 999 xfs_trans_ijoin(tp, mp->m_rbmip, XFS_ILOCK_EXCL);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1000 /*
bda64b43564ac3 Darrick J. Wong 2020-10-07 1001 * Update the bitmap inode's size ondisk and incore. We need
bda64b43564ac3 Darrick J. Wong 2020-10-07 1002 * to update the incore size so that inode inactivation won't
bda64b43564ac3 Darrick J. Wong 2020-10-07 1003 * punch what it thinks are "posteof" blocks.
^1da177e4c3f41 Linus Torvalds 2005-04-16 1004 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1005 mp->m_rbmip->i_d.di_size =
^1da177e4c3f41 Linus Torvalds 2005-04-16 1006 nsbp->sb_rbmblocks * nsbp->sb_blocksize;
bda64b43564ac3 Darrick J. Wong 2020-10-07 1007 i_size_write(VFS_I(mp->m_rbmip), mp->m_rbmip->i_d.di_size);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1008 xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1009 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 1010 * Get the summary inode into the transaction.
^1da177e4c3f41 Linus Torvalds 2005-04-16 1011 */
1050c71e2925ab Christoph Hellwig 2011-02-13 1012 xfs_ilock(mp->m_rsumip, XFS_ILOCK_EXCL);
ddc3415aba1cb2 Christoph Hellwig 2011-09-19 1013 xfs_trans_ijoin(tp, mp->m_rsumip, XFS_ILOCK_EXCL);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1014 /*
bda64b43564ac3 Darrick J. Wong 2020-10-07 1015 * Update the summary inode's size. We need to update the
bda64b43564ac3 Darrick J. Wong 2020-10-07 1016 * incore size so that inode inactivation won't punch what it
bda64b43564ac3 Darrick J. Wong 2020-10-07 1017 * thinks are "posteof" blocks.
^1da177e4c3f41 Linus Torvalds 2005-04-16 1018 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1019 mp->m_rsumip->i_d.di_size = nmp->m_rsumsize;
bda64b43564ac3 Darrick J. Wong 2020-10-07 1020 i_size_write(VFS_I(mp->m_rsumip), mp->m_rsumip->i_d.di_size);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1021 xfs_trans_log_inode(tp, mp->m_rsumip, XFS_ILOG_CORE);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1022 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 1023 * Copy summary data from old to new sizes.
^1da177e4c3f41 Linus Torvalds 2005-04-16 1024 * Do this when the real size (not block-aligned) changes.
^1da177e4c3f41 Linus Torvalds 2005-04-16 1025 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1026 if (sbp->sb_rbmblocks != nsbp->sb_rbmblocks ||
^1da177e4c3f41 Linus Torvalds 2005-04-16 1027 mp->m_rsumlevels != nmp->m_rsumlevels) {
^1da177e4c3f41 Linus Torvalds 2005-04-16 1028 error = xfs_rtcopy_summary(mp, nmp, tp);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1029 if (error)
0924b585fc49bf Dave Chinner 2008-11-28 1030 goto error_cancel;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1031 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1032 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 1033 * Update superblock fields.
^1da177e4c3f41 Linus Torvalds 2005-04-16 1034 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1035 if (nsbp->sb_rextsize != sbp->sb_rextsize)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1036 xfs_trans_mod_sb(tp, XFS_TRANS_SB_REXTSIZE,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1037 nsbp->sb_rextsize - sbp->sb_rextsize);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1038 if (nsbp->sb_rbmblocks != sbp->sb_rbmblocks)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1039 xfs_trans_mod_sb(tp, XFS_TRANS_SB_RBMBLOCKS,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1040 nsbp->sb_rbmblocks - sbp->sb_rbmblocks);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1041 if (nsbp->sb_rblocks != sbp->sb_rblocks)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1042 xfs_trans_mod_sb(tp, XFS_TRANS_SB_RBLOCKS,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1043 nsbp->sb_rblocks - sbp->sb_rblocks);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1044 if (nsbp->sb_rextents != sbp->sb_rextents)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1045 xfs_trans_mod_sb(tp, XFS_TRANS_SB_REXTENTS,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1046 nsbp->sb_rextents - sbp->sb_rextents);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1047 if (nsbp->sb_rextslog != sbp->sb_rextslog)
^1da177e4c3f41 Linus Torvalds 2005-04-16 1048 xfs_trans_mod_sb(tp, XFS_TRANS_SB_REXTSLOG,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1049 nsbp->sb_rextslog - sbp->sb_rextslog);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1050 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 1051 * Free new extent.
^1da177e4c3f41 Linus Torvalds 2005-04-16 1052 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1053 bp = NULL;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1054 error = xfs_rtfree_range(nmp, tp, sbp->sb_rextents,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1055 nsbp->sb_rextents - sbp->sb_rextents, &bp, &sumbno);
0924b585fc49bf Dave Chinner 2008-11-28 1056 if (error) {
0924b585fc49bf Dave Chinner 2008-11-28 1057 error_cancel:
4906e21545814e Christoph Hellwig 2015-06-04 1058 xfs_trans_cancel(tp);
d432c80e68e3c2 Nathan Scott 2006-09-28 1059 break;
0924b585fc49bf Dave Chinner 2008-11-28 1060 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1061 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 1062 * Mark more blocks free in the superblock.
^1da177e4c3f41 Linus Torvalds 2005-04-16 1063 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1064 xfs_trans_mod_sb(tp, XFS_TRANS_SB_FREXTENTS,
^1da177e4c3f41 Linus Torvalds 2005-04-16 1065 nsbp->sb_rextents - sbp->sb_rextents);
^1da177e4c3f41 Linus Torvalds 2005-04-16 1066 /*
^1da177e4c3f41 Linus Torvalds 2005-04-16 1067 * Update mp values into the real mp structure.
^1da177e4c3f41 Linus Torvalds 2005-04-16 1068 */
^1da177e4c3f41 Linus Torvalds 2005-04-16 1069 mp->m_rsumlevels = nrsumlevels;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1070 mp->m_rsumsize = nrsumsize;
e5720eec0548c0 David Chinner 2008-04-10 1071
70393313dd0b26 Christoph Hellwig 2015-06-04 1072 error = xfs_trans_commit(tp);
0924b585fc49bf Dave Chinner 2008-11-28 1073 if (error)
e5720eec0548c0 David Chinner 2008-04-10 1074 break;
e5720eec0548c0 David Chinner 2008-04-10 1075 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1076
^1da177e4c3f41 Linus Torvalds 2005-04-16 1077 /*
d432c80e68e3c2 Nathan Scott 2006-09-28 1078 * Free the fake mp structure.
^1da177e4c3f41 Linus Torvalds 2005-04-16 1079 */
f0e2d93c29dc39 Denys Vlasenko 2008-05-19 1080 kmem_free(nmp);
d432c80e68e3c2 Nathan Scott 2006-09-28 1081
^1da177e4c3f41 Linus Torvalds 2005-04-16 1082 return error;
^1da177e4c3f41 Linus Torvalds 2005-04-16 1083 }
^1da177e4c3f41 Linus Torvalds 2005-04-16 1084
:::::: The code at line 875 was first introduced by commit
:::::: 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 Linux-2.6.12-rc2
:::::: TO: Linus Torvalds <torvalds(a)ppc970.osdl.org>
:::::: CC: Linus Torvalds <torvalds(a)ppc970.osdl.org>
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
1 year, 7 months