/* on error: continue, panic, remount-ro */
        enum exfat_error_mode errors;
        unsigned utf8:1, /* Use of UTF-8 character set */
+                sys_tz:1, /* Use local timezone */
                 discard:1, /* Issue discard requests on deletions */
                 keep_last_dots:1; /* Keep trailing periods in paths */
        int time_offset; /* Offset of timestamps from UTC (in minutes) */
 
                ts->tv_sec += TIMEZONE_SEC(0x80 - tz_off);
 }
 
+static inline int exfat_tz_offset(struct exfat_sb_info *sbi)
+{
+       if (sbi->options.sys_tz)
+               return -sys_tz.tz_minuteswest;
+       return sbi->options.time_offset;
+}
+
 /* Convert a EXFAT time/date pair to a UNIX date (seconds since 1 1 70). */
 void exfat_get_entry_time(struct exfat_sb_info *sbi, struct timespec64 *ts,
                u8 tz, __le16 time, __le16 date, u8 time_cs)
                /* Adjust timezone to UTC0. */
                exfat_adjust_tz(ts, tz & ~EXFAT_TZ_VALID);
        else
-               /* Convert from local time to UTC using time_offset. */
-               ts->tv_sec -= sbi->options.time_offset * SECS_PER_MIN;
+               ts->tv_sec -= exfat_tz_offset(sbi) * SECS_PER_MIN;
 }
 
 /* Convert linear UNIX date to a EXFAT time/date pair. */
 
                seq_puts(m, ",discard");
        if (opts->keep_last_dots)
                seq_puts(m, ",keep_last_dots");
-       if (opts->time_offset)
+       if (opts->sys_tz)
+               seq_puts(m, ",sys_tz");
+       else if (opts->time_offset)
                seq_printf(m, ",time_offset=%d", opts->time_offset);
        return 0;
 }
        Opt_errors,
        Opt_discard,
        Opt_keep_last_dots,
+       Opt_sys_tz,
        Opt_time_offset,
 
        /* Deprecated options */
        fsparam_enum("errors",                  Opt_errors, exfat_param_enums),
        fsparam_flag("discard",                 Opt_discard),
        fsparam_flag("keep_last_dots",          Opt_keep_last_dots),
+       fsparam_flag("sys_tz",                  Opt_sys_tz),
        fsparam_s32("time_offset",              Opt_time_offset),
        __fsparam(NULL, "utf8",                 Opt_utf8, fs_param_deprecated,
                  NULL),
        case Opt_keep_last_dots:
                opts->keep_last_dots = 1;
                break;
+       case Opt_sys_tz:
+               opts->sys_tz = 1;
+               break;
        case Opt_time_offset:
                /*
                 * Make the limit 24 just in case someone invents something