diff options
Diffstat (limited to 'fs/jfs/jfs_discard.c')
-rw-r--r-- | fs/jfs/jfs_discard.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/fs/jfs/jfs_discard.c b/fs/jfs/jfs_discard.c index 9947563e4175..dfcd50304559 100644 --- a/fs/jfs/jfs_discard.c +++ b/fs/jfs/jfs_discard.c | |||
@@ -83,7 +83,7 @@ int jfs_ioc_trim(struct inode *ip, struct fstrim_range *range) | |||
83 | struct bmap *bmp = JFS_SBI(ip->i_sb)->bmap; | 83 | struct bmap *bmp = JFS_SBI(ip->i_sb)->bmap; |
84 | struct super_block *sb = ipbmap->i_sb; | 84 | struct super_block *sb = ipbmap->i_sb; |
85 | int agno, agno_end; | 85 | int agno, agno_end; |
86 | s64 start, end, minlen; | 86 | u64 start, end, minlen; |
87 | u64 trimmed = 0; | 87 | u64 trimmed = 0; |
88 | 88 | ||
89 | /** | 89 | /** |
@@ -93,15 +93,19 @@ int jfs_ioc_trim(struct inode *ip, struct fstrim_range *range) | |||
93 | * minlen: minimum extent length in Bytes | 93 | * minlen: minimum extent length in Bytes |
94 | */ | 94 | */ |
95 | start = range->start >> sb->s_blocksize_bits; | 95 | start = range->start >> sb->s_blocksize_bits; |
96 | if (start < 0) | ||
97 | start = 0; | ||
98 | end = start + (range->len >> sb->s_blocksize_bits) - 1; | 96 | end = start + (range->len >> sb->s_blocksize_bits) - 1; |
99 | if (end >= bmp->db_mapsize) | ||
100 | end = bmp->db_mapsize - 1; | ||
101 | minlen = range->minlen >> sb->s_blocksize_bits; | 97 | minlen = range->minlen >> sb->s_blocksize_bits; |
102 | if (minlen <= 0) | 98 | if (minlen == 0) |
103 | minlen = 1; | 99 | minlen = 1; |
104 | 100 | ||
101 | if (minlen > bmp->db_agsize || | ||
102 | start >= bmp->db_mapsize || | ||
103 | range->len < sb->s_blocksize) | ||
104 | return -EINVAL; | ||
105 | |||
106 | if (end >= bmp->db_mapsize) | ||
107 | end = bmp->db_mapsize - 1; | ||
108 | |||
105 | /** | 109 | /** |
106 | * we trim all ag's within the range | 110 | * we trim all ag's within the range |
107 | */ | 111 | */ |