@@ -5004,6 +5004,40 @@ static int statmount_fs_type(struct kstatmount *s, struct seq_file *seq)
5004
5004
return 0 ;
5005
5005
}
5006
5006
5007
+ static void statmount_fs_subtype (struct kstatmount * s , struct seq_file * seq )
5008
+ {
5009
+ struct super_block * sb = s -> mnt -> mnt_sb ;
5010
+
5011
+ if (sb -> s_subtype )
5012
+ seq_puts (seq , sb -> s_subtype );
5013
+ }
5014
+
5015
+ static int statmount_sb_source (struct kstatmount * s , struct seq_file * seq )
5016
+ {
5017
+ struct super_block * sb = s -> mnt -> mnt_sb ;
5018
+ struct mount * r = real_mount (s -> mnt );
5019
+
5020
+ if (sb -> s_op -> show_devname ) {
5021
+ size_t start = seq -> count ;
5022
+ int ret ;
5023
+
5024
+ ret = sb -> s_op -> show_devname (seq , s -> mnt -> mnt_root );
5025
+ if (ret )
5026
+ return ret ;
5027
+
5028
+ if (unlikely (seq_has_overflowed (seq )))
5029
+ return - EAGAIN ;
5030
+
5031
+ /* Unescape the result */
5032
+ seq -> buf [seq -> count ] = '\0' ;
5033
+ seq -> count = start ;
5034
+ seq_commit (seq , string_unescape_inplace (seq -> buf + start , UNESCAPE_OCTAL ));
5035
+ } else if (r -> mnt_devname ) {
5036
+ seq_puts (seq , r -> mnt_devname );
5037
+ }
5038
+ return 0 ;
5039
+ }
5040
+
5007
5041
static void statmount_mnt_ns_id (struct kstatmount * s , struct mnt_namespace * ns )
5008
5042
{
5009
5043
s -> sm .mask |= STATMOUNT_MNT_NS_ID ;
@@ -5040,33 +5074,48 @@ static int statmount_mnt_opts(struct kstatmount *s, struct seq_file *seq)
5040
5074
5041
5075
static int statmount_string (struct kstatmount * s , u64 flag )
5042
5076
{
5043
- int ret ;
5077
+ int ret = 0 ;
5044
5078
size_t kbufsize ;
5045
5079
struct seq_file * seq = & s -> seq ;
5046
5080
struct statmount * sm = & s -> sm ;
5081
+ u32 start = seq -> count ;
5047
5082
5048
5083
switch (flag ) {
5049
5084
case STATMOUNT_FS_TYPE :
5050
- sm -> fs_type = seq -> count ;
5085
+ sm -> fs_type = start ;
5051
5086
ret = statmount_fs_type (s , seq );
5052
5087
break ;
5053
5088
case STATMOUNT_MNT_ROOT :
5054
- sm -> mnt_root = seq -> count ;
5089
+ sm -> mnt_root = start ;
5055
5090
ret = statmount_mnt_root (s , seq );
5056
5091
break ;
5057
5092
case STATMOUNT_MNT_POINT :
5058
- sm -> mnt_point = seq -> count ;
5093
+ sm -> mnt_point = start ;
5059
5094
ret = statmount_mnt_point (s , seq );
5060
5095
break ;
5061
5096
case STATMOUNT_MNT_OPTS :
5062
- sm -> mnt_opts = seq -> count ;
5097
+ sm -> mnt_opts = start ;
5063
5098
ret = statmount_mnt_opts (s , seq );
5064
5099
break ;
5100
+ case STATMOUNT_FS_SUBTYPE :
5101
+ sm -> fs_subtype = start ;
5102
+ statmount_fs_subtype (s , seq );
5103
+ break ;
5104
+ case STATMOUNT_SB_SOURCE :
5105
+ sm -> sb_source = start ;
5106
+ ret = statmount_sb_source (s , seq );
5107
+ break ;
5065
5108
default :
5066
5109
WARN_ON_ONCE (true);
5067
5110
return - EINVAL ;
5068
5111
}
5069
5112
5113
+ /*
5114
+ * If nothing was emitted, return to avoid setting the flag
5115
+ * and terminating the buffer.
5116
+ */
5117
+ if (seq -> count == start )
5118
+ return ret ;
5070
5119
if (unlikely (check_add_overflow (sizeof (* sm ), seq -> count , & kbufsize )))
5071
5120
return - EOVERFLOW ;
5072
5121
if (kbufsize >= s -> bufsize )
@@ -5201,6 +5250,12 @@ static int do_statmount(struct kstatmount *s, u64 mnt_id, u64 mnt_ns_id,
5201
5250
if (!err && s -> mask & STATMOUNT_MNT_OPTS )
5202
5251
err = statmount_string (s , STATMOUNT_MNT_OPTS );
5203
5252
5253
+ if (!err && s -> mask & STATMOUNT_FS_SUBTYPE )
5254
+ err = statmount_string (s , STATMOUNT_FS_SUBTYPE );
5255
+
5256
+ if (!err && s -> mask & STATMOUNT_SB_SOURCE )
5257
+ err = statmount_string (s , STATMOUNT_SB_SOURCE );
5258
+
5204
5259
if (!err && s -> mask & STATMOUNT_MNT_NS_ID )
5205
5260
statmount_mnt_ns_id (s , ns );
5206
5261
@@ -5222,7 +5277,8 @@ static inline bool retry_statmount(const long ret, size_t *seq_size)
5222
5277
}
5223
5278
5224
5279
#define STATMOUNT_STRING_REQ (STATMOUNT_MNT_ROOT | STATMOUNT_MNT_POINT | \
5225
- STATMOUNT_FS_TYPE | STATMOUNT_MNT_OPTS)
5280
+ STATMOUNT_FS_TYPE | STATMOUNT_MNT_OPTS | \
5281
+ STATMOUNT_FS_SUBTYPE | STATMOUNT_SB_SOURCE)
5226
5282
5227
5283
static int prepare_kstatmount (struct kstatmount * ks , struct mnt_id_req * kreq ,
5228
5284
struct statmount __user * buf , size_t bufsize ,
0 commit comments