- buf_end = seq->buf + seq->count;
- *buf_end = '\0';
- for (opt_start = buf_start + 1; opt_start < buf_end; opt_start = opt_end + 1) {
- opt_end = strchrnul(opt_start, ',');
- *opt_end = '\0';
- buf_start += string_unescape(opt_start, buf_start, 0, UNESCAPE_OCTAL) + 1;
- if (WARN_ON_ONCE(++count == 0))
- return -EOVERFLOW;
- }
- seq->count = buf_start - 1 - seq->buf;
- s->sm.opt_num = count;
+ err = statmount_opt_unescape(seq, buf_start);
+ if (err < 0)
+ return err;
+
+ s->sm.opt_num = err;
+ return 0;
+}
+
+static int statmount_opt_sec_array(struct kstatmount *s, struct seq_file *seq)
+{
+ struct vfsmount *mnt = s->mnt;
+ struct super_block *sb = mnt->mnt_sb;
+ size_t start = seq->count;
+ char *buf_start;
+ int err;
+
+ buf_start = seq->buf + start;
+
+ err = security_sb_show_options(seq, sb);
+ if (!err)
+ return err;
+
+ if (unlikely(seq_has_overflowed(seq)))
+ return -EAGAIN;
+
+ if (seq->count == start)
+ return 0;
+
+ err = statmount_opt_unescape(seq, buf_start);
+ if (err < 0)
+ return err;
+
+ s->sm.opt_sec_num = err;