* of foreign LOV is relative path of faked symlink destination,
* to be completed by prefix
*/
- if (!(sbi->ll_flags & LL_SBI_FOREIGN_SYMLINK_UPCALL))
+ if (!test_bit(LL_SBI_FOREIGN_SYMLINK_UPCALL, sbi->ll_flags))
rc = ll_foreign_symlink_default_parse(sbi, inode, lfm,
destname);
else /* upcall is available */
static bool has_same_mount_namespace(struct ll_sb_info *sbi)
{
- int rc;
+ bool same;
- rc = (sbi->ll_mnt.mnt == current->fs->root.mnt);
- if (!rc)
+ same = (sbi->ll_mnt_ns == current->nsproxy->mnt_ns);
+ if (!same)
LCONSOLE_WARN("%s: client mount %s and '%s.%d' not in same mnt-namespace\n",
sbi->ll_fsname, sbi->ll_kset.kobj.name,
current->comm, current->pid);
- return rc;
+ return same;
}
ssize_t foreign_symlink_enable_show(struct kobject *kobj,
ll_kset.kobj);
return snprintf(buf, PAGE_SIZE, "%d\n",
- !!(sbi->ll_flags & LL_SBI_FOREIGN_SYMLINK));
+ test_bit(LL_SBI_FOREIGN_SYMLINK, sbi->ll_flags));
}
/*
return rc;
if (val)
- sbi->ll_flags |= LL_SBI_FOREIGN_SYMLINK;
+ set_bit(LL_SBI_FOREIGN_SYMLINK, sbi->ll_flags);
else
- sbi->ll_flags &= ~LL_SBI_FOREIGN_SYMLINK;
+ clear_bit(LL_SBI_FOREIGN_SYMLINK, sbi->ll_flags);
return count;
}
* order, we may end up using the format provided by a different
* upcall than the one set in ll_foreign_symlink_upcall
*/
- sbi->ll_flags &= ~LL_SBI_FOREIGN_SYMLINK_UPCALL;
+ clear_bit(LL_SBI_FOREIGN_SYMLINK_UPCALL, sbi->ll_flags);
up_write(&sbi->ll_foreign_symlink_sem);
if (strcmp(new, "none")) {
old_nb_items = sbi->ll_foreign_symlink_upcall_nb_items;
sbi->ll_foreign_symlink_upcall_items = new_items;
sbi->ll_foreign_symlink_upcall_nb_items = nb_items;
- sbi->ll_flags |= LL_SBI_FOREIGN_SYMLINK_UPCALL;
+ set_bit(LL_SBI_FOREIGN_SYMLINK_UPCALL, sbi->ll_flags);
up_write(&sbi->ll_foreign_symlink_sem);
/* free old_items */
RETURN(rc == 0 ? count : rc);
}
+/* foreign fake-symlink version of ll_getattr() */
+#if defined(HAVE_USER_NAMESPACE_ARG)
+int ll_foreign_symlink_getattr(struct user_namespace *mnt_userns,
+ const struct path *path, struct kstat *stat,
+ u32 request_mask, unsigned int flags)
+{
+ return ll_getattr_dentry(path->dentry, stat, request_mask, flags,
+ true);
+}
+#elif defined(HAVE_INODEOPS_ENHANCED_GETATTR)
+int ll_foreign_symlink_getattr(const struct path *path, struct kstat *stat,
+ u32 request_mask, unsigned int flags)
+{
+ return ll_getattr_dentry(path->dentry, stat, request_mask, flags,
+ true);
+}
+#else
+int ll_foreign_symlink_getattr(struct vfsmount *mnt, struct dentry *de,
+ struct kstat *stat)
+{
+ return ll_getattr_dentry(de, stat, STATX_BASIC_STATS,
+ AT_STATX_SYNC_AS_STAT, true);
+}
+#endif
+
struct inode_operations ll_foreign_file_symlink_inode_operations = {
#ifdef HAVE_IOP_GENERIC_READLINK
.readlink = generic_readlink,
#endif
.listxattr = ll_listxattr,
};
-
-/* foreign fake-symlink version of ll_getattr() */
-#ifdef HAVE_INODEOPS_ENHANCED_GETATTR
-int ll_foreign_symlink_getattr(const struct path *path, struct kstat *stat,
- u32 request_mask, unsigned int flags)
-{
- return ll_getattr_dentry(path->dentry, stat, request_mask, flags,
- true);
-}
-#else
-int ll_foreign_symlink_getattr(struct vfsmount *mnt, struct dentry *de,
- struct kstat *stat)
-{
- return ll_getattr_dentry(de, stat, STATX_BASIC_STATS,
- AT_STATX_SYNC_AS_STAT, true);
-}
-#endif