Skip to contentSkip to conversation

hfsplus: fix expand when not enough available space

PATCH Superseded Sergei Antonov 2 participants 2 messages Mar 23, 2015

Subsystems (2)

v1 of 2 Superseded Latest is v2 →

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 hfsplus: fix expand when not enough available space

HFS+ does not support file size > allocated size, therefore the following command should fail:
truncate --size=<size exceeding available space> <some file>
However, it ends successfully. The driver returns success despite having been unable to allocate the requested space for the file. Also filesystem check finds an error:
Checking catalog file.
Incorrect size for file test_file
(It should be 469094400 instead of 1000000000)

Add a piece of code analogous to code in the fat driver. Now a proper error is returned and filesystem remains consistent.

Cc Andrew Morton <[email protected]>
Cc Vyacheslav Dubeyko <[email protected]>
Cc Hin-Tak Leung <[email protected]>
Cc Anton Altaparmakov <[email protected]>
Cc Al Viro <[email protected]>
Cc Christoph Hellwig <[email protected]>
Cc Sougata Santra <[email protected]>
---
 fs/hfsplus/inode.c | 6 ++++++
 1 file changed, 6 insertions(+)
fs/hfsplus/inode.c +6 -0
index 0cf786f..7691cc1 100644
@@ -254,6 +254,12 @@ static int hfsplus_setattr(struct dentry *dentry, struct iattr *attr)
 	if ((attr->ia_valid & ATTR_SIZE) &&
 	    attr->ia_size != i_size_read(inode)) {
 		inode_dio_wait(inode);
+		if (attr->ia_size > inode->i_size) {
+			error = generic_cont_expand_simple(inode,
+							   attr->ia_size);
+			if (error)
+				return error;
+		}
 		truncate_setsize(inode, attr->ia_size);
 		hfsplus_file_truncate(inode);
 	}
Signature · 1 line
2.1.2
#1 lore raw
Quoted 10 lines · Sergei Antonov

HFS+ does not support file size > allocated size, therefore the following command should fail:
truncate --size=<size exceeding available space> <some file>
However, it ends successfully. The driver returns success despite having been unable to allocate the requested space for the file. Also filesystem check finds an error:
Checking catalog file.
Incorrect size for file test_file
(It should be 469094400 instead of 1000000000)

Quoted 3 lines

Add a piece of code analogous to code in the fat driver. Now a proper error is returned and filesystem remains consistent.

To be honest, I am not fully understand what is the case of the fix. As a result, I can understand correctness of the fix. Could you describe the issue and the fix in more details? Could you provide more clear description of the use-case of such issue? Anyway, this fix requires in more clear and detailed description.

Thanks,
Vyacheslav Dubeyko.

Quoted 29 lines
Cc Andrew Morton <[email protected]>
Cc Vyacheslav Dubeyko <[email protected]>
Cc Hin-Tak Leung <[email protected]>
Cc Anton Altaparmakov <[email protected]>
Cc Al Viro <[email protected]>
Cc Christoph Hellwig <[email protected]>
Cc Sougata Santra <[email protected]>
---
 fs/hfsplus/inode.c | 6 ++++++
 1 file changed, 6 insertions(+)
fs/hfsplus/inode.c +6 -0
index 0cf786f..7691cc1 100644
@@ -254,6 +254,12 @@ static int hfsplus_setattr(struct dentry *dentry, struct iattr *attr)
 	if ((attr->ia_valid & ATTR_SIZE) &&
 	    attr->ia_size != i_size_read(inode)) {
 		inode_dio_wait(inode);
+		if (attr->ia_size > inode->i_size) {
+			error = generic_cont_expand_simple(inode,
+							   attr->ia_size);
+			if (error)
+				return error;
+		}
 		truncate_setsize(inode, attr->ia_size);
 		hfsplus_file_truncate(inode);
 	}