Μηνιαία αρχεία: Νοέμβριος 2016


Building SnoopSnitch on Ubuntu 16.10 64bit

Step A: Update the system and install all necessary packages

sudo dpkg --add-architecture i386;
sudo apt-get update;
sudo apt-get upgrade -y;
sudo apt-get install git openjdk-8-jdk dh-autoreconf ant libncurses5:i386 libstdc++6:i386 zlib1g:i386 -y;
cd ~/;
mkdir Android;
cd Android;

Step B: Download the Android SDK and install all required packages

The following download link we got it from this page https://developer.android.com/studio/

wget https://dl.google.com/android/android-sdk_r24.4.1-linux.tgz;
tar -xf android-sdk_r24.4.1-linux.tgz;
cd android-sdk-linux/tools;
#To list all available packages, including the obsolete extra-android-support
#./android list sdk --all –extended;
./android update sdk --no-ui --all --filter extra-android-support,tools,platform-tools,build-tools-19.1.0,android-19;

You will get a prompt for a license agreement, you need to type Y to proceed

November 20, 2015
Do you accept the license 'android-sdk-license-c81a61d9' [y/n]: y
cd ../..;
export ANDROID_HOME=`pwd`/android-sdk-linux;

Step C: Once the installation is complete, we need to install the Android NDK.

The following link we got it from https://developer.android.com/ndk/downloads/

wget https://dl.google.com/android/repository/android-ndk-r13b-linux-x86_64.zip;
unzip -q android-ndk-r13b-linux-x86_64.zip;
export NDK_DIR=`pwd`/android-ndk-r13b;
#If we do not update the PATH we will get the following error: ../libtool: line 1719: arm-linux-androideabi-ranlib: command not found
PATH=$PATH:`pwd`/android-ndk-r13b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin;
mkdir Projects;
cd Projects;

Step D: Afterwards, we can download SnoopSnitch and all of the git submodules of it using the following command.

git clone --recursive https://opensource.srlabs.de/git/snoopsnitch.git;

Step E: Then we need to compile two separate parts of the project.

We will start by compiling contrib/ projects, that are the supplementary projects needed for SnoopSnitch to get data.

cd snoopsnitch/contrib/;
./compile.sh -t android -u;
cd ..;

Step F: Finally, we can proceed to compile the android project of SnoopSnitch.

cd ./SnoopSnitch;

We need to update Application.mk and add APP_ABI := armeabi to it.
We do this to make sure that we compile  diag-helper.c only for armeabi as the rest of the packages will be available only on that architecture.
If we do not do this and we have a processor that supports armeabi-v7a (or different), then it will only install diag-helper.so and it will ignore the rest. Which will of course cause the application to fail.

echo "APP_ABI := armeabi" >> jni/Application.mk;
ant debug;
~/Android/android-sdk-linux/platform-tools/adb start-server

Once the compilation is complete, we can upload our apk to a device using the following commands:

#First we make sure that the adb server is running
$ANDROID_HOME/platform-tools/adb start-server;
#Then we check that our device is visible to the adb
$ANDROID_HOME/platform-tools/adb devices;
#Finally, we install the application to the device.
$ANDROID_HOME/platform-tools/adb install bin/SnoopSnitch-debug.apk;

This guide was tested on freshly installed Ubuntu 16.10 64bit.

snoopsnitch-map

Useful links


VirtualBox: Failed to attach the USB device to the virtual machine 29

Recently we were using a Windows 10 64bit machine which had Oracle VirtualBox installed.
At some point all USB devices stopped mounting on the guest systems.
We would get errors similar to the following:

Failed to attach the USB device OnePlus A0001 [0232] to the virtual machine Ubuntu.

USB device 'OnePlus A0001' with UUID {544e5582-9e77-4301-a538-5326cf2250c0} is busy with a previous request. Please try again later.

Result Code: E_INVALIDARG (0x80070057)
Component: HostUSBDeviceWrap
Interface: IHostUSBDevice {c19073dd-cc7b-431b-98b2-951fda8eab89}

Callee: IConsole {872da645-4a9b-1727-bee2-5585105b9eed}

USB device  with UUID  is busy with a previous request. Please try again later.

After a couple of restarts of both the guest and the host machines we realized that this time, a restart was not enough to fix the error.
Right before this error occurred, we had installed Wireshark with USBPcap support.
Apparently this was the root of our problem.

Resolution:

Following are the steps we followed to solve this issue:

Step A: Delete problematic system configuration.

Press the key combination Win + R to pop up the Run prompt.
Type regedit in the input box and hit the Enter key.

regedit

On the left side of the new window, navigate to the following location:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}

upperfilters

In the right part, select the UpperFilters entry, right click it and select Delete.

delete-upperfilters
When a prompt window appear asks you to confirm that you want to delete the value, click Yes.

confirm-delete-upperfilters

Step B: Manually re-install VirtualBox USB drivers (Optional)

Just in case there is an issue with the VirtualBox USB drivers, you can re-install them to be sure everything is OK.
To do that, you can either re-install the whole VirtualBox using their installer or manually re-install the driver itself.

To re-install the VirtualBox USB driver manually, using Windows Explore navigate to this folder

C:\Program Files\Oracle\VirtualBox\drivers\USB\filter

Right click the file VBoxUSBMon.inf and select Install.

install-virtualbox-usb-driver
You will get a confirmation once the installation is complete.
Restart your machine, so that new changes will get applied.
Your USB devices should work as expected.


Compiling GobiNet on Ubuntu 16.10 64bit 5

Recently, we tried to compile the GobiNet drivers for Linux on an Ubuntu 16.10 64bit machine.

The version of GobiNet was GobiNet_2016-10-20.tar.gz ([download id=”2179″]).

To our surprise, we got a errors while compiling.

Solution:

Get the full project after it was patched from here: [download id=”2188″]

or

Download the following patched version of QMIDevice.c and replace it on your machine [download id=”2183″].

Download the following patched version of GobiUSBNet.c and replace it on your machine [download id=”3349″].

Errors:

First error: ‘struct net_device’ has no member named ‘trans_start’ (GobiUSBNet.c:876:8)

We removed the call to pNet->trans_start = jiffies; and replaced it with netif_trans_update(pNet); which as we can see below, it does the same thing in the end.

/* legacy drivers only, netdev_start_xmit() sets txq->trans_start */
static inline void netif_trans_update(struct net_device *dev)
{
    struct netdev_queue *txq = netdev_get_tx_queue(dev, 0);
    if (txq->trans_start != jiffies)
        txq->trans_start = jiffies;
}
GobiUSBNet.c:876 
@@ -873,7 +873,7 @@ int GobiUSBNetStartXmit( 
    complete( &pAutoPM->mThreadDoWork ); 
  
    // Start transfer timer 
-   pNet->trans_start = jiffies; 
+   netif_trans_update(pNet); 
    // Free SKB 
    dev_kfree_skb_any( pSKB );

Second error: return from incompatible pointer type [-Werror=incompatible-pointer-types] (GobiUSBNet.c:1692:13)

We got the following error:

/home/george/Downloads/gobiusbnet/GobiUSBNet.c: In function ‘__exittest’: 
/home/george/Downloads/gobiusbnet/GobiUSBNet.c:1692:13: error: return from incompatible pointer type [-Werror=incompatible-pointer-types] 
 module_exit(GobiUSBNetModExit); 
             ^ 
./include/linux/module.h:137:11: note: in definition of macro ‘module_exit’ 
  { return exitfn; }

module_exit is defined as follows:

typedef void (*exitcall_t)(void);
#define module_exit(exitfn)                                     \
         static inline exitcall_t __exittest(void)               \
         { return exitfn; }                                      \
         void cleanup_module(void) __attribute__((alias(#exitfn)));

So we see that we need to update static int GobiUSBNetModExit(void) to become static void GobiUSBNetModExit(void) and have it return nothing.

GobiUSBNet.c:1669 
@@ -1666,11 +1666,11 @@ RETURN VALUE: 
    void 
 ===========================================================================*/ 
 // static int GobiUSBNetModExit(struct platform_device *pdev) 
-static int GobiUSBNetModExit(void) 
+static void GobiUSBNetModExit(void) 
 { 
    usb_deregister( &GobiNet ); 
    class_destroy( gpClass ); 
-   return 0; 
+   return; 
 }

Third error: passing argument 1 of ‘atomic_read’ from incompatible pointer type [-Werror=incompatible-pointer-types] (QMIDevice.c:2393:21)

On this 64bit architecture the f_count of the struct file  is defined as long (64bit) so we should not use atomic_read but atomic_long_read instead.

@@ -2390,7 +2390,7 @@ int UserspaceClose(
    }
 
    // Fallthough.  If f_count == 1 no need to do more checks
-   if (atomic_read( &pFilp->f_count ) != 1)
+   if (atomic_long_read( &pFilp->f_count ) != 1)^M
    {
       rcu_read_lock();
       for_each_process( pEachTask )

Fourth error: ‘struct file’ has no member named ‘f_dentry’ (in 9 placed of QMIDevice.c)

The error was error: struct file has no member named f_dentry
Apparently, there was a change in the struct that contained f_dentry in the kernel 3.19 source code which created this bug.

@@ -2269,7 +2269,7 @@ int UserspaceIOCTL(
    if (IsDeviceValid( pFilpData->mpDev ) == false)
    {
       DBG( "Invalid device! Updating f_ops\n" );
-      pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
+      pFilp->f_op = pFilp->f_path.dentry->d_inode->i_fop;^M
       return -ENXIO;
    }
 
@@ -2427,7 +2427,7 @@ int UserspaceClose(
    if (IsDeviceValid( pFilpData->mpDev ) == false)
    {
       DBG( "Invalid device! Updating f_ops\n" );
-      pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
+      pFilp->f_op = pFilp->f_path.dentry->d_inode->i_fop;^M
       return -ENXIO;
    }
    
@@ -2486,7 +2486,7 @@ ssize_t UserspaceRead(
    if (IsDeviceValid( pFilpData->mpDev ) == false)
    {
       DBG( "Invalid device! Updating f_ops\n" );
-      pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
+      pFilp->f_op = pFilp->f_path.dentry->d_inode->i_fop;^M
       return -ENXIO;
    }
    
@@ -2567,7 +2567,7 @@ ssize_t UserspaceWrite(
    if (IsDeviceValid( pFilpData->mpDev ) == false)
    {
       DBG( "Invalid device! Updating f_ops\n" );
-      pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
+      pFilp->f_op = pFilp->f_path.dentry->d_inode->i_fop;^M
       return -ENXIO;
    }
 
@@ -2646,7 +2646,7 @@ unsigned int UserspacePoll(
    if (IsDeviceValid( pFilpData->mpDev ) == false)
    {
       DBG( "Invalid device! Updating f_ops\n" );
-      pFilp->f_op = pFilp->f_dentry->d_inode->i_fop;
+      pFilp->f_op = pFilp->f_path.dentry->d_inode->i_fop;^M
       return POLLERR;
    }
 
@@ -3003,9 +3003,9 @@ void DeregisterQMIDevice( sGobiUSBNet * pDev )
             for (count = 0; count < pFDT->max_fds; count++)
             {
                pFilp = pFDT->fd[count];
-               if (pFilp != NULL &&  pFilp->f_dentry != NULL)
+               if (pFilp != NULL &&  pFilp->f_path.dentry != NULL)^M
                {
-                  if (pFilp->f_dentry->d_inode == pOpenInode)
+                  if (pFilp->f_path.dentry->d_inode == pOpenInode)^M
                   {
                      // Close this file handle
                      rcu_assign_pointer( pFDT->fd[count], NULL );                     
@@ -3050,9 +3050,9 @@ void DeregisterQMIDevice( sGobiUSBNet * pDev )
                for (count = 0; count < pFDT->max_fds; count++)
                {
                   pFilp = pFDT->fd[count];
-                  if (pFilp != NULL &&  pFilp->f_dentry != NULL)
+                  if (pFilp != NULL &&  pFilp->f_path.dentry != NULL)^M
                   {
-                     if (pFilp->f_dentry->d_inode == pOpenInode)
+                     if (pFilp->f_path.dentry->d_inode == pOpenInode)^M
                      {
                         // Close this file handle
                         rcu_assign_pointer( pFDT->fd[count], NULL );

 

Following is the original output of the make commands before and while we were patching the source files.

george@ubuntu-1610:~/Downloads$ lsb_release -a 
No LSB modules are available. 
Distributor ID:    Ubuntu 
Description:    Ubuntu 16.10 
Release:    16.10 
Codename:    yakkety 
george@ubuntu-1610:~/Downloads$ wget https://portland.source.codeaurora.org/patches/quic/gobi/Gobi_Linux/GobiNet_2016-10-20.tar.gz 
--2017-04-24 09:42:08--  https://portland.source.codeaurora.org/patches/quic/gobi/Gobi_Linux/GobiNet_2016-10-20.tar.gz 
Resolving portland.source.codeaurora.org (portland.source.codeaurora.org)... 198.145.29.80 
Connecting to portland.source.codeaurora.org (portland.source.codeaurora.org)|198.145.29.80|:443... connected. 
HTTP request sent, awaiting response... 200 OK 
Length: 43818 (43K) [application/x-gzip] 
Saving to: ‘GobiNet_2016-10-20.tar.gz’ 
 
GobiNet_2016-10-20.tar.gz    100%[=============================================>]  42,79K   217KB/s    in 0,2s     
 
2017-04-24 09:42:09 (217 KB/s) - ‘GobiNet_2016-10-20.tar.gz’ saved [43818/43818] 
 
george@ubuntu-1610:~/Downloads$ tar -xzf GobiNet_2016-10-20.tar.gz  
george@ubuntu-1610:~/Downloads$ cd gobiusbnet/ 
george@ubuntu-1610:~/Downloads/gobiusbnet$ make 
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module.* modules.order 
make -C /lib/modules/4.8.0-27-generic/build M=/home/george/Downloads/gobiusbnet modules 
make[1]: Entering directory '/usr/src/linux-headers-4.8.0-27-generic' 
  CC [M]  /home/george/Downloads/gobiusbnet/qmap.o 
  CC [M]  /home/george/Downloads/gobiusbnet/GobiUSBNet.o 
/home/george/Downloads/gobiusbnet/GobiUSBNet.c: In function ‘GobiUSBNetStartXmit’: 
/home/george/Downloads/gobiusbnet/GobiUSBNet.c:876:8: error: ‘struct net_device’ has no member named ‘trans_start’; did you mean ‘mem_start’? 
    pNet->trans_start = jiffies; 
        ^~ 
In file included from ./include/linux/phy.h:24:0, 
                 from ./include/net/dsa.h:19, 
                 from ./include/linux/netdevice.h:44, 
                 from ./include/linux/etherdevice.h:26, 
                 from /home/george/Downloads/gobiusbnet/Structs.h:47, 
                 from /home/george/Downloads/gobiusbnet/GobiUSBNet.c:57: 
/home/george/Downloads/gobiusbnet/GobiUSBNet.c: In function ‘__exittest’: 
/home/george/Downloads/gobiusbnet/GobiUSBNet.c:1692:13: error: return from incompatible pointer type [-Werror=incompatible-pointer-types] 
 module_exit(GobiUSBNetModExit); 
             ^ 
./include/linux/module.h:137:11: note: in definition of macro ‘module_exit’ 
  { return exitfn; }     \ 
           ^~~~~~ 
cc1: some warnings being treated as errors 
scripts/Makefile.build:289: recipe for target '/home/george/Downloads/gobiusbnet/GobiUSBNet.o' failed 
make[2]: *** [/home/george/Downloads/gobiusbnet/GobiUSBNet.o] Error 1 
Makefile:1489: recipe for target '_module_/home/george/Downloads/gobiusbnet' failed 
make[1]: *** [_module_/home/george/Downloads/gobiusbnet] Error 2 
make[1]: Leaving directory '/usr/src/linux-headers-4.8.0-27-generic' 
Makefile:8: recipe for target 'all' failed 
make: *** [all] Error 2 
george@ubuntu-1610:~/Downloads/gobiusbnet$  
 
 
GobiUSBNet.c:1669 
@@ -1666,11 +1666,11 @@ RETURN VALUE: 
    void 
 ===========================================================================*/ 
 // static int GobiUSBNetModExit(struct platform_device *pdev) 
-static int GobiUSBNetModExit(void) 
+static void GobiUSBNetModExit(void) 
 { 
    usb_deregister( &GobiNet ); 
    class_destroy( gpClass ); 
-   return 0; 
+   return; 
 } 
 
george@ubuntu-1610:~/Downloads/gobiusbnet$ make all 
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module.* modules.order 
make -C /lib/modules/4.8.0-27-generic/build M=/home/george/Downloads/gobiusbnet modules 
make[1]: Entering directory '/usr/src/linux-headers-4.8.0-27-generic' 
  CC [M]  /home/george/Downloads/gobiusbnet/qmap.o 
  CC [M]  /home/george/Downloads/gobiusbnet/GobiUSBNet.o 
/home/george/Downloads/gobiusbnet/GobiUSBNet.c: In function ‘GobiUSBNetStartXmit’: 
/home/george/Downloads/gobiusbnet/GobiUSBNet.c:876:8: error: ‘struct net_device’ has no member named ‘trans_start’; did you mean ‘mem_start’? 
    pNet->trans_start = jiffies; 
        ^~ 
scripts/Makefile.build:289: recipe for target '/home/george/Downloads/gobiusbnet/GobiUSBNet.o' failed 
make[2]: *** [/home/george/Downloads/gobiusbnet/GobiUSBNet.o] Error 1 
Makefile:1489: recipe for target '_module_/home/george/Downloads/gobiusbnet' failed 
make[1]: *** [_module_/home/george/Downloads/gobiusbnet] Error 2 
make[1]: Leaving directory '/usr/src/linux-headers-4.8.0-27-generic' 
Makefile:8: recipe for target 'all' failed 
make: *** [all] Error 2 
george@ubuntu-1610:~/Downloads/gobiusbnet$  
 
  
GobiUSBNet.c:876 
@@ -873,7 +873,7 @@ int GobiUSBNetStartXmit( 
    complete( &pAutoPM->mThreadDoWork ); 
  
    // Start transfer timer 
-   pNet->trans_start = jiffies; 
+   netif_trans_update(pNet); 
    // Free SKB 
    dev_kfree_skb_any( pSKB ); 
 
george@ubuntu-1610:~/Downloads/gobiusbnet$ make all 
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module.* modules.order 
make -C /lib/modules/4.8.0-27-generic/build M=/home/george/Downloads/gobiusbnet modules 
make[1]: Entering directory '/usr/src/linux-headers-4.8.0-27-generic' 
  CC [M]  /home/george/Downloads/gobiusbnet/qmap.o 
  CC [M]  /home/george/Downloads/gobiusbnet/GobiUSBNet.o 
  CC [M]  /home/george/Downloads/gobiusbnet/QMIDevice.o 
/home/george/Downloads/gobiusbnet/QMIDevice.c: In function ‘UserspaceIOCTL’: 
/home/george/Downloads/gobiusbnet/QMIDevice.c:2272:26: error: ‘struct file’ has no member named ‘f_dentry’; did you mean ‘f_owner’? 
       pFilp->f_op = pFilp->f_dentry->d_inode->i_fop; 
                          ^~ 
/home/george/Downloads/gobiusbnet/QMIDevice.c: In function ‘UserspaceClose’: 
/home/george/Downloads/gobiusbnet/QMIDevice.c:2393:21: error: passing argument 1 of ‘atomic_read’ from incompatible pointer type [-Werror=incompatible-pointer-types] 
    if (atomic_read( &pFilp->f_count ) != 1) 
                     ^ 
In file included from ./arch/x86/include/asm/msr.h:66:0, 
                 from ./arch/x86/include/asm/processor.h:20, 
                 from ./arch/x86/include/asm/cpufeature.h:4, 
                 from ./arch/x86/include/asm/thread_info.h:52, 
                 from ./include/linux/thread_info.h:54, 
                 from ./arch/x86/include/asm/preempt.h:6, 
                 from ./include/linux/preempt.h:59, 
                 from ./include/linux/spinlock.h:50, 
                 from ./include/linux/mm_types.h:8, 
                 from ./include/linux/kmemcheck.h:4, 
                 from ./include/linux/skbuff.h:18, 
                 from ./include/linux/if_ether.h:23, 
                 from ./include/linux/etherdevice.h:25, 
                 from /home/george/Downloads/gobiusbnet/Structs.h:47, 
                 from /home/george/Downloads/gobiusbnet/QMIDevice.h:95, 
                 from /home/george/Downloads/gobiusbnet/QMIDevice.c:91: 
./arch/x86/include/asm/atomic.h:24:28: note: expected ‘const atomic_t * {aka const struct <anonymous> *}’ but argument is of type ‘atomic_long_t * {aka struct <anonymous> *}’ 
 static __always_inline int atomic_read(const atomic_t *v) 
                            ^~~~~~~~~~~ 
/home/george/Downloads/gobiusbnet/QMIDevice.c:2430:26: error: ‘struct file’ has no member named ‘f_dentry’; did you mean ‘f_owner’? 
       pFilp->f_op = pFilp->f_dentry->d_inode->i_fop; 
                          ^~ 
/home/george/Downloads/gobiusbnet/QMIDevice.c: In function ‘UserspaceRead’: 
/home/george/Downloads/gobiusbnet/QMIDevice.c:2489:26: error: ‘struct file’ has no member named ‘f_dentry’; did you mean ‘f_owner’? 
       pFilp->f_op = pFilp->f_dentry->d_inode->i_fop; 
                          ^~ 
/home/george/Downloads/gobiusbnet/QMIDevice.c: In function ‘UserspaceWrite’: 
/home/george/Downloads/gobiusbnet/QMIDevice.c:2570:26: error: ‘struct file’ has no member named ‘f_dentry’; did you mean ‘f_owner’? 
       pFilp->f_op = pFilp->f_dentry->d_inode->i_fop; 
                          ^~ 
/home/george/Downloads/gobiusbnet/QMIDevice.c: In function ‘UserspacePoll’: 
/home/george/Downloads/gobiusbnet/QMIDevice.c:2649:26: error: ‘struct file’ has no member named ‘f_dentry’; did you mean ‘f_owner’? 
       pFilp->f_op = pFilp->f_dentry->d_inode->i_fop; 
                          ^~ 
/home/george/Downloads/gobiusbnet/QMIDevice.c: In function ‘DeregisterQMIDevice’: 
/home/george/Downloads/gobiusbnet/QMIDevice.c:3006:43: error: ‘struct file’ has no member named ‘f_dentry’; did you mean ‘f_owner’? 
                if (pFilp != NULL &&  pFilp->f_dentry != NULL) 
                                           ^~ 
/home/george/Downloads/gobiusbnet/QMIDevice.c:3008:28: error: ‘struct file’ has no member named ‘f_dentry’; did you mean ‘f_owner’? 
                   if (pFilp->f_dentry->d_inode == pOpenInode) 
                            ^~ 
/home/george/Downloads/gobiusbnet/QMIDevice.c:3053:46: error: ‘struct file’ has no member named ‘f_dentry’; did you mean ‘f_owner’? 
                   if (pFilp != NULL &&  pFilp->f_dentry != NULL) 
                                              ^~ 
/home/george/Downloads/gobiusbnet/QMIDevice.c:3055:31: error: ‘struct file’ has no member named ‘f_dentry’; did you mean ‘f_owner’? 
                      if (pFilp->f_dentry->d_inode == pOpenInode) 
                               ^~ 
cc1: some warnings being treated as errors 
scripts/Makefile.build:289: recipe for target '/home/george/Downloads/gobiusbnet/QMIDevice.o' failed 
make[2]: *** [/home/george/Downloads/gobiusbnet/QMIDevice.o] Error 1 
Makefile:1489: recipe for target '_module_/home/george/Downloads/gobiusbnet' failed 
make[1]: *** [_module_/home/george/Downloads/gobiusbnet] Error 2 
make[1]: Leaving directory '/usr/src/linux-headers-4.8.0-27-generic' 
Makefile:8: recipe for target 'all' failed 
make: *** [all] Error 2 
 
     
    -               if (pFilp != NULL &&  pFilp->f_dentry != NULL) 
+               if (pFilp != NULL &&  pFilp->f_path.dentry != NULL)^M 
george@ubuntu-1610:~/Downloads/gobiusbnet$ make all 
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module.* modules.order 
make -C /lib/modules/4.8.0-27-generic/build M=/home/george/Downloads/gobiusbnet modules 
make[1]: Entering directory '/usr/src/linux-headers-4.8.0-27-generic' 
  CC [M]  /home/george/Downloads/gobiusbnet/qmap.o 
  CC [M]  /home/george/Downloads/gobiusbnet/GobiUSBNet.o 
  CC [M]  /home/george/Downloads/gobiusbnet/QMIDevice.o 
/home/george/Downloads/gobiusbnet/QMIDevice.c: In function ‘UserspaceClose’: 
/home/george/Downloads/gobiusbnet/QMIDevice.c:2393:21: error: passing argument 1 of ‘atomic_read’ from incompatible pointer type [-Werror=incompatible-pointer-types] 
    if (atomic_read( &pFilp->f_count ) != 1) 
                     ^ 
In file included from ./arch/x86/include/asm/msr.h:66:0, 
                 from ./arch/x86/include/asm/processor.h:20, 
                 from ./arch/x86/include/asm/cpufeature.h:4, 
                 from ./arch/x86/include/asm/thread_info.h:52, 
                 from ./include/linux/thread_info.h:54, 
                 from ./arch/x86/include/asm/preempt.h:6, 
                 from ./include/linux/preempt.h:59, 
                 from ./include/linux/spinlock.h:50, 
                 from ./include/linux/mm_types.h:8, 
                 from ./include/linux/kmemcheck.h:4, 
                 from ./include/linux/skbuff.h:18, 
                 from ./include/linux/if_ether.h:23, 
                 from ./include/linux/etherdevice.h:25, 
                 from /home/george/Downloads/gobiusbnet/Structs.h:47, 
                 from /home/george/Downloads/gobiusbnet/QMIDevice.h:95, 
                 from /home/george/Downloads/gobiusbnet/QMIDevice.c:91: 
./arch/x86/include/asm/atomic.h:24:28: note: expected ‘const atomic_t * {aka const struct <anonymous> *}’ but argument is of type ‘atomic_long_t * {aka struct <anonymous> *}’ 
 static __always_inline int atomic_read(const atomic_t *v) 
                            ^~~~~~~~~~~ 
cc1: some warnings being treated as errors 
scripts/Makefile.build:289: recipe for target '/home/george/Downloads/gobiusbnet/QMIDevice.o' failed 
make[2]: *** [/home/george/Downloads/gobiusbnet/QMIDevice.o] Error 1 
Makefile:1489: recipe for target '_module_/home/george/Downloads/gobiusbnet' failed 
make[1]: *** [_module_/home/george/Downloads/gobiusbnet] Error 2 
make[1]: Leaving directory '/usr/src/linux-headers-4.8.0-27-generic' 
Makefile:8: recipe for target 'all' failed 
make: *** [all] Error 2 
 
@@ -2390,7 +2390,7 @@ int UserspaceClose( 
    } 
  
    // Fallthough.  If f_count == 1 no need to do more checks 
-   if (atomic_read( &pFilp->f_count ) != 1) 
+   if (atomic_long_read( &pFilp->f_count ) != 1)^M 
    { 
       rcu_read_lock(); 
       for_each_process( pEachTask ) 
george@ubuntu-1610:~/Downloads/gobiusbnet$ make all 
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module.* modules.order 
make -C /lib/modules/4.8.0-27-generic/build M=/home/george/Downloads/gobiusbnet modules 
make[1]: Entering directory '/usr/src/linux-headers-4.8.0-27-generic' 
  CC [M]  /home/george/Downloads/gobiusbnet/qmap.o 
  CC [M]  /home/george/Downloads/gobiusbnet/GobiUSBNet.o 
  CC [M]  /home/george/Downloads/gobiusbnet/QMIDevice.o 
  CC [M]  /home/george/Downloads/gobiusbnet/QMI.o 
  LD [M]  /home/george/Downloads/gobiusbnet/GobiNet.o 
  Building modules, stage 2. 
  MODPOST 1 modules 
  CC      /home/george/Downloads/gobiusbnet/GobiNet.mod.o 
  LD [M]  /home/george/Downloads/gobiusbnet/GobiNet.ko 
make[1]: Leaving directory '/usr/src/linux-headers-4.8.0-27-generic'

The disk is offline because it has a signature collision with another disk that is online 1

Recently, we cloned a hard disk using dd.
When we booted into Windows, the new drive was not visible.
After checking with the disk utilities, we got the following informative message:

The disk is offline because it has a signature collision with another disk that is online

To resolve the issue, we used diskpart.
To start diskpart, press the key combination Win + R which will pop up the Run prompt.
Type diskpart in the input box and hit the Enter key.

A new terminal window will appear.
Using that we identified the two disks and changed the label for the second one.

First step:

We issued list disk to get the list of disks.

DISKPART

Microsoft DiskPart version 10.0.14393.0
Copyright (C) 1999-2013 Microsoft Corporation.
On computer: BYTEFREAKS-NET

DISKPART> list disk

  Disk ###  Status         Size     Free     Dyn  Gpt
  --------  -------------  -------  -------  ---  ---
  Disk 0    Online          931 GB      0 B
  Disk 1    Offline         465 GB      0 B

Second step:

We issued select disk 1 so that we could process the disk 1 that was offline and using uniqueid disk we got the signature of the disk.

DISKPART> select disk 1
Disk 1 is now the selected disk.

DISKPART> uniqueid disk
Disk ID: 09FC13CB

Third step:

Set the signature of the disk to a random value other than the one that it already had using the command uniqueid disk ID=FFAABBCCDD

DISKPART> uniqueid disk ID=FFAABBCCDD

DISKPART> uniqueid disk
Disk ID: FFAABBCCDD

The random value must be 8 characters long and each character must be a value between 0-9 or A-F.

Finally:

Restart the machine to get both disks running.