Merge tag 'gpio-updates-for-v5.19' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / fs / exfat / fatent.c
index a3464e5..9de6a6b 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/slab.h>
 #include <asm/unaligned.h>
 #include <linux/buffer_head.h>
+#include <linux/blkdev.h>
 
 #include "exfat_raw.h"
 #include "exfat_fs.h"
@@ -81,12 +82,6 @@ int exfat_ent_set(struct super_block *sb, unsigned int loc,
        return 0;
 }
 
-static inline bool is_valid_cluster(struct exfat_sb_info *sbi,
-               unsigned int clus)
-{
-       return clus >= EXFAT_FIRST_CLUSTER && clus < sbi->num_clusters;
-}
-
 int exfat_ent_get(struct super_block *sb, unsigned int loc,
                unsigned int *content)
 {
@@ -274,10 +269,9 @@ int exfat_zeroed_cluster(struct inode *dir, unsigned int clu)
 {
        struct super_block *sb = dir->i_sb;
        struct exfat_sb_info *sbi = EXFAT_SB(sb);
-       struct buffer_head *bhs[MAX_BUF_PER_PAGE];
-       int nr_bhs = MAX_BUF_PER_PAGE;
+       struct buffer_head *bh;
        sector_t blknr, last_blknr;
-       int err, i, n;
+       int i;
 
        blknr = exfat_cluster_to_sector(sbi, clu);
        last_blknr = blknr + sbi->sect_per_clus;
@@ -291,30 +285,23 @@ int exfat_zeroed_cluster(struct inode *dir, unsigned int clu)
        }
 
        /* Zeroing the unused blocks on this cluster */
-       while (blknr < last_blknr) {
-               for (n = 0; n < nr_bhs && blknr < last_blknr; n++, blknr++) {
-                       bhs[n] = sb_getblk(sb, blknr);
-                       if (!bhs[n]) {
-                               err = -ENOMEM;
-                               goto release_bhs;
-                       }
-                       memset(bhs[n]->b_data, 0, sb->s_blocksize);
-               }
-
-               err = exfat_update_bhs(bhs, n, IS_DIRSYNC(dir));
-               if (err)
-                       goto release_bhs;
+       for (i = blknr; i < last_blknr; i++) {
+               bh = sb_getblk(sb, i);
+               if (!bh)
+                       return -ENOMEM;
 
-               for (i = 0; i < n; i++)
-                       brelse(bhs[i]);
+               memset(bh->b_data, 0, sb->s_blocksize);
+               set_buffer_uptodate(bh);
+               mark_buffer_dirty(bh);
+               brelse(bh);
        }
-       return 0;
 
-release_bhs:
-       exfat_err(sb, "failed zeroed sect %llu\n", (unsigned long long)blknr);
-       for (i = 0; i < n; i++)
-               bforget(bhs[i]);
-       return err;
+       if (IS_DIRSYNC(dir))
+               return sync_blockdev_range(sb->s_bdev,
+                               EXFAT_BLK_TO_B(blknr, sb),
+                               EXFAT_BLK_TO_B(last_blknr, sb) - 1);
+
+       return 0;
 }
 
 int exfat_alloc_cluster(struct inode *inode, unsigned int num_alloc,