Re: [PATCH v11 2/9] block: Add copy offload support infrastructure

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 23/05/30 01:29PM, Maurizio Lombardi wrote:
po 22. 5. 2023 v 13:17 odesílatel Nitesh Shetty <nj.shetty@xxxxxxxxxxx> napsal:

+static int __blkdev_copy_offload(struct block_device *bdev_in, loff_t pos_in,
+               struct block_device *bdev_out, loff_t pos_out, size_t len,
+               cio_iodone_t endio, void *private, gfp_t gfp_mask)
+{
+       struct cio *cio;
+       struct copy_ctx *ctx;
+       struct bio *read_bio, *write_bio;
+       struct page *token;
+       sector_t copy_len;
+       sector_t rem, max_copy_len;
+
+       cio = kzalloc(sizeof(struct cio), GFP_KERNEL);
+       if (!cio)
+               return -ENOMEM;
+       atomic_set(&cio->refcount, 0);
+       cio->waiter = current;
+       cio->endio = endio;
+       cio->private = private;
+
+       max_copy_len = min(bdev_max_copy_sectors(bdev_in),
+                       bdev_max_copy_sectors(bdev_out)) << SECTOR_SHIFT;
+
+       cio->pos_in = pos_in;
+       cio->pos_out = pos_out;
+       /* If there is a error, comp_len will be set to least successfully
+        * completed copied length
+        */
+       cio->comp_len = len;
+       for (rem = len; rem > 0; rem -= copy_len) {
+               copy_len = min(rem, max_copy_len);
+
+               token = alloc_page(gfp_mask);
+               if (unlikely(!token))
+                       goto err_token;

[...]

+err_token:
+       cio->comp_len = min_t(sector_t, cio->comp_len, (len - rem));
+       if (!atomic_read(&cio->refcount))
+               return -ENOMEM;
+       /* Wait for submitted IOs to complete */
+       return blkdev_copy_wait_completion(cio);
+}

Suppose the first call to "token = alloc_page()" fails (and
cio->refcount == 0), isn't "cio" going to be leaked here?

Maurizio


Agreed, will free it in "err_token", and will update next version.

Thank you,
Nitesh Shetty





[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux