]> git.proxmox.com Git - mirror_ubuntu-kernels.git/blobdiff - fs/ntfs3/super.c
Merge tag 'ntfs3_for_6.0' of https://github.com/Paragon-Software-Group/linux-ntfs3
[mirror_ubuntu-kernels.git] / fs / ntfs3 / super.c
index 6fad173a8b8f43747cc152bd9bd7dcb3ed585596..47012c9bf505e8a42631a51a7d9b25d4b1228534 100644 (file)
@@ -669,9 +669,11 @@ static u32 format_size_gb(const u64 bytes, u32 *mb)
 
 static u32 true_sectors_per_clst(const struct NTFS_BOOT *boot)
 {
-       return boot->sectors_per_clusters <= 0x80
-                      ? boot->sectors_per_clusters
-                      : (1u << (0 - boot->sectors_per_clusters));
+       if (boot->sectors_per_clusters <= 0x80)
+               return boot->sectors_per_clusters;
+       if (boot->sectors_per_clusters >= 0xf4) /* limit shift to 2MB max */
+               return 1U << (0 - boot->sectors_per_clusters);
+       return -EINVAL;
 }
 
 /*
@@ -714,6 +716,8 @@ static int ntfs_init_from_boot(struct super_block *sb, u32 sector_size,
 
        /* cluster size: 512, 1K, 2K, 4K, ... 2M */
        sct_per_clst = true_sectors_per_clst(boot);
+       if ((int)sct_per_clst < 0)
+               goto out;
        if (!is_power_of_2(sct_per_clst))
                goto out;
 
@@ -890,7 +894,6 @@ static int ntfs_fill_super(struct super_block *sb, struct fs_context *fc)
        int err;
        struct ntfs_sb_info *sbi = sb->s_fs_info;
        struct block_device *bdev = sb->s_bdev;
-       struct request_queue *rq;
        struct inode *inode;
        struct ntfs_inode *ni;
        size_t i, tt;
@@ -922,15 +925,14 @@ static int ntfs_fill_super(struct super_block *sb, struct fs_context *fc)
                goto out;
        }
 
-       rq = bdev_get_queue(bdev);
-       if (blk_queue_discard(rq) && rq->limits.discard_granularity) {
-               sbi->discard_granularity = rq->limits.discard_granularity;
+       if (bdev_max_discard_sectors(bdev) && bdev_discard_granularity(bdev)) {
+               sbi->discard_granularity = bdev_discard_granularity(bdev);
                sbi->discard_granularity_mask_inv =
                        ~(u64)(sbi->discard_granularity - 1);
        }
 
        /* Parse boot. */
-       err = ntfs_init_from_boot(sb, rq ? queue_logical_block_size(rq) : 512,
+       err = ntfs_init_from_boot(sb, bdev_logical_block_size(bdev),
                                  bdev_nr_bytes(bdev));
        if (err)
                goto out;
@@ -1343,7 +1345,7 @@ int ntfs_discard(struct ntfs_sb_info *sbi, CLST lcn, CLST len)
                return 0;
 
        err = blkdev_issue_discard(sb->s_bdev, start >> 9, (end - start) >> 9,
-                                  GFP_NOFS, 0);
+                                  GFP_NOFS);
 
        if (err == -EOPNOTSUPP)
                sbi->flags |= NTFS_FLAGS_NODISCARD;