** Description changed:

+ [Impact]
+ 
+ * In b49151d684f44 tx_waited has been renamed to tx_dirty_delayed, but
+ only in the tracepoint definition (in trace_dmu.h) and not in the rest
+ of the code, causing build errors if zfs tracepoints are enabled.
+ 
+ * Fix by reverting tx_dirty_delayed back to the original name tx_waited
+ 
+ NOTE: this bug doesn't show up in regular kernel builds, because zfs
+ tracepoints are not enabled by default, it is possible to see this
+ problem only by enabling them and recompiling zfs outside our regular
+ build process, but it's a good cleanup anyway (in case we need to enable
+ zfs tracepoints in the future).
+ 
+ [Test Case]
+ 
+  * enable zfs tracepoints in config and build zfs
+ 
+ [Fix]
+ 
+  * Restore the old struct name to fix the build bug
+ 
+ [Regression Potential]
+ 
+  * It is a very small fix (just a rename of a struct member), so
+ regression potential is minimal
+ 
+ [Original bug report]
+ 
  I tried to build a kernel 4.15.0-48.51 that cloned from the Ubuntu
  kernel git (x86_64-generic flavour).
  
  commit c50532b9d7b623ff98aeaf0b848e58adae54ca75 (HEAD -> master, tag: 
Ubuntu-4.15.0-48.51, origin/master, origin/HEAD)
  Author: Andrea Righi <andrea.ri...@canonical.com>
  Date:   Tue Apr 2 18:31:55 2019 +0200
  
-     UBUNTU: Ubuntu-4.15.0-48.51
- 
-     Signed-off-by: Andrea Righi <andrea.ri...@canonical.com>
+     UBUNTU: Ubuntu-4.15.0-48.51
+ 
+     Signed-off-by: Andrea Righi <andrea.ri...@canonical.com>
  
  1. Build a kernel image with 'zfs_enable' flag set as false.
  2. Build SPL/ZFS modules independently by 'make' command (debug purpose; 
DECLARE_EVENT_CLASS() enabled).
  
  But 'make' was always failed at the same point, 'zfs/module/zfs/trace.c'
  (as seem as below).
  
  In file included from /home/np/linux-4.15/include/trace/define_trace.h:96:0,
-                  from /home/np/linux-4.15/zfs/include/sys/trace_dmu.h:127,
-                  from /home/np/linux-4.15/zfs/module/zfs/trace.c:45:
+                  from /home/np/linux-4.15/zfs/include/sys/trace_dmu.h:127,
+                  from /home/np/linux-4.15/zfs/module/zfs/trace.c:45:
  /home/np/linux-4.15/zfs/include/sys/trace_dmu.h: In function 
‘trace_event_raw_event_zfs_delay_mintime_class’:
  /home/np/linux-4.15/zfs/include/sys/trace_dmu.h:65:37: error: ‘dmu_tx_t {aka 
struct dmu_tx}’ has no member named ‘tx_dirty_delayed’
-       __entry->tx_dirty_delayed  = tx->tx_dirty_delayed;
-                                      ^
+       __entry->tx_dirty_delayed  = tx->tx_dirty_delayed;
+                                      ^
  /home/np/linux-4.15/include/trace/trace_events.h:719:4: note: in definition 
of macro ‘DECLARE_EVENT_CLASS’
-   { assign; }       \
-     ^~~~~~
+   { assign; }       \
+     ^~~~~~
  /home/np/linux-4.15/zfs/include/sys/trace_dmu.h:60:2: note: in expansion of 
macro ‘TP_fast_assign’
-   TP_fast_assign(
-   ^~~~~~~~~~~~~~
+   TP_fast_assign(
+   ^~~~~~~~~~~~~~
  In file included from /home/np/linux-4.15/include/trace/define_trace.h:97:0,
-                  from /home/np/linux-4.15/zfs/include/sys/trace_dmu.h:127,
-                  from /home/np/linux-4.15/zfs/module/zfs/trace.c:45:
+                  from /home/np/linux-4.15/zfs/include/sys/trace_dmu.h:127,
+                  from /home/np/linux-4.15/zfs/module/zfs/trace.c:45:
  /home/np/linux-4.15/zfs/include/sys/trace_dmu.h: In function 
‘perf_trace_zfs_delay_mintime_class’:
  /home/np/linux-4.15/zfs/include/sys/trace_dmu.h:65:37: error: ‘dmu_tx_t {aka 
struct dmu_tx}’ has no member named ‘tx_dirty_delayed’
-       __entry->tx_dirty_delayed  = tx->tx_dirty_delayed;
-                                      ^
+       __entry->tx_dirty_delayed  = tx->tx_dirty_delayed;
+                                      ^
  /home/np/linux-4.15/include/trace/perf.h:66:4: note: in definition of macro 
‘DECLARE_EVENT_CLASS’
-   { assign; }       \
-     ^~~~~~
+   { assign; }       \
+     ^~~~~~
  /home/np/linux-4.15/zfs/include/sys/trace_dmu.h:60:2: note: in expansion of 
macro ‘TP_fast_assign’
-   TP_fast_assign(
-   ^~~~~~~~~~~~~~
+   TP_fast_assign(
+   ^~~~~~~~~~~~~~
  
  I tried to debug this issue with myself and found something intriguing.
  In 'zfs/include/sys/trace_dmu.h', the failed code accessing 
'tx_dirty_delayed' from 'dmu_tx_t' (which same as 'struct dmu_tx').
  
  DECLARE_EVENT_CLASS(zfs_delay_mintime_class,
-         TP_PROTO(dmu_tx_t *tx, uint64_t dirty, uint64_t min_tx_time),
-         TP_ARGS(tx, dirty, min_tx_time),
-         TP_STRUCT__entry(
-             __field(uint64_t,                   tx_txg)
-             __field(uint64_t,                   tx_lastsnap_txg)
-             __field(uint64_t,                   tx_lasttried_txg)
-             __field(boolean_t,                  tx_anyobj)
-             __field(boolean_t,                  tx_dirty_delayed)
-             __field(hrtime_t,                   tx_start)
-             __field(boolean_t,                  tx_wait_dirty)
-             __field(int,                        tx_err)
-             __field(uint64_t,                   min_tx_time)
-             __field(uint64_t,                   dirty)
-         ),
-         TP_fast_assign(
-             __entry->tx_txg                     = tx->tx_txg;
-             __entry->tx_lastsnap_txg            = tx->tx_lastsnap_txg;
-             __entry->tx_lasttried_txg           = tx->tx_lasttried_txg;
-             __entry->tx_anyobj                  = tx->tx_anyobj;
-             __entry->tx_dirty_delayed           = tx->tx_dirty_delayed;
-             __entry->tx_start                   = tx->tx_start;
-             __entry->tx_wait_dirty              = tx->tx_wait_dirty;
-             __entry->tx_err                     = tx->tx_err;
-             __entry->dirty                      = dirty;
-             __entry->min_tx_time                = min_tx_time;
-         ),
-         TP_printk("tx { txg %llu lastsnap_txg %llu tx_lasttried_txg %llu "
-             "anyobj %d dirty_delayed %d start %llu wait_dirty %d err %i "
-             "} dirty %llu min_tx_time %llu",
-             __entry->tx_txg, __entry->tx_lastsnap_txg,
-             __entry->tx_lasttried_txg, __entry->tx_anyobj,
-             __entry->tx_dirty_delayed, __entry->tx_start,
-             __entry->tx_wait_dirty, __entry->tx_err,
-             __entry->dirty, __entry->min_tx_time)
+         TP_PROTO(dmu_tx_t *tx, uint64_t dirty, uint64_t min_tx_time),
+         TP_ARGS(tx, dirty, min_tx_time),
+         TP_STRUCT__entry(
+             __field(uint64_t,                   tx_txg)
+             __field(uint64_t,                   tx_lastsnap_txg)
+             __field(uint64_t,                   tx_lasttried_txg)
+             __field(boolean_t,                  tx_anyobj)
+             __field(boolean_t,                  tx_dirty_delayed)
+             __field(hrtime_t,                   tx_start)
+             __field(boolean_t,                  tx_wait_dirty)
+             __field(int,                        tx_err)
+             __field(uint64_t,                   min_tx_time)
+             __field(uint64_t,                   dirty)
+         ),
+         TP_fast_assign(
+             __entry->tx_txg                     = tx->tx_txg;
+             __entry->tx_lastsnap_txg            = tx->tx_lastsnap_txg;
+             __entry->tx_lasttried_txg           = tx->tx_lasttried_txg;
+             __entry->tx_anyobj                  = tx->tx_anyobj;
+             __entry->tx_dirty_delayed           = tx->tx_dirty_delayed;
+             __entry->tx_start                   = tx->tx_start;
+             __entry->tx_wait_dirty              = tx->tx_wait_dirty;
+             __entry->tx_err                     = tx->tx_err;
+             __entry->dirty                      = dirty;
+             __entry->min_tx_time                = min_tx_time;
+         ),
+         TP_printk("tx { txg %llu lastsnap_txg %llu tx_lasttried_txg %llu "
+             "anyobj %d dirty_delayed %d start %llu wait_dirty %d err %i "
+             "} dirty %llu min_tx_time %llu",
+             __entry->tx_txg, __entry->tx_lastsnap_txg,
+             __entry->tx_lasttried_txg, __entry->tx_anyobj,
+             __entry->tx_dirty_delayed, __entry->tx_start,
+             __entry->tx_wait_dirty, __entry->tx_err,
+             __entry->dirty, __entry->min_tx_time)
  );
  
  But, implementation of 'strcut dmu_tx' doesn't contain
  'tx_dirty_delayed' (in zfs/include/sys/dmu_tx.h)
  
  struct dmu_tx {
-         /*
-          * No synchronization is needed because a tx can only be handled
-          * by one thread.
-          */
-         list_t tx_holds; /* list of dmu_tx_hold_t */
-         objset_t *tx_objset;
-         struct dsl_dir *tx_dir;
-         struct dsl_pool *tx_pool;
-         uint64_t tx_txg;
-         uint64_t tx_lastsnap_txg;
-         uint64_t tx_lasttried_txg;
-         txg_handle_t tx_txgh;
-         void *tx_tempreserve_cookie;
-         struct dmu_tx_hold *tx_needassign_txh;
- 
-         /* list of dmu_tx_callback_t on this dmu_tx */
-         list_t tx_callbacks;
- 
-         /* placeholder for syncing context, doesn't need specific holds */
-         boolean_t tx_anyobj;
- 
-         /* has this transaction already been delayed? */
-         boolean_t tx_waited;
- 
-         /* transaction is marked as being a "net free" of space */
-         boolean_t tx_netfree;
- 
-         /* time this transaction was created */
-         hrtime_t tx_start;
- 
-         /* need to wait for sufficient dirty space */
-         boolean_t tx_wait_dirty;
- 
-         int tx_err;
+         /*
+          * No synchronization is needed because a tx can only be handled
+          * by one thread.
+          */
+         list_t tx_holds; /* list of dmu_tx_hold_t */
+         objset_t *tx_objset;
+         struct dsl_dir *tx_dir;
+         struct dsl_pool *tx_pool;
+         uint64_t tx_txg;
+         uint64_t tx_lastsnap_txg;
+         uint64_t tx_lasttried_txg;
+         txg_handle_t tx_txgh;
+         void *tx_tempreserve_cookie;
+         struct dmu_tx_hold *tx_needassign_txh;
+ 
+         /* list of dmu_tx_callback_t on this dmu_tx */
+         list_t tx_callbacks;
+ 
+         /* placeholder for syncing context, doesn't need specific holds */
+         boolean_t tx_anyobj;
+ 
+         /* has this transaction already been delayed? */
+         boolean_t tx_waited;
+ 
+         /* transaction is marked as being a "net free" of space */
+         boolean_t tx_netfree;
+ 
+         /* time this transaction was created */
+         hrtime_t tx_start;
+ 
+         /* need to wait for sufficient dirty space */
+         boolean_t tx_wait_dirty;
+ 
+         int tx_err;
  };
  
  Looks above, current in-source-tree ZFS module seems not valid... :(
  Are there any workarounds for this problem?
- --- 
+ ---
  ProblemType: Bug
  AlsaDevices:
-  total 0
-  crw-rw----+ 1 root audio 116,  1 May 13 15:35 seq
-  crw-rw----+ 1 root audio 116, 33 May 13 15:35 timer
+  total 0
+  crw-rw----+ 1 root audio 116,  1 May 13 15:35 seq
+  crw-rw----+ 1 root audio 116, 33 May 13 15:35 timer
  AplayDevices: Error: [Errno 2] No such file or directory: 'aplay': 'aplay'
  ApportVersion: 2.20.9-0ubuntu7.6
  Architecture: amd64
  ArecordDevices: Error: [Errno 2] No such file or directory: 'arecord': 
'arecord'
  AudioDevicesInUse: Error: command ['fuser', '-v', '/dev/snd/seq', 
'/dev/snd/timer'] failed with exit code 1:
  DistroRelease: Ubuntu 18.04
  HibernationDevice: RESUME=/dev/mapper/ubuntu--vg-swap_1
  InstallationDate: Installed on 2019-05-13 (0 days ago)
  InstallationMedia: Ubuntu-Server 18.04.1 LTS "Bionic Beaver" - Release amd64 
(20180725)
  IwConfig: Error: [Errno 2] No such file or directory: 'iwconfig': 'iwconfig'
  Lsusb:
-  Bus 001 Device 002: ID 0627:0001 Adomax Technology Co., Ltd 
-  Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
+  Bus 001 Device 002: ID 0627:0001 Adomax Technology Co., Ltd
+  Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
  MachineType: Xen HVM domU
  Package: linux (not installed)
  PciMultimedia:
-  
+ 
  ProcEnviron:
-  TERM=xterm
-  PATH=(custom, no user)
-  LANG=en_US.UTF-8
-  SHELL=/bin/bash
+  TERM=xterm
+  PATH=(custom, no user)
+  LANG=en_US.UTF-8
+  SHELL=/bin/bash
  ProcFB: 0 cirrusdrmfb
  ProcKernelCmdLine: BOOT_IMAGE=/boot/vmlinuz-4.15.0-48-generic 
root=/dev/mapper/hostname--vg-root ro
  ProcVersionSignature: Ubuntu 4.15.0-48.51-generic 4.15.18
  PulseList:
-  Error: command ['pacmd', 'list'] failed with exit code 1: Home directory not 
accessible: Permission denied
-  No PulseAudio daemon running, or not running as session daemon.
+  Error: command ['pacmd', 'list'] failed with exit code 1: Home directory not 
accessible: Permission denied
+  No PulseAudio daemon running, or not running as session daemon.
  RelatedPackageVersions:
-  linux-restricted-modules-4.15.0-48-generic N/A
-  linux-backports-modules-4.15.0-48-generic  N/A
-  linux-firmware                             1.173.5
+  linux-restricted-modules-4.15.0-48-generic N/A
+  linux-backports-modules-4.15.0-48-generic  N/A
+  linux-firmware                             1.173.5
  RfKill: Error: [Errno 2] No such file or directory: 'rfkill': 'rfkill'
  Tags:  bionic
  Uname: Linux 4.15.0-48-generic x86_64
  UpgradeStatus: No upgrade log present (probably fresh install)
  UserGroups:
-  
+ 
  _MarkForUpload: True
  dmi.bios.date: 10/26/2018
  dmi.bios.vendor: Xen
  dmi.bios.version: 4.7.6-6.2.1.xcp
  dmi.chassis.type: 1
  dmi.chassis.vendor: Xen
  dmi.modalias: 
dmi:bvnXen:bvr4.7.6-6.2.1.xcp:bd10/26/2018:svnXen:pnHVMdomU:pvr4.7.6-6.2.1.xcp:cvnXen:ct1:cvr:
  dmi.product.name: HVM domU
  dmi.product.version: 4.7.6-6.2.1.xcp
  dmi.sys.vendor: Xen

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1828763

Title:
  Cannot build kernel 4.15.0-48.51 due to an in-source-tree ZFS module.

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1828763/+subscriptions

-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to