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 <b...@debian.org>  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

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to