|
@@ -651,6 +651,18 @@ static int ovl_symlink(struct inode *dir, struct dentry *dentry,
|
|
return ovl_create_object(dentry, S_IFLNK, 0, link);
|
|
return ovl_create_object(dentry, S_IFLNK, 0, link);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int ovl_set_link_redirect(struct dentry *dentry)
|
|
|
|
+{
|
|
|
|
+ const struct cred *old_cred;
|
|
|
|
+ int err;
|
|
|
|
+
|
|
|
|
+ old_cred = ovl_override_creds(dentry->d_sb);
|
|
|
|
+ err = ovl_set_redirect(dentry, false);
|
|
|
|
+ revert_creds(old_cred);
|
|
|
|
+
|
|
|
|
+ return err;
|
|
|
|
+}
|
|
|
|
+
|
|
static int ovl_link(struct dentry *old, struct inode *newdir,
|
|
static int ovl_link(struct dentry *old, struct inode *newdir,
|
|
struct dentry *new)
|
|
struct dentry *new)
|
|
{
|
|
{
|
|
@@ -670,7 +682,7 @@ static int ovl_link(struct dentry *old, struct inode *newdir,
|
|
goto out_drop_write;
|
|
goto out_drop_write;
|
|
|
|
|
|
if (ovl_is_metacopy_dentry(old)) {
|
|
if (ovl_is_metacopy_dentry(old)) {
|
|
- err = ovl_set_redirect(old, false);
|
|
|
|
|
|
+ err = ovl_set_link_redirect(old);
|
|
if (err)
|
|
if (err)
|
|
goto out_drop_write;
|
|
goto out_drop_write;
|
|
}
|
|
}
|