On Mon, Mar 28, 2011 at 3:21 PM, OGAWA Hirofumi <hirofumi@xxxxxxxxxxxxxxxxxx> wrote: > Kyungmin Park <kmpark@xxxxxxxxxxxxx> writes: > >>>> + start = range->start >> sb->s_blocksize_bits; >>>> + start = start / sbi->sec_per_clus; >>> >>> start is round-down, I think it's strange interface. E.g. user specified >>> the range as "start=10 len=1024". So the range should be 10-1034, >>> i.e. (assume cluster-size is 512) 512-1024, right? >> >> I don't know what's the correct way? If you're right. it's better to round-up. >> If cluster-size is 32KiB and start sector is in the middle of cluster, >> then which is better. round-down or round-up? > > It depends on the design of this interface though, I bet it's round-up, > and should use same way with other FSes. > >>>> + minlen = range->minlen >> sb->s_blocksize_bits; >>>> + minlen = minlen / sbi->sec_per_clus; >>>> + trimmed = 0; >>>> + count = 0; >>>> + err = -EINVAL; >>>> + >>>> + lock_fat(sbi); >>>> + if (sbi->free_clusters != -1 && sbi->free_clus_valid) >>>> + goto out; >>> >>> free clusters count validation doesn't matter here. If you want to check >>> free cluster count, you should check free_clusters==0 or not (after >>> validation). >> >> I borrowed it from "fat_count_free_clusters()". anyway fill fix it. > > Yes. fat_count_free_clusters() needs to check free_clusters value, > because it updates free_clusters value. If it's uptodate, does nothing. > >>>> + if (start < FAT_START_ENT) >>>> + start = FAT_START_ENT; >>> >>> Valid data cluster is 2 - max_cluster, but it should be mapped to 0 - >>> (max_cluster - FAT_START_ENT). Otherwise this interface's abstraction is >>> useless, right? >> >> user program don't know the filesystem internals. The same program is >> used for ext4 and fat. so it should be handled at filesystem. > > Yes. It's what I'm saying. If user wants to trim 0-2 then user will > specify 0-2, but this trims only 2. It's not right. There's similar code at ext4. it adjusts the start and len value if given start is less than first_data_blk. if (start < first_data_blk) { len -= first_data_blk - start; start = first_data_blk; } > >>>> + fatent_set_entry(&fatent, start); >>>> + >>>> + while (count < sbi->max_cluster) { >>>> + if (fatent.entry >= sbi->max_cluster) >>>> + fatent.entry = FAT_START_ENT; >>> >>> Why do we cyclic this? >> If the start is middle and len is the whole disk size, then check the >> all clusters. > > Strange design. If user wants to trim between middle and end, user have > to know length from middle correctly? Ext4 really does it? You're right, it only check the one-direction. else return -EINVAL. if (first_group > last_group) return -EINVAL; > > Thanks. > -- > OGAWA Hirofumi <hirofumi@xxxxxxxxxxxxxxxxxx> > -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html