@@ -96,6 +96,8 @@ debugfs_fill(PFS_FILL_ARGS)
96
96
vn .v_data = d -> dm_data ;
97
97
buf = uio -> uio_iov [0 ].iov_base ;
98
98
len = min (uio -> uio_iov [0 ].iov_len , uio -> uio_resid );
99
+ uio -> uio_offset = 0 ;
100
+
99
101
off = 0 ;
100
102
lf .private_data = NULL ;
101
103
rc = d -> dm_fops -> open (& vn , & lf );
@@ -106,11 +108,29 @@ debugfs_fill(PFS_FILL_ARGS)
106
108
return (- rc );
107
109
}
108
110
sf = lf .private_data ;
109
- sf -> buf = sb ;
111
+
110
112
if (uio -> uio_rw == UIO_READ )
111
- rc = d -> dm_fops -> read (& lf , NULL , len , & off );
113
+ {
114
+ len = min (len , sb -> s_size );
115
+ sf -> buf = sb ;
116
+ rc = d -> dm_fops -> read (& lf , buf , len , & off );
117
+
118
+ if ( sbuf_len (sb ) == 0 && rc > 0 )
119
+ sbuf_bcopyin ( sb , buf , rc );
120
+ }
112
121
else
113
- rc = d -> dm_fops -> write (& lf , buf , len , & off );
122
+ {
123
+ struct sbuf sb_local ;
124
+ int error ;
125
+
126
+ sbuf_uionew (& sb_local , uio , & error );
127
+ if ( error )
128
+ return error ;
129
+
130
+ sf -> buf = & sb_local ;
131
+ rc = d -> dm_fops -> write (& lf , buf , len , & off );
132
+ sbuf_delete (& sb_local );
133
+ }
114
134
if (d -> dm_fops -> release )
115
135
d -> dm_fops -> release (& vn , & lf );
116
136
else
@@ -150,7 +170,7 @@ debugfs_create_file(const char *name, umode_t mode,
150
170
else
151
171
pnode = debugfs_root ;
152
172
153
- flags = fops -> write ? PFS_RDWR : PFS_RD ;
173
+ flags = ( fops -> write ? PFS_RDWR : PFS_RD ) | PFS_RAWWR ;
154
174
dnode -> d_pfs_node = pfs_create_file (pnode , name , debugfs_fill ,
155
175
debugfs_attr , NULL , debugfs_destroy , flags );
156
176
dnode -> d_pfs_node -> pn_data = dm ;
0 commit comments