#include "ea.h"
#include "iomap.h"
#include "bitmap.h"
+#include "volume.h"
#include <linux/filelock.h>
if (ni->reparse_tag == IO_REPARSE_TAG_MOUNT_POINT ||
(ni->reparse_tag == IO_REPARSE_TAG_SYMLINK &&
!(ni->reparse_flags & cpu_to_le32(SYMLINK_FLAG_RELATIVE)))) {
- err = ntfs_translate_symlink_path(dentry, ni->target, &target);
- if (err < 0)
- return ERR_PTR(err);
-
- set_delayed_call(done, kfree_link, target);
- return target;
+ if (NVolNativeSymlinkRel(ni->vol)) {
+ err = ntfs_translate_symlink_path(dentry, ni->target, &target);
+ if (err < 0)
+ return ERR_PTR(err);
+ set_delayed_call(done, kfree_link, target);
+ return target;
+ }
}
return ni->target;
seq_puts(sf, ",discard");
if (NVolDisableSparse(vol))
seq_puts(sf, ",disable_sparse");
+ if (NVolNativeSymlinkRel(vol))
+ seq_puts(sf, ",native_symlink=rel");
+ else
+ seq_puts(sf, ",native_symlink=raw");
if (vol->sb->s_flags & SB_POSIXACL)
seq_puts(sf, ",acl");
return 0;
{}
};
+enum {
+ NATIVE_SYMLINK_RAW,
+ NATIVE_SYMLINK_REL,
+};
+
+static const struct constant_table ntfs_native_symlink_enums[] = {
+ { "raw", NATIVE_SYMLINK_RAW },
+ { "rel", NATIVE_SYMLINK_REL },
+ {}
+};
+
enum {
Opt_uid,
Opt_gid,
Opt_acl,
Opt_discard,
Opt_nocase,
+ Opt_native_symlink,
};
static const struct fs_parameter_spec ntfs_parameters[] = {
fsparam_flag("discard", Opt_discard),
fsparam_flag("sparse", Opt_sparse),
fsparam_flag("nocase", Opt_nocase),
+ fsparam_enum("native_symlink", Opt_native_symlink, ntfs_native_symlink_enums),
{}
};
else
NVolClearDisableSparse(vol);
break;
+ case Opt_native_symlink:
+ if (result.uint_32 == NATIVE_SYMLINK_REL)
+ NVolSetNativeSymlinkRel(vol);
+ else
+ NVolClearNativeSymlinkRel(vol);
+ break;
case Opt_sparse:
break;
default:
*
* NV_Discard Issue discard/TRIM commands for freed clusters.
* NV_DisableSparse Disable creation of sparse regions.
+ * NV_NativeSymlinkRel Translate absolute Windows reparse targets (native_symlink=rel).
*/
enum {
NV_Errors,
NV_CheckWindowsNames,
NV_Discard,
NV_DisableSparse,
+ NV_NativeSymlinkRel,
};
/*
DEFINE_NVOL_BIT_OPS(CheckWindowsNames)
DEFINE_NVOL_BIT_OPS(Discard)
DEFINE_NVOL_BIT_OPS(DisableSparse)
+DEFINE_NVOL_BIT_OPS(NativeSymlinkRel)
static inline void ntfs_inc_free_clusters(struct ntfs_volume *vol, s64 nr)
{