Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8c540a96 authored by David Woodhouse's avatar David Woodhouse Committed by Jens Axboe
Browse files

Let the block device know when sectors can be discarded



[hirofumi@mail.parknet.co.jp: discard _after_ checking for corrupt chains]

Signed-off-by: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
Acked-by: default avatarOGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
parent fb2dce86
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/msdos_fs.h>
#include <linux/blkdev.h>

struct fatent_operations {
	void (*ent_blocknr)(struct super_block *, int, int *, sector_t *);
@@ -535,6 +536,7 @@ int fat_free_clusters(struct inode *inode, int cluster)
	struct fat_entry fatent;
	struct buffer_head *bhs[MAX_BUF_PER_PAGE];
	int i, err, nr_bhs;
	int first_cl = cluster;

	nr_bhs = 0;
	fatent_init(&fatent);
@@ -551,6 +553,18 @@ int fat_free_clusters(struct inode *inode, int cluster)
			goto error;
		}

		/* 
		 * Issue discard for the sectors we no longer care about,
		 * batching contiguous clusters into one request
		 */
		if (cluster != fatent.entry + 1) {
			int nr_clus = fatent.entry - first_cl + 1;

			sb_issue_discard(sb, fat_clus_to_blknr(sbi, first_cl),
					 nr_clus * sbi->sec_per_clus);
			first_cl = cluster;
		}

		ops->ent_put(&fatent, FAT_ENT_FREE);
		if (sbi->free_clusters != -1) {
			sbi->free_clusters++;