summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManuel Bentele2020-11-16 08:42:24 +0100
committerManuel Bentele2020-11-16 08:42:24 +0100
commit8e017bde7e260a8d0a262ba31df531e8385e96cb (patch)
tree3f996ec9accf095884437bfa9c2b86d84caf02bb
parent[BUILD] add support to locate build directory out of Git directory (diff)
downloadxloop-8e017bde7e260a8d0a262ba31df531e8385e96cb.tar.gz
xloop-8e017bde7e260a8d0a262ba31df531e8385e96cb.tar.xz
xloop-8e017bde7e260a8d0a262ba31df531e8385e96cb.zip
Add upstream and compatibility changes for Linux kernel 5.10 and 4.19
-rw-r--r--README.md13
-rw-r--r--src/kernel/xloop_main.c32
2 files changed, 43 insertions, 2 deletions
diff --git a/README.md b/README.md
index 1552091..8b06805 100644
--- a/README.md
+++ b/README.md
@@ -12,6 +12,7 @@ and the user space utility **xlosetup** to configure xloop devices. The xloop Li
- Archlinux with **Linux kernel 5.9.x** or **5.4.x**
- Ubuntu 20.04 with **Linux kernel 5.4.x**
+ - Ubuntu 18.04 with **Linux kernel 4.19.x**
- CentOS 8 with **Linux kernel 4.18.x**
@@ -45,6 +46,18 @@ apt-get install git \
rpm
```
+#### Ubuntu 18.04 with Linux kernel 4.19.x
+```shell
+apt-get install git \
+ make \
+ cmake \
+ gcc \
+ linux-headers-generic \
+ libcap-dev \
+ libncurses-dev \
+ rpm
+```
+
#### CentOS 8 with Linux kernel 4.18.x
```shell
yum install git \
diff --git a/src/kernel/xloop_main.c b/src/kernel/xloop_main.c
index 300554f..de1fc3d 100644
--- a/src/kernel/xloop_main.c
+++ b/src/kernel/xloop_main.c
@@ -254,9 +254,16 @@ static void xloop_set_size(struct xloop_device *xlo, loff_t size)
sector_t capacity;
#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)
+ bd_set_nr_sectors(bdev, size);
+#else
bd_set_size(bdev, size << SECTOR_SHIFT);
+#endif
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 7, 0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)
+ if (!set_capacity_revalidate_and_notify(xlo->xlo_disk, size, false))
+ kobject_uevent(&disk_to_dev(bdev->bd_disk)->kobj, KOBJ_CHANGE);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 7, 0)
set_capacity_revalidate_and_notify(xlo->xlo_disk, size, false);
#else
capacity = get_capacity(xlo->xlo_disk);
@@ -792,7 +799,9 @@ static int xloop_configure(struct xloop_device *xlo, fmode_t mode,
struct file *file;
struct inode *inode;
struct address_space *mapping;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 2, 0)
struct block_device *claimed_bdev = NULL;
+#endif
int error;
loff_t size;
bool partscan;
@@ -816,12 +825,17 @@ static int xloop_configure(struct xloop_device *xlo, fmode_t mode,
error = bd_prepare_to_claim(bdev, claimed_bdev, xloop_configure);
if (error)
goto out_putf;
-#else
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 2, 0)
claimed_bdev = bd_start_claiming(bdev, xloop_configure);
if (IS_ERR(claimed_bdev)) {
error = PTR_ERR(claimed_bdev);
goto out_putf;
}
+#else
+ bdgrab(bdev);
+ error = blkdev_get(bdev, mode | FMODE_EXCL, xloop_configure);
+ if (error)
+ goto out_putf;
#endif
}
@@ -915,15 +929,25 @@ static int xloop_configure(struct xloop_device *xlo, fmode_t mode,
mutex_unlock(&xloop_ctl_mutex);
if (partscan)
xloop_reread_partitions(xlo, bdev);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 2, 0)
if (claimed_bdev)
bd_abort_claiming(bdev, claimed_bdev, xloop_configure);
+#else
+ if (!(mode & FMODE_EXCL))
+ blkdev_put(bdev, mode | FMODE_EXCL);
+#endif
return 0;
out_unlock:
mutex_unlock(&xloop_ctl_mutex);
out_bdev:
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 2, 0)
if (claimed_bdev)
bd_abort_claiming(bdev, claimed_bdev, xloop_configure);
+#else
+ if (!(mode & FMODE_EXCL))
+ blkdev_put(bdev, mode | FMODE_EXCL);
+#endif
out_putf:
fput(file);
out:
@@ -984,7 +1008,11 @@ static int __xloop_clr_fd(struct xloop_device *xlo, bool release)
set_capacity(xlo->xlo_disk, 0);
xloop_sysfs_exit(xlo);
if (bdev) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)
+ bd_set_nr_sectors(bdev, 0);
+#else
bd_set_size(bdev, 0);
+#endif
/* let user-space know about this change */
kobject_uevent(&disk_to_dev(bdev->bd_disk)->kobj, KOBJ_CHANGE);
}