]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/fs-io.c
Update bcachefs sources to 8dbfede1d9 fixup! bcachefs: More info on check_bucket_ref...
[bcachefs-tools-debian] / libbcachefs / fs-io.c
index 1ce0c93126c17162c8b7f95dd29631c14caf5493..e088bbcccc8d90f67693463ae3316cac91f7b798 100644 (file)
@@ -812,7 +812,7 @@ static void bch2_set_page_dirty(struct bch_fs *c,
        i_sectors_acct(c, inode, &res->quota, dirty_sectors);
 
        if (!PageDirty(page))
-               __set_page_dirty_nobuffers(page);
+               filemap_dirty_folio(inode->v.i_mapping, page_folio(page));
 }
 
 vm_fault_t bch2_page_fault(struct vm_fault *vmf)
@@ -2607,15 +2607,11 @@ retry:
        if (ret)
                goto err;
 
-       for_each_btree_key_norestart(&trans, iter, BTREE_ID_extents, start, 0, k, ret) {
-               if (bkey_ge(bkey_start_pos(k.k), end))
-                       break;
-
+       for_each_btree_key_upto_norestart(&trans, iter, BTREE_ID_extents, start, end, 0, k, ret)
                if (bkey_extent_is_data(k.k)) {
                        ret = 1;
                        break;
                }
-       }
        start = iter.pos;
        bch2_trans_iter_exit(&trans, &iter);
 err:
@@ -2655,8 +2651,8 @@ static int __bch2_truncate_page(struct bch_inode_info *inode,
                 * page
                 */
                ret = range_has_data(c, inode->ei_subvol,
-                               POS(inode->v.i_ino, index << PAGE_SECTORS_SHIFT),
-                               POS(inode->v.i_ino, (index + 1) << PAGE_SECTORS_SHIFT));
+                               POS(inode->v.i_ino, (index << PAGE_SECTORS_SHIFT)),
+                               POS(inode->v.i_ino, (index << PAGE_SECTORS_SHIFT) + PAGE_SECTORS));
                if (ret <= 0)
                        return ret;
 
@@ -2719,7 +2715,7 @@ static int __bch2_truncate_page(struct bch_inode_info *inode,
         * redirty the full page:
         */
        page_mkclean(page);
-       __set_page_dirty_nobuffers(page);
+       filemap_dirty_folio(mapping, page_folio(page));
 unlock:
        unlock_page(page);
        put_page(page);
@@ -3038,7 +3034,7 @@ static long bchfs_fcollapse_finsert(struct bch_inode_info *inode,
 
                k = insert
                        ? bch2_btree_iter_peek_prev(&src)
-                       : bch2_btree_iter_peek(&src);
+                       : bch2_btree_iter_peek_upto(&src, POS(inode->v.i_ino, U64_MAX));
                if ((ret = bkey_err(k)))
                        continue;
 
@@ -3284,7 +3280,7 @@ long bch2_fallocate_dispatch(struct file *file, int mode,
        struct bch_fs *c = inode->v.i_sb->s_fs_info;
        long ret;
 
-       if (!percpu_ref_tryget_live(&c->writes))
+       if (!bch2_write_ref_tryget(c, BCH_WRITE_REF_fallocate))
                return -EROFS;
 
        inode_lock(&inode->v);
@@ -3308,11 +3304,15 @@ long bch2_fallocate_dispatch(struct file *file, int mode,
 err:
        bch2_pagecache_block_put(inode);
        inode_unlock(&inode->v);
-       percpu_ref_put(&c->writes);
+       bch2_write_ref_put(c, BCH_WRITE_REF_fallocate);
 
        return bch2_err_class(ret);
 }
 
+/*
+ * Take a quota reservation for unallocated blocks in a given file range
+ * Does not check pagecache
+ */
 static int quota_reserve_range(struct bch_inode_info *inode,
                               struct quota_res *res,
                               u64 start, u64 end)
@@ -3448,9 +3448,9 @@ err:
 
 /* fseek: */
 
-static int page_data_offset(struct page *page, unsigned offset)
+static int folio_data_offset(struct folio *folio, unsigned offset)
 {
-       struct bch_page_state *s = bch2_page_state(page);
+       struct bch_page_state *s = bch2_page_state(&folio->page);
        unsigned i;
 
        if (s)
@@ -3481,8 +3481,7 @@ static loff_t bch2_seek_pagecache_data(struct inode *vinode,
                        struct folio *folio = fbatch.folios[i];
 
                        folio_lock(folio);
-
-                       offset = page_data_offset(&folio->page,
+                       offset = folio_data_offset(folio,
                                        folio->index == start_index
                                        ? start_offset & (PAGE_SIZE - 1)
                                        : 0);
@@ -3494,7 +3493,6 @@ static loff_t bch2_seek_pagecache_data(struct inode *vinode,
                                folio_batch_release(&fbatch);
                                return ret;
                        }
-
                        folio_unlock(folio);
                }
                folio_batch_release(&fbatch);
@@ -3528,11 +3526,11 @@ retry:
        if (ret)
                goto err;
 
-       for_each_btree_key_norestart(&trans, iter, BTREE_ID_extents,
-                          SPOS(inode->v.i_ino, offset >> 9, snapshot), 0, k, ret) {
-               if (k.k->p.inode != inode->v.i_ino) {
-                       break;
-               } else if (bkey_extent_is_data(k.k)) {
+       for_each_btree_key_upto_norestart(&trans, iter, BTREE_ID_extents,
+                          SPOS(inode->v.i_ino, offset >> 9, snapshot),
+                          POS(inode->v.i_ino, U64_MAX),
+                          0, k, ret) {
+               if (bkey_extent_is_data(k.k)) {
                        next_data = max(offset, bkey_start_offset(k.k) << 9);
                        break;
                } else if (k.k->p.offset >> 9 > isize)