On Mon 18-04-22 14:37:35, Zhang Yi wrote: > Symlink's external data block is one kind of metadata block, and now > that almost all ext4 metadata block's page cache (e.g. directory blocks, > quota blocks...) belongs to bdev backing inode except the symlink. It > is essentially worked in data=journal mode like other regular file's > data block because probably in order to make it simple for generic VFS > code handling symlinks or some other historical reasons, but the logic > of creating external data block in ext4_symlink() is complicated. and it > also make things confused if user do not want to let the filesystem > worked in data=journal mode. This patch convert the final exceptional > case and make things clean, move the mapping of the symlink's external > data block to bdev like any other metadata block does. > > Signed-off-by: Zhang Yi <yi.zhang@xxxxxxxxxx> The patch looks good now except for one problem: > +static const char *ext4_get_link(struct dentry *dentry, struct inode *inode, > + struct delayed_call *callback) > +{ > + struct buffer_head *bh; > + > + if (!dentry) { > + bh = ext4_getblk(NULL, inode, 0, 0); This is problematic because in RCU walk mode we must not sleep and ext4_getblk() may sleep in ext4_map_blocks(). So we'd need some trick to avoid that. Honza -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR