hfsplus: prevent btree data loss on ENOSPC
Inserting or deleting a record in a btree may require splitting several of its nodes. If we hit ENOSPC halfway through, the new nodes will be left orphaned and their records will be lost. This could mean lost inodes, extents or xattrs. Henceforth, check the available disk space before making any changes. This still leaves the potential problem of corruption on ENOMEM. The patch can be tested with xfstests generic/027. Link: http://lkml.kernel.org/r/4596eef22fbda137b4ffa0272d92f0da15364421.1536269129.git.ernesto.mnd.fernandez@gmail.com Signed-off-by: Ernesto A. Fernández <ernesto.mnd.fernandez@gmail.com> Cc: Christoph Hellwig <hch@lst.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:

committed by
Linus Torvalds

parent
ef75bcc576
commit
d92915c35b
@@ -100,6 +100,10 @@ static int __hfsplus_ext_write_extent(struct inode *inode,
|
||||
if (hip->extent_state & HFSPLUS_EXT_NEW) {
|
||||
if (res != -ENOENT)
|
||||
return res;
|
||||
/* Fail early and avoid ENOSPC during the btree operation */
|
||||
res = hfs_bmap_reserve(fd->tree, fd->tree->depth + 1);
|
||||
if (res)
|
||||
return res;
|
||||
hfs_brec_insert(fd, hip->cached_extents,
|
||||
sizeof(hfsplus_extent_rec));
|
||||
hip->extent_state &= ~(HFSPLUS_EXT_DIRTY | HFSPLUS_EXT_NEW);
|
||||
|
Reference in New Issue
Block a user