OSDN Git Service

Merge tag 'for-5.6/dm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/device...
[tomoyo/tomoyo-test1.git] / fs / erofs / zdata.c
index ca99425..80e47f0 100644 (file)
@@ -345,9 +345,8 @@ static int z_erofs_lookup_collection(struct z_erofs_collector *clt,
        struct z_erofs_pcluster *pcl;
        struct z_erofs_collection *cl;
        unsigned int length;
-       bool tag;
 
-       grp = erofs_find_workgroup(inode->i_sb, map->m_pa >> PAGE_SHIFT, &tag);
+       grp = erofs_find_workgroup(inode->i_sb, map->m_pa >> PAGE_SHIFT);
        if (!grp)
                return -ENOENT;
 
@@ -438,7 +437,7 @@ static int z_erofs_register_collection(struct z_erofs_collector *clt,
         */
        mutex_trylock(&cl->lock);
 
-       err = erofs_register_workgroup(inode->i_sb, &pcl->obj, 0);
+       err = erofs_register_workgroup(inode->i_sb, &pcl->obj);
        if (err) {
                mutex_unlock(&cl->lock);
                kmem_cache_free(pcluster_cachep, pcl);
@@ -1149,21 +1148,7 @@ static void move_to_bypass_jobqueue(struct z_erofs_pcluster *pcl,
        qtail[JQ_BYPASS] = &pcl->next;
 }
 
-static bool postsubmit_is_all_bypassed(struct z_erofs_decompressqueue *q[],
-                                      unsigned int nr_bios, bool force_fg)
-{
-       /*
-        * although background is preferred, no one is pending for submission.
-        * don't issue workqueue for decompression but drop it directly instead.
-        */
-       if (force_fg || nr_bios)
-               return false;
-
-       kvfree(q[JQ_SUBMIT]);
-       return true;
-}
-
-static bool z_erofs_submit_queue(struct super_block *sb,
+static void z_erofs_submit_queue(struct super_block *sb,
                                 z_erofs_next_pcluster_t owned_head,
                                 struct list_head *pagepool,
                                 struct z_erofs_decompressqueue *fgq,
@@ -1172,19 +1157,12 @@ static bool z_erofs_submit_queue(struct super_block *sb,
        struct erofs_sb_info *const sbi = EROFS_SB(sb);
        z_erofs_next_pcluster_t qtail[NR_JOBQUEUES];
        struct z_erofs_decompressqueue *q[NR_JOBQUEUES];
-       struct bio *bio;
        void *bi_private;
        /* since bio will be NULL, no need to initialize last_index */
        pgoff_t uninitialized_var(last_index);
-       bool force_submit = false;
-       unsigned int nr_bios;
-
-       if (owned_head == Z_EROFS_PCLUSTER_TAIL)
-               return false;
+       unsigned int nr_bios = 0;
+       struct bio *bio = NULL;
 
-       force_submit = false;
-       bio = NULL;
-       nr_bios = 0;
        bi_private = jobqueueset_init(sb, q, fgq, force_fg);
        qtail[JQ_BYPASS] = &q[JQ_BYPASS]->head;
        qtail[JQ_SUBMIT] = &q[JQ_SUBMIT]->head;
@@ -1194,11 +1172,9 @@ static bool z_erofs_submit_queue(struct super_block *sb,
 
        do {
                struct z_erofs_pcluster *pcl;
-               unsigned int clusterpages;
-               pgoff_t first_index;
-               struct page *page;
-               unsigned int i = 0, bypass = 0;
-               int err;
+               pgoff_t cur, end;
+               unsigned int i = 0;
+               bool bypass = true;
 
                /* no possible 'owned_head' equals the following */
                DBG_BUGON(owned_head == Z_EROFS_PCLUSTER_TAIL_CLOSED);
@@ -1206,55 +1182,50 @@ static bool z_erofs_submit_queue(struct super_block *sb,
 
                pcl = container_of(owned_head, struct z_erofs_pcluster, next);
 
-               clusterpages = BIT(pcl->clusterbits);
+               cur = pcl->obj.index;
+               end = cur + BIT(pcl->clusterbits);
 
                /* close the main owned chain at first */
                owned_head = cmpxchg(&pcl->next, Z_EROFS_PCLUSTER_TAIL,
                                     Z_EROFS_PCLUSTER_TAIL_CLOSED);
 
-               first_index = pcl->obj.index;
-               force_submit |= (first_index != last_index + 1);
+               do {
+                       struct page *page;
+                       int err;
 
-repeat:
-               page = pickup_page_for_submission(pcl, i, pagepool,
-                                                 MNGD_MAPPING(sbi),
-                                                 GFP_NOFS);
-               if (!page) {
-                       force_submit = true;
-                       ++bypass;
-                       goto skippage;
-               }
+                       page = pickup_page_for_submission(pcl, i++, pagepool,
+                                                         MNGD_MAPPING(sbi),
+                                                         GFP_NOFS);
+                       if (!page)
+                               continue;
 
-               if (bio && force_submit) {
+                       if (bio && cur != last_index + 1) {
 submit_bio_retry:
-                       submit_bio(bio);
-                       bio = NULL;
-               }
-
-               if (!bio) {
-                       bio = bio_alloc(GFP_NOIO, BIO_MAX_PAGES);
+                               submit_bio(bio);
+                               bio = NULL;
+                       }
 
-                       bio->bi_end_io = z_erofs_decompressqueue_endio;
-                       bio_set_dev(bio, sb->s_bdev);
-                       bio->bi_iter.bi_sector = (sector_t)(first_index + i) <<
-                               LOG_SECTORS_PER_BLOCK;
-                       bio->bi_private = bi_private;
-                       bio->bi_opf = REQ_OP_READ;
+                       if (!bio) {
+                               bio = bio_alloc(GFP_NOIO, BIO_MAX_PAGES);
 
-                       ++nr_bios;
-               }
+                               bio->bi_end_io = z_erofs_decompressqueue_endio;
+                               bio_set_dev(bio, sb->s_bdev);
+                               bio->bi_iter.bi_sector = (sector_t)cur <<
+                                       LOG_SECTORS_PER_BLOCK;
+                               bio->bi_private = bi_private;
+                               bio->bi_opf = REQ_OP_READ;
+                               ++nr_bios;
+                       }
 
-               err = bio_add_page(bio, page, PAGE_SIZE, 0);
-               if (err < PAGE_SIZE)
-                       goto submit_bio_retry;
+                       err = bio_add_page(bio, page, PAGE_SIZE, 0);
+                       if (err < PAGE_SIZE)
+                               goto submit_bio_retry;
 
-               force_submit = false;
-               last_index = first_index + i;
-skippage:
-               if (++i < clusterpages)
-                       goto repeat;
+                       last_index = cur;
+                       bypass = false;
+               } while (++cur < end);
 
-               if (bypass < clusterpages)
+               if (!bypass)
                        qtail[JQ_SUBMIT] = &pcl->next;
                else
                        move_to_bypass_jobqueue(pcl, qtail, owned_head);
@@ -1263,11 +1234,15 @@ skippage:
        if (bio)
                submit_bio(bio);
 
-       if (postsubmit_is_all_bypassed(q, nr_bios, *force_fg))
-               return true;
-
+       /*
+        * although background is preferred, no one is pending for submission.
+        * don't issue workqueue for decompression but drop it directly instead.
+        */
+       if (!*force_fg && !nr_bios) {
+               kvfree(q[JQ_SUBMIT]);
+               return;
+       }
        z_erofs_decompress_kickoff(q[JQ_SUBMIT], *force_fg, nr_bios);
-       return true;
 }
 
 static void z_erofs_runqueue(struct super_block *sb,
@@ -1276,9 +1251,9 @@ static void z_erofs_runqueue(struct super_block *sb,
 {
        struct z_erofs_decompressqueue io[NR_JOBQUEUES];
 
-       if (!z_erofs_submit_queue(sb, clt->owned_head,
-                                 pagepool, io, &force_fg))
+       if (clt->owned_head == Z_EROFS_PCLUSTER_TAIL)
                return;
+       z_erofs_submit_queue(sb, clt->owned_head, pagepool, io, &force_fg);
 
        /* handle bypass queue (no i/o pclusters) immediately */
        z_erofs_decompress_queue(&io[JQ_BYPASS], pagepool);