File tree Expand file tree Collapse file tree 4 files changed +42
-14
lines changed Expand file tree Collapse file tree 4 files changed +42
-14
lines changed Original file line number Diff line number Diff line change @@ -120,6 +120,7 @@ struct object_info {
120
120
struct adfs_dir_ops {
121
121
int (* read )(struct super_block * sb , unsigned int indaddr ,
122
122
unsigned int size , struct adfs_dir * dir );
123
+ int (* iterate )(struct adfs_dir * dir , struct dir_context * ctx );
123
124
int (* setpos )(struct adfs_dir * dir , unsigned int fpos );
124
125
int (* getnext )(struct adfs_dir * dir , struct object_info * obj );
125
126
int (* update )(struct adfs_dir * dir , struct object_info * obj );
Original file line number Diff line number Diff line change @@ -240,12 +240,8 @@ static int adfs_iterate(struct file *file, struct dir_context *ctx)
240
240
struct inode * inode = file_inode (file );
241
241
struct super_block * sb = inode -> i_sb ;
242
242
const struct adfs_dir_ops * ops = ADFS_SB (sb )-> s_dir ;
243
- struct object_info obj ;
244
243
struct adfs_dir dir ;
245
- int ret = 0 ;
246
-
247
- if (ctx -> pos >> 32 )
248
- return 0 ;
244
+ int ret ;
249
245
250
246
down_read (& adfs_dir_rwsem );
251
247
ret = adfs_dir_read_inode (sb , inode , & dir );
@@ -263,15 +259,7 @@ static int adfs_iterate(struct file *file, struct dir_context *ctx)
263
259
ctx -> pos = 2 ;
264
260
}
265
261
266
- ret = ops -> setpos (& dir , ctx -> pos - 2 );
267
- if (ret )
268
- goto unlock_relse ;
269
- while (ops -> getnext (& dir , & obj ) == 0 ) {
270
- if (!dir_emit (ctx , obj .name , obj .name_len ,
271
- obj .indaddr , DT_UNKNOWN ))
272
- break ;
273
- ctx -> pos ++ ;
274
- }
262
+ ret = ops -> iterate (& dir , ctx );
275
263
276
264
unlock_relse :
277
265
up_read (& adfs_dir_rwsem );
Original file line number Diff line number Diff line change @@ -302,6 +302,23 @@ adfs_f_getnext(struct adfs_dir *dir, struct object_info *obj)
302
302
return ret ;
303
303
}
304
304
305
+ static int adfs_f_iterate (struct adfs_dir * dir , struct dir_context * ctx )
306
+ {
307
+ struct object_info obj ;
308
+ int pos = 5 + (ctx -> pos - 2 ) * 26 ;
309
+
310
+ while (ctx -> pos < 2 + ADFS_NUM_DIR_ENTRIES ) {
311
+ if (__adfs_dir_get (dir , pos , & obj ))
312
+ break ;
313
+ if (!dir_emit (ctx , obj .name , obj .name_len ,
314
+ obj .indaddr , DT_UNKNOWN ))
315
+ break ;
316
+ pos += 26 ;
317
+ ctx -> pos ++ ;
318
+ }
319
+ return 0 ;
320
+ }
321
+
305
322
static int
306
323
adfs_f_update (struct adfs_dir * dir , struct object_info * obj )
307
324
{
@@ -359,6 +376,7 @@ adfs_f_update(struct adfs_dir *dir, struct object_info *obj)
359
376
360
377
const struct adfs_dir_ops adfs_f_dir_ops = {
361
378
.read = adfs_f_read ,
379
+ .iterate = adfs_f_iterate ,
362
380
.setpos = adfs_f_setpos ,
363
381
.getnext = adfs_f_getnext ,
364
382
.update = adfs_f_update ,
Original file line number Diff line number Diff line change @@ -118,8 +118,29 @@ adfs_fplus_getnext(struct adfs_dir *dir, struct object_info *obj)
118
118
return 0 ;
119
119
}
120
120
121
+ static int adfs_fplus_iterate (struct adfs_dir * dir , struct dir_context * ctx )
122
+ {
123
+ struct object_info obj ;
124
+
125
+ if ((ctx -> pos - 2 ) >> 32 )
126
+ return 0 ;
127
+
128
+ if (adfs_fplus_setpos (dir , ctx -> pos - 2 ))
129
+ return 0 ;
130
+
131
+ while (!adfs_fplus_getnext (dir , & obj )) {
132
+ if (!dir_emit (ctx , obj .name , obj .name_len ,
133
+ obj .indaddr , DT_UNKNOWN ))
134
+ break ;
135
+ ctx -> pos ++ ;
136
+ }
137
+
138
+ return 0 ;
139
+ }
140
+
121
141
const struct adfs_dir_ops adfs_fplus_dir_ops = {
122
142
.read = adfs_fplus_read ,
143
+ .iterate = adfs_fplus_iterate ,
123
144
.setpos = adfs_fplus_setpos ,
124
145
.getnext = adfs_fplus_getnext ,
125
146
};
You can’t perform that action at this time.
0 commit comments