Control: tag -1 patch The attached patch fixes both user-space and kernel builds. I haven't used cloop before, but I briefly tested the kernel driver with these changes.
I found that it was necessary to use the -r option to losetup when setting up a cloop device; this might be the result of using set_disk_ro() instead of set_device_ro(). If this is a change in behaviour then the documentation should be updated. losetup -d doesn't seem to work on cloop devices, and I don't know if this is a regression. Ben. -- Ben Hutchings For every complex problem there is a solution that is simple, neat, and wrong.
--- a/advancecomp-1.15/file.cc
+++ b/advancecomp-1.15/file.cc
@@ -98,7 +98,7 @@
/**
* Check if a file exists.
*/
-bool file_exists(const string& path) throw (error)
+bool file_exists(const string& path)
{
struct stat s;
if (stat(path.c_str(), &s) != 0) {
@@ -114,7 +114,7 @@
/**
* Write a whole file.
*/
-void file_write(const string& path, const char* data, unsigned size) throw (error)
+void file_write(const string& path, const char* data, unsigned size)
{
FILE* f = fopen(path.c_str(), "wb");
if (!f)
@@ -134,7 +134,7 @@
/**
* Read a whole file.
*/
-void file_read(const string& path, char* data, unsigned size) throw (error)
+void file_read(const string& path, char* data, unsigned size)
{
file_read(path, data, 0, size);
}
@@ -142,7 +142,7 @@
/**
* Read a whole file.
*/
-void file_read(const string& path, char* data, unsigned offset, unsigned size) throw (error)
+void file_read(const string& path, char* data, unsigned offset, unsigned size)
{
FILE* f = fopen(path.c_str(), "rb");
if (!f)
@@ -166,7 +166,7 @@
/**
* Get the time of a file.
*/
-time_t file_time(const string& path) throw (error)
+time_t file_time(const string& path)
{
struct stat s;
if (stat(path.c_str(), &s)!=0)
@@ -178,7 +178,7 @@
/**
* Set the time of a file.
*/
-void file_utime(const string& path, time_t tod) throw (error)
+void file_utime(const string& path, time_t tod)
{
struct utimbuf u;
@@ -192,7 +192,7 @@
/**
* Get the size of a file.
*/
-unsigned file_size(const string& path) throw (error)
+unsigned file_size(const string& path)
{
struct stat s;
if (stat(path.c_str(), &s)!=0)
@@ -204,7 +204,7 @@
/**
* Get the crc of a file.
*/
-crc_t file_crc(const string& path) throw (error)
+crc_t file_crc(const string& path)
{
unsigned size = file_size(path);
@@ -227,7 +227,7 @@
/**
* Copy a file.
*/
-void file_copy(const string& path1, const string& path2) throw (error)
+void file_copy(const string& path1, const string& path2)
{
unsigned size;
@@ -249,7 +249,7 @@
/**
* Move a file.
*/
-void file_move(const string& path1, const string& path2) throw (error)
+void file_move(const string& path1, const string& path2)
{
if (rename(path1.c_str(), path2.c_str())!=0
&& errno==EXDEV) {
@@ -271,7 +271,7 @@
/**
* Remove a file.
*/
-void file_remove(const string& path1) throw (error)
+void file_remove(const string& path1)
{
if (remove(path1.c_str())!=0) {
throw error() << "Failed remove of " << path1;
@@ -281,7 +281,7 @@
/**
* Rename a file.
*/
-void file_rename(const string& path1, const string& path2) throw (error)
+void file_rename(const string& path1, const string& path2)
{
if (rename(path1.c_str(), path2.c_str())!=0) {
throw error() << "Failed rename of " << path1 << " to " << path2;
@@ -400,7 +400,7 @@
/**
* Make a drectory tree.
*/
-void file_mktree(const std::string& path) throw (error)
+void file_mktree(const std::string& path)
{
string dir = file_dir(path);
string name = file_name(path);
--- a/advancecomp-1.15/file.h
+++ b/advancecomp-1.15/file.h
@@ -67,18 +67,18 @@
crc_t crc_compute(const char* data, unsigned len);
crc_t crc_compute(crc_t pred, const char* data, unsigned len);
-bool file_exists(const std::string& file) throw (error);
-void file_write(const std::string& path, const char* data, unsigned size) throw (error);
-void file_read(const std::string& path, char* data, unsigned size) throw (error);
-void file_read(const std::string& path, char* data, unsigned offset, unsigned size) throw (error);
-time_t file_time(const std::string& path) throw (error);
-void file_utime(const std::string& path, time_t tod) throw (error);
-unsigned file_size(const std::string& path) throw (error);
-crc_t file_crc(const std::string& path) throw (error);
-void file_copy(const std::string& path1, const std::string& path2) throw (error);
-void file_move(const std::string& path1, const std::string& path2) throw (error);
-void file_remove(const std::string& path1) throw (error);
-void file_mktree(const std::string& path1) throw (error);
+bool file_exists(const std::string& file);
+void file_write(const std::string& path, const char* data, unsigned size);
+void file_read(const std::string& path, char* data, unsigned size);
+void file_read(const std::string& path, char* data, unsigned offset, unsigned size);
+time_t file_time(const std::string& path);
+void file_utime(const std::string& path, time_t tod);
+unsigned file_size(const std::string& path);
+crc_t file_crc(const std::string& path);
+void file_copy(const std::string& path1, const std::string& path2);
+void file_move(const std::string& path1, const std::string& path2);
+void file_remove(const std::string& path1);
+void file_mktree(const std::string& path1);
std::string file_randomize(const std::string& path, int n) throw ();
std::string file_name(const std::string& file) throw ();
--- a/cloop.c
+++ b/cloop.c
@@ -309,15 +309,8 @@
while (buf_done < buf_len)
{
size_t size = buf_len - buf_done, size_read;
- mm_segment_t old_fs;
- /* kernel_read() only supports 32 bit offsets, so we use vfs_read() instead. */
- /* int size_read = kernel_read(f, pos, buf + buf_done, size); */
-
// mutex_lock(&clo->clo_rq_mutex);
- old_fs = get_fs();
- set_fs(KERNEL_DS);
- size_read = vfs_read(f, (void __user *)(buf + buf_done), size, &pos);
- set_fs(old_fs);
+ size_read = kernel_read(f, buf + buf_done, size, &pos);
// mutex_unlock(&clo->clo_rq_mutex);
if(size_read <= 0)
@@ -528,7 +521,7 @@
}
clo->backing_file = file;
clo->backing_inode= inode ;
- clo->underlying_total_size = (isblkdev) ? inode->i_bdev->bd_inode->i_size : inode->i_size;
+ clo->underlying_total_size = (isblkdev) ? file->f_mapping->host->i_size : inode->i_size;
if(clo->underlying_total_size < header_size)
{
printk(KERN_ERR "%s: %llu bytes (must be >= %u bytes)\n",
@@ -538,7 +531,7 @@
}
if(isblkdev)
{
- struct request_queue *q = bdev_get_queue(inode->i_bdev);
+ struct request_queue *q = bdev_get_queue(I_BDEV(file->f_mapping->host));
blk_queue_max_hw_sectors(clo->clo_queue, queue_max_hw_sectors(q)); /* Renamed in 2.6.34 */
blk_queue_max_segments(clo->clo_queue, queue_max_segments(q)); /* Renamed in 2.6.34 */
/* blk_queue_max_hw_segments(clo->clo_queue, queue_max_hw_segments(q)); */ /* Removed in 2.6.34 */
@@ -547,7 +540,7 @@
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)
blk_queue_merge_bvec(clo->clo_queue, q->merge_bvec_fn);
#endif
- clo->underlying_blksize = block_size(inode->i_bdev);
+ clo->underlying_blksize = block_size(I_BDEV(file->f_mapping->host));
}
else
clo->underlying_blksize = PAGE_SIZE;
@@ -816,7 +809,7 @@
file = fget(arg); /* get filp struct from ioctl arg fd */
if(!file) return -EBADF;
error=cloop_set_file(cloop_num,file);
- set_device_ro(bdev, 1);
+ set_disk_ro(clo->clo_disk, true);
if(error) fput(file);
return error;
}
@@ -1125,6 +1118,7 @@
static int cloop_alloc(int cloop_num)
{
struct cloop_device *clo = (struct cloop_device *) cloop_malloc(sizeof(struct cloop_device));
+ int error = -ENOMEM;
if(clo == NULL) goto error_out;
cloop_dev[cloop_num] = clo;
memset(clo, 0, sizeof(struct cloop_device));
@@ -1138,39 +1132,58 @@
clo->tag_set.flags = BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_BLOCKING;
clo->tag_set.driver_data = clo;
if(blk_mq_alloc_tag_set(&clo->tag_set)) goto error_out_free_clo;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 15, 0)
clo->clo_queue = blk_mq_init_queue(&clo->tag_set);
if(IS_ERR(clo->clo_queue))
{
printk(KERN_ERR "%s: Unable to alloc queue[%d]\n", cloop_name, cloop_num);
goto error_out_free_tags;
}
- clo->clo_queue->queuedata = clo;
- blk_queue_max_hw_sectors(clo->clo_queue, BLK_DEF_MAX_SECTORS);
clo->clo_disk = alloc_disk(1);
+#else
+ clo->clo_disk = blk_mq_alloc_disk(&clo->tag_set, NULL);
+#endif
if(!clo->clo_disk)
{
printk(KERN_ERR "%s: Unable to alloc disk[%d]\n", cloop_name, cloop_num);
goto error_out_free_queue;
}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5,15,0)
+ clo->clo_disk->queue = clo->clo_queue;
+#else
+ clo->clo_disk->minors = 1;
+ clo->clo_queue = clo->clo_disk->queue;
+#endif
+ clo->clo_queue->queuedata = clo;
+ blk_queue_max_hw_sectors(clo->clo_queue, BLK_DEF_MAX_SECTORS);
spin_lock_init(&clo->queue_lock);
mutex_init(&clo->clo_ctl_mutex);
mutex_init(&clo->clo_rq_mutex);
clo->clo_disk->major = cloop_major;
clo->clo_disk->first_minor = cloop_num;
clo->clo_disk->fops = &clo_fops;
- clo->clo_disk->queue = clo->clo_queue;
clo->clo_disk->private_data = clo;
sprintf(clo->clo_disk->disk_name, "%s%d", cloop_name, cloop_num);
- add_disk(clo->clo_disk);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,15,0)
+ error = add_disk(clo->clo_disk);
+ if (error)
+ goto error_out_free_disk;
+#endif
return 0;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,15,0)
+error_out_free_disk:
+ blk_cleanup_disk(clo->clo_disk);
+#endif
error_out_free_queue:
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5,15,0)
blk_cleanup_queue(clo->clo_queue);
error_out_free_tags:
+#endif
blk_mq_free_tag_set(&clo->tag_set);
error_out_free_clo:
cloop_free(clo, sizeof(struct cloop_device));
error_out:
- return -ENOMEM;
+ return error;
}
static void cloop_dealloc(int cloop_num)
@@ -1178,9 +1191,13 @@
struct cloop_device *clo = cloop_dev[cloop_num];
if(clo == NULL) return;
del_gendisk(clo->clo_disk);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,15,0)
+ blk_cleanup_disk(clo->clo_disk);
+#else
blk_cleanup_queue(clo->clo_queue);
- blk_mq_free_tag_set(&clo->tag_set);
put_disk(clo->clo_disk);
+#endif
+ blk_mq_free_tag_set(&clo->tag_set);
cloop_free(clo, sizeof(struct cloop_device));
cloop_dev[cloop_num] = NULL;
}
@@ -1269,8 +1286,3 @@
/* The cloop init and exit function registration (especially needed for Kernel 2.6) */
module_init(cloop_init);
module_exit(cloop_exit);
-
-#include <linux/vermagic.h>
-#include <linux/compiler.h>
-
-MODULE_INFO(vermagic, VERMAGIC_STRING);
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,23 @@
+cloop (3.14.1.3+nmu1) UNRELEASED; urgency=medium
+
+ * Non-maintainer upload
+ * Fix FTBFS with gcc 11 (Closes: #1005413):
+ - Remove exception specifications
+ * Fix module build for recent kernel versions (Closes: #1005414):
+ - Stop generating module vermagic in cloop.c. This has always been handled
+ by modpost and doing it here now results in build failure.
+ - Avoid using inode::i_bdev, which was removed in Linux 5.11.
+ - Use set_disk_ro() instead of set_device_ro(). The latter was not meant to
+ be used by device drivers and was removed in Linux 5.11.
+ - Use blk_{mq_alloc,cleanup}_disk() instead of separate queue and disk
+ allocation and cleanup on Linux 5.15+, since alloc_disk() was removed.
+ - Handle potential failure of add_disk() on Linux 5.15+.
+ - Use kernel_read() instead of vfs_read() and set_fs(). set_fs() is no
+ longer defined on some architectures, and kernel_read() has had large
+ file support since Linux 2.6.31.
+
+ -- Ben Hutchings <[email protected]> Sun, 13 Feb 2022 00:19:32 +0100
+
cloop (3.14.1.3) unstable; urgency=medium
* Upgrading to more recent debhelper and latest policy standards
signature.asc
Description: This is a digitally signed message part

