ext4: fix reading new encrypted symlinks on no-journal file systems
On a filesystem with no journal, a symlink longer than about 32 characters (exact length depending on padding for encryption) could not be followed or read immediately after being created in an encrypted directory. This happened because when the symlink data went through the delayed allocation path instead of the journaling path, the symlink was incorrectly detected as a "fast" symlink rather than a "slow" symlink until its data was written out. To fix this, disable delayed allocation for symlinks, since there is no benefit for delayed allocation anyway. Reported-by: Eric Biggers <ebiggers@google.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:
parent
3a4b77cd47
commit
4db0d88e2e
|
@ -2902,7 +2902,8 @@ static int ext4_da_write_begin(struct file *file, struct address_space *mapping,
|
||||||
|
|
||||||
index = pos >> PAGE_SHIFT;
|
index = pos >> PAGE_SHIFT;
|
||||||
|
|
||||||
if (ext4_nonda_switch(inode->i_sb)) {
|
if (ext4_nonda_switch(inode->i_sb) ||
|
||||||
|
S_ISLNK(inode->i_mode)) {
|
||||||
*fsdata = (void *)FALL_BACK_TO_NONDELALLOC;
|
*fsdata = (void *)FALL_BACK_TO_NONDELALLOC;
|
||||||
return ext4_write_begin(file, mapping, pos,
|
return ext4_write_begin(file, mapping, pos,
|
||||||
len, flags, pagep, fsdata);
|
len, flags, pagep, fsdata);
|
||||||
|
|
Loading…
Reference in New Issue