~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/libfs.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /fs/libfs.c (Version linux-6.12-rc7) and /fs/libfs.c (Version linux-5.4.284)


** Warning: Cannot open xref database.

  1 // SPDX-License-Identifier: GPL-2.0-only            1 
  2 /*                                                
  3  *      fs/libfs.c                                
  4  *      Library for filesystems writers.          
  5  */                                               
  6                                                   
  7 #include <linux/blkdev.h>                         
  8 #include <linux/export.h>                         
  9 #include <linux/pagemap.h>                        
 10 #include <linux/slab.h>                           
 11 #include <linux/cred.h>                           
 12 #include <linux/mount.h>                          
 13 #include <linux/vfs.h>                            
 14 #include <linux/quotaops.h>                       
 15 #include <linux/mutex.h>                          
 16 #include <linux/namei.h>                          
 17 #include <linux/exportfs.h>                       
 18 #include <linux/iversion.h>                       
 19 #include <linux/writeback.h>                      
 20 #include <linux/buffer_head.h> /* sync_mapping    
 21 #include <linux/fs_context.h>                     
 22 #include <linux/pseudo_fs.h>                      
 23 #include <linux/fsnotify.h>                       
 24 #include <linux/unicode.h>                        
 25 #include <linux/fscrypt.h>                        
 26 #include <linux/pidfs.h>                          
 27                                                   
 28 #include <linux/uaccess.h>                        
 29                                                   
 30 #include "internal.h"                             
 31                                                   
 32 int simple_getattr(struct mnt_idmap *idmap, co    
 33                    struct kstat *stat, u32 req    
 34                    unsigned int query_flags)      
 35 {                                                 
 36         struct inode *inode = d_inode(path->de    
 37         generic_fillattr(&nop_mnt_idmap, reque    
 38         stat->blocks = inode->i_mapping->nrpag    
 39         return 0;                                 
 40 }                                                 
 41 EXPORT_SYMBOL(simple_getattr);                    
 42                                                   
 43 int simple_statfs(struct dentry *dentry, struc    
 44 {                                                 
 45         u64 id = huge_encode_dev(dentry->d_sb-    
 46                                                   
 47         buf->f_fsid = u64_to_fsid(id);            
 48         buf->f_type = dentry->d_sb->s_magic;      
 49         buf->f_bsize = PAGE_SIZE;                 
 50         buf->f_namelen = NAME_MAX;                
 51         return 0;                                 
 52 }                                                 
 53 EXPORT_SYMBOL(simple_statfs);                     
 54                                                   
 55 /*                                                
 56  * Retaining negative dentries for an in-memor    
 57  * memory and lookup time: arrange for them to    
 58  */                                               
 59 int always_delete_dentry(const struct dentry *    
 60 {                                                 
 61         return 1;                                 
 62 }                                                 
 63 EXPORT_SYMBOL(always_delete_dentry);              
 64                                                   
 65 const struct dentry_operations simple_dentry_o    
 66         .d_delete = always_delete_dentry,         
 67 };                                                
 68 EXPORT_SYMBOL(simple_dentry_operations);          
 69                                                   
 70 /*                                                
 71  * Lookup the data. This is trivial - if the d    
 72  * exist, we know it is negative.  Set d_op to    
 73  */                                               
 74 struct dentry *simple_lookup(struct inode *dir    
 75 {                                                 
 76         if (dentry->d_name.len > NAME_MAX)        
 77                 return ERR_PTR(-ENAMETOOLONG);    
 78         if (!dentry->d_sb->s_d_op)                
 79                 d_set_d_op(dentry, &simple_den    
 80         d_add(dentry, NULL);                      
 81         return NULL;                              
 82 }                                                 
 83 EXPORT_SYMBOL(simple_lookup);                     
 84                                                   
 85 int dcache_dir_open(struct inode *inode, struc    
 86 {                                                 
 87         file->private_data = d_alloc_cursor(fi    
 88                                                   
 89         return file->private_data ? 0 : -ENOME    
 90 }                                                 
 91 EXPORT_SYMBOL(dcache_dir_open);                   
 92                                                   
 93 int dcache_dir_close(struct inode *inode, stru    
 94 {                                                 
 95         dput(file->private_data);                 
 96         return 0;                                 
 97 }                                                 
 98 EXPORT_SYMBOL(dcache_dir_close);                  
 99                                                   
100 /* parent is locked at least shared */            
101 /*                                                
102  * Returns an element of siblings' list.          
103  * We are looking for <count>th positive after    
104  * found, dentry is grabbed and returned to ca    
105  * If no such element exists, NULL is returned    
106  */                                               
107 static struct dentry *scan_positives(struct de    
108                                         struct    
109                                         loff_t    
110                                         struct    
111 {                                                 
112         struct dentry *dentry = cursor->d_pare    
113                                                   
114         spin_lock(&dentry->d_lock);               
115         while (*p) {                              
116                 struct dentry *d = hlist_entry    
117                 p = &d->d_sib.next;               
118                 // we must at least skip curso    
119                 if (d->d_flags & DCACHE_DENTRY    
120                         continue;                 
121                 if (simple_positive(d) && !--c    
122                         spin_lock_nested(&d->d    
123                         if (simple_positive(d)    
124                                 found = dget_d    
125                         spin_unlock(&d->d_lock    
126                         if (likely(found))        
127                                 break;            
128                         count = 1;                
129                 }                                 
130                 if (need_resched()) {             
131                         if (!hlist_unhashed(&c    
132                                 __hlist_del(&c    
133                         hlist_add_behind(&curs    
134                         p = &cursor->d_sib.nex    
135                         spin_unlock(&dentry->d    
136                         cond_resched();           
137                         spin_lock(&dentry->d_l    
138                 }                                 
139         }                                         
140         spin_unlock(&dentry->d_lock);             
141         dput(last);                               
142         return found;                             
143 }                                                 
144                                                   
145 loff_t dcache_dir_lseek(struct file *file, lof    
146 {                                                 
147         struct dentry *dentry = file->f_path.d    
148         switch (whence) {                         
149                 case 1:                           
150                         offset += file->f_pos;    
151                         fallthrough;              
152                 case 0:                           
153                         if (offset >= 0)          
154                                 break;            
155                         fallthrough;              
156                 default:                          
157                         return -EINVAL;           
158         }                                         
159         if (offset != file->f_pos) {              
160                 struct dentry *cursor = file->    
161                 struct dentry *to = NULL;         
162                                                   
163                 inode_lock_shared(dentry->d_in    
164                                                   
165                 if (offset > 2)                   
166                         to = scan_positives(cu    
167                                             of    
168                 spin_lock(&dentry->d_lock);       
169                 hlist_del_init(&cursor->d_sib)    
170                 if (to)                           
171                         hlist_add_behind(&curs    
172                 spin_unlock(&dentry->d_lock);     
173                 dput(to);                         
174                                                   
175                 file->f_pos = offset;             
176                                                   
177                 inode_unlock_shared(dentry->d_    
178         }                                         
179         return offset;                            
180 }                                                 
181 EXPORT_SYMBOL(dcache_dir_lseek);                  
182                                                   
183 /*                                                
184  * Directory is locked and all positive dentri    
185  * for ramfs-type trees they can't go away wit    
186  * both impossible due to the lock on director    
187  */                                               
188                                                   
189 int dcache_readdir(struct file *file, struct d    
190 {                                                 
191         struct dentry *dentry = file->f_path.d    
192         struct dentry *cursor = file->private_    
193         struct dentry *next = NULL;               
194         struct hlist_node **p;                    
195                                                   
196         if (!dir_emit_dots(file, ctx))            
197                 return 0;                         
198                                                   
199         if (ctx->pos == 2)                        
200                 p = &dentry->d_children.first;    
201         else                                      
202                 p = &cursor->d_sib.next;          
203                                                   
204         while ((next = scan_positives(cursor,     
205                 if (!dir_emit(ctx, next->d_nam    
206                               d_inode(next)->i    
207                               fs_umode_to_dtyp    
208                         break;                    
209                 ctx->pos++;                       
210                 p = &next->d_sib.next;            
211         }                                         
212         spin_lock(&dentry->d_lock);               
213         hlist_del_init(&cursor->d_sib);           
214         if (next)                                 
215                 hlist_add_before(&cursor->d_si    
216         spin_unlock(&dentry->d_lock);             
217         dput(next);                               
218                                                   
219         return 0;                                 
220 }                                                 
221 EXPORT_SYMBOL(dcache_readdir);                    
222                                                   
223 ssize_t generic_read_dir(struct file *filp, ch    
224 {                                                 
225         return -EISDIR;                           
226 }                                                 
227 EXPORT_SYMBOL(generic_read_dir);                  
228                                                   
229 const struct file_operations simple_dir_operat    
230         .open           = dcache_dir_open,        
231         .release        = dcache_dir_close,       
232         .llseek         = dcache_dir_lseek,       
233         .read           = generic_read_dir,       
234         .iterate_shared = dcache_readdir,         
235         .fsync          = noop_fsync,             
236 };                                                
237 EXPORT_SYMBOL(simple_dir_operations);             
238                                                   
239 const struct inode_operations simple_dir_inode    
240         .lookup         = simple_lookup,          
241 };                                                
242 EXPORT_SYMBOL(simple_dir_inode_operations);       
243                                                   
244 /* 0 is '.', 1 is '..', so always start with o    
245 enum {                                            
246         DIR_OFFSET_MIN  = 2,                      
247 };                                                
248                                                   
249 static void offset_set(struct dentry *dentry,     
250 {                                                 
251         dentry->d_fsdata = (void *)offset;        
252 }                                                 
253                                                   
254 static long dentry2offset(struct dentry *dentr    
255 {                                                 
256         return (long)dentry->d_fsdata;            
257 }                                                 
258                                                   
259 static struct lock_class_key simple_offset_loc    
260                                                   
261 /**                                               
262  * simple_offset_init - initialize an offset_c    
263  * @octx: directory offset map to be initializ    
264  *                                                
265  */                                               
266 void simple_offset_init(struct offset_ctx *oct    
267 {                                                 
268         mt_init_flags(&octx->mt, MT_FLAGS_ALLO    
269         lockdep_set_class(&octx->mt.ma_lock, &    
270         octx->next_offset = DIR_OFFSET_MIN;       
271 }                                                 
272                                                   
273 /**                                               
274  * simple_offset_add - Add an entry to a direc    
275  * @octx: directory offset ctx to be updated      
276  * @dentry: new dentry being added                
277  *                                                
278  * Returns zero on success. @octx and the dent    
279  * Otherwise, a negative errno value is return    
280  */                                               
281 int simple_offset_add(struct offset_ctx *octx,    
282 {                                                 
283         unsigned long offset;                     
284         int ret;                                  
285                                                   
286         if (dentry2offset(dentry) != 0)           
287                 return -EBUSY;                    
288                                                   
289         ret = mtree_alloc_cyclic(&octx->mt, &o    
290                                  LONG_MAX, &oc    
291         if (ret < 0)                              
292                 return ret;                       
293                                                   
294         offset_set(dentry, offset);               
295         return 0;                                 
296 }                                                 
297                                                   
298 static int simple_offset_replace(struct offset    
299                                  long offset)     
300 {                                                 
301         int ret;                                  
302                                                   
303         ret = mtree_store(&octx->mt, offset, d    
304         if (ret)                                  
305                 return ret;                       
306         offset_set(dentry, offset);               
307         return 0;                                 
308 }                                                 
309                                                   
310 /**                                               
311  * simple_offset_remove - Remove an entry to a    
312  * @octx: directory offset ctx to be updated      
313  * @dentry: dentry being removed                  
314  *                                                
315  */                                               
316 void simple_offset_remove(struct offset_ctx *o    
317 {                                                 
318         long offset;                              
319                                                   
320         offset = dentry2offset(dentry);           
321         if (offset == 0)                          
322                 return;                           
323                                                   
324         mtree_erase(&octx->mt, offset);           
325         offset_set(dentry, 0);                    
326 }                                                 
327                                                   
328 /**                                               
329  * simple_offset_empty - Check if a dentry can    
330  * @dentry: dentry to be tested                   
331  *                                                
332  * Returns 0 if @dentry is a non-empty directo    
333  */                                               
334 int simple_offset_empty(struct dentry *dentry)    
335 {                                                 
336         struct inode *inode = d_inode(dentry);    
337         struct offset_ctx *octx;                  
338         struct dentry *child;                     
339         unsigned long index;                      
340         int ret = 1;                              
341                                                   
342         if (!inode || !S_ISDIR(inode->i_mode))    
343                 return ret;                       
344                                                   
345         index = DIR_OFFSET_MIN;                   
346         octx = inode->i_op->get_offset_ctx(ino    
347         mt_for_each(&octx->mt, child, index, L    
348                 spin_lock(&child->d_lock);        
349                 if (simple_positive(child)) {     
350                         spin_unlock(&child->d_    
351                         ret = 0;                  
352                         break;                    
353                 }                                 
354                 spin_unlock(&child->d_lock);      
355         }                                         
356                                                   
357         return ret;                               
358 }                                                 
359                                                   
360 /**                                               
361  * simple_offset_rename - handle directory off    
362  * @old_dir: parent directory of source entry     
363  * @old_dentry: dentry of source entry            
364  * @new_dir: parent_directory of destination e    
365  * @new_dentry: dentry of destination             
366  *                                                
367  * Caller provides appropriate serialization.     
368  *                                                
369  * User space expects the directory offset val    
370  * (new) directory entry to be unchanged after    
371  *                                                
372  * Returns zero on success, a negative errno v    
373  */                                               
374 int simple_offset_rename(struct inode *old_dir    
375                          struct inode *new_dir    
376 {                                                 
377         struct offset_ctx *old_ctx = old_dir->    
378         struct offset_ctx *new_ctx = new_dir->    
379         long new_offset = dentry2offset(new_de    
380                                                   
381         simple_offset_remove(old_ctx, old_dent    
382                                                   
383         if (new_offset) {                         
384                 offset_set(new_dentry, 0);        
385                 return simple_offset_replace(n    
386         }                                         
387         return simple_offset_add(new_ctx, old_    
388 }                                                 
389                                                   
390 /**                                               
391  * simple_offset_rename_exchange - exchange re    
392  * @old_dir: parent of dentry being moved         
393  * @old_dentry: dentry being moved                
394  * @new_dir: destination parent                   
395  * @new_dentry: destination dentry                
396  *                                                
397  * This API preserves the directory offset val    
398  * appropriate serialization.                     
399  *                                                
400  * Returns zero on success. Otherwise a negati    
401  * rename is rolled back.                         
402  */                                               
403 int simple_offset_rename_exchange(struct inode    
404                                   struct dentr    
405                                   struct inode    
406                                   struct dentr    
407 {                                                 
408         struct offset_ctx *old_ctx = old_dir->    
409         struct offset_ctx *new_ctx = new_dir->    
410         long old_index = dentry2offset(old_den    
411         long new_index = dentry2offset(new_den    
412         int ret;                                  
413                                                   
414         simple_offset_remove(old_ctx, old_dent    
415         simple_offset_remove(new_ctx, new_dent    
416                                                   
417         ret = simple_offset_replace(new_ctx, o    
418         if (ret)                                  
419                 goto out_restore;                 
420                                                   
421         ret = simple_offset_replace(old_ctx, n    
422         if (ret) {                                
423                 simple_offset_remove(new_ctx,     
424                 goto out_restore;                 
425         }                                         
426                                                   
427         ret = simple_rename_exchange(old_dir,     
428         if (ret) {                                
429                 simple_offset_remove(new_ctx,     
430                 simple_offset_remove(old_ctx,     
431                 goto out_restore;                 
432         }                                         
433         return 0;                                 
434                                                   
435 out_restore:                                      
436         (void)simple_offset_replace(old_ctx, o    
437         (void)simple_offset_replace(new_ctx, n    
438         return ret;                               
439 }                                                 
440                                                   
441 /**                                               
442  * simple_offset_destroy - Release offset map     
443  * @octx: directory offset ctx that is about t    
444  *                                                
445  * During fs teardown (eg. umount), a director    
446  * contain entries. xa_destroy() cleans out an    
447  */                                               
448 void simple_offset_destroy(struct offset_ctx *    
449 {                                                 
450         mtree_destroy(&octx->mt);                 
451 }                                                 
452                                                   
453 static int offset_dir_open(struct inode *inode    
454 {                                                 
455         struct offset_ctx *ctx = inode->i_op->    
456                                                   
457         file->private_data = (void *)ctx->next    
458         return 0;                                 
459 }                                                 
460                                                   
461 /**                                               
462  * offset_dir_llseek - Advance the read positi    
463  * @file: an open directory whose position is     
464  * @offset: a byte offset                         
465  * @whence: enumerator describing the starting    
466  *                                                
467  * SEEK_END, SEEK_DATA, and SEEK_HOLE are not     
468  *                                                
469  * Returns the updated read position if succes    
470  * negative errno is returned and the read pos    
471  */                                               
472 static loff_t offset_dir_llseek(struct file *f    
473 {                                                 
474         struct inode *inode = file->f_inode;      
475         struct offset_ctx *ctx = inode->i_op->    
476                                                   
477         switch (whence) {                         
478         case SEEK_CUR:                            
479                 offset += file->f_pos;            
480                 fallthrough;                      
481         case SEEK_SET:                            
482                 if (offset >= 0)                  
483                         break;                    
484                 fallthrough;                      
485         default:                                  
486                 return -EINVAL;                   
487         }                                         
488                                                   
489         /* In this case, ->private_data is pro    
490         if (!offset)                              
491                 file->private_data = (void *)c    
492         return vfs_setpos(file, offset, LONG_M    
493 }                                                 
494                                                   
495 static struct dentry *offset_find_next(struct     
496 {                                                 
497         MA_STATE(mas, &octx->mt, offset, offse    
498         struct dentry *child, *found = NULL;      
499                                                   
500         rcu_read_lock();                          
501         child = mas_find(&mas, LONG_MAX);         
502         if (!child)                               
503                 goto out;                         
504         spin_lock(&child->d_lock);                
505         if (simple_positive(child))               
506                 found = dget_dlock(child);        
507         spin_unlock(&child->d_lock);              
508 out:                                              
509         rcu_read_unlock();                        
510         return found;                             
511 }                                                 
512                                                   
513 static bool offset_dir_emit(struct dir_context    
514 {                                                 
515         struct inode *inode = d_inode(dentry);    
516         long offset = dentry2offset(dentry);      
517                                                   
518         return ctx->actor(ctx, dentry->d_name.    
519                           inode->i_ino, fs_umo    
520 }                                                 
521                                                   
522 static void offset_iterate_dir(struct inode *i    
523 {                                                 
524         struct offset_ctx *octx = inode->i_op-    
525         struct dentry *dentry;                    
526                                                   
527         while (true) {                            
528                 dentry = offset_find_next(octx    
529                 if (!dentry)                      
530                         return;                   
531                                                   
532                 if (dentry2offset(dentry) >= l    
533                         dput(dentry);             
534                         return;                   
535                 }                                 
536                                                   
537                 if (!offset_dir_emit(ctx, dent    
538                         dput(dentry);             
539                         return;                   
540                 }                                 
541                                                   
542                 ctx->pos = dentry2offset(dentr    
543                 dput(dentry);                     
544         }                                         
545 }                                                 
546                                                   
547 /**                                               
548  * offset_readdir - Emit entries starting at o    
549  * @file: an open directory to iterate over       
550  * @ctx: directory iteration context              
551  *                                                
552  * Caller must hold @file's i_rwsem to prevent    
553  * entries during this call.                      
554  *                                                
555  * On entry, @ctx->pos contains an offset that    
556  * to be read from the directory.                 
557  *                                                
558  * The operation continues until there are no     
559  * until the ctx->actor indicates there is no     
560  * output buffer.                                 
561  *                                                
562  * On return, @ctx->pos contains an offset tha    
563  * in this directory when offset_readdir() is     
564  *                                                
565  * Return values:                                 
566  *   %0 - Complete                                
567  */                                               
568 static int offset_readdir(struct file *file, s    
569 {                                                 
570         struct dentry *dir = file->f_path.dent    
571         long last_index = (long)file->private_    
572                                                   
573         lockdep_assert_held(&d_inode(dir)->i_r    
574                                                   
575         if (!dir_emit_dots(file, ctx))            
576                 return 0;                         
577                                                   
578         offset_iterate_dir(d_inode(dir), ctx,     
579         return 0;                                 
580 }                                                 
581                                                   
582 const struct file_operations simple_offset_dir    
583         .open           = offset_dir_open,        
584         .llseek         = offset_dir_llseek,      
585         .iterate_shared = offset_readdir,         
586         .read           = generic_read_dir,       
587         .fsync          = noop_fsync,             
588 };                                                
589                                                   
590 static struct dentry *find_next_child(struct d    
591 {                                                 
592         struct dentry *child = NULL, *d;          
593                                                   
594         spin_lock(&parent->d_lock);               
595         d = prev ? d_next_sibling(prev) : d_fi    
596         hlist_for_each_entry_from(d, d_sib) {     
597                 if (simple_positive(d)) {         
598                         spin_lock_nested(&d->d    
599                         if (simple_positive(d)    
600                                 child = dget_d    
601                         spin_unlock(&d->d_lock    
602                         if (likely(child))        
603                                 break;            
604                 }                                 
605         }                                         
606         spin_unlock(&parent->d_lock);             
607         dput(prev);                               
608         return child;                             
609 }                                                 
610                                                   
611 void simple_recursive_removal(struct dentry *d    
612                               void (*callback)    
613 {                                                 
614         struct dentry *this = dget(dentry);       
615         while (true) {                            
616                 struct dentry *victim = NULL,     
617                 struct inode *inode = this->d_    
618                                                   
619                 inode_lock(inode);                
620                 if (d_is_dir(this))               
621                         inode->i_flags |= S_DE    
622                 while ((child = find_next_chil    
623                         // kill and ascend        
624                         // update metadata whi    
625                         inode_set_ctime_curren    
626                         clear_nlink(inode);       
627                         inode_unlock(inode);      
628                         victim = this;            
629                         this = this->d_parent;    
630                         inode = this->d_inode;    
631                         inode_lock(inode);        
632                         if (simple_positive(vi    
633                                 d_invalidate(v    
634                                 if (d_is_dir(v    
635                                         fsnoti    
636                                 else              
637                                         fsnoti    
638                                 if (callback)     
639                                         callba    
640                                 dput(victim);     
641                         }                         
642                         if (victim == dentry)     
643                                 inode_set_mtim    
644                                                   
645                                 if (d_is_dir(d    
646                                         drop_n    
647                                 inode_unlock(i    
648                                 dput(dentry);     
649                                 return;           
650                         }                         
651                 }                                 
652                 inode_unlock(inode);              
653                 this = child;                     
654         }                                         
655 }                                                 
656 EXPORT_SYMBOL(simple_recursive_removal);          
657                                                   
658 static const struct super_operations simple_su    
659         .statfs         = simple_statfs,          
660 };                                                
661                                                   
662 static int pseudo_fs_fill_super(struct super_b    
663 {                                                 
664         struct pseudo_fs_context *ctx = fc->fs    
665         struct inode *root;                       
666                                                   
667         s->s_maxbytes = MAX_LFS_FILESIZE;         
668         s->s_blocksize = PAGE_SIZE;               
669         s->s_blocksize_bits = PAGE_SHIFT;         
670         s->s_magic = ctx->magic;                  
671         s->s_op = ctx->ops ?: &simple_super_op    
672         s->s_xattr = ctx->xattr;                  
673         s->s_time_gran = 1;                       
674         root = new_inode(s);                      
675         if (!root)                                
676                 return -ENOMEM;                   
677                                                   
678         /*                                        
679          * since this is the first inode, make    
680          * after this must take care not to co    
681          * max_reserved of 1 to iunique).         
682          */                                       
683         root->i_ino = 1;                          
684         root->i_mode = S_IFDIR | S_IRUSR | S_I    
685         simple_inode_init_ts(root);               
686         s->s_root = d_make_root(root);            
687         if (!s->s_root)                           
688                 return -ENOMEM;                   
689         s->s_d_op = ctx->dops;                    
690         return 0;                                 
691 }                                                 
692                                                   
693 static int pseudo_fs_get_tree(struct fs_contex    
694 {                                                 
695         return get_tree_nodev(fc, pseudo_fs_fi    
696 }                                                 
697                                                   
698 static void pseudo_fs_free(struct fs_context *    
699 {                                                 
700         kfree(fc->fs_private);                    
701 }                                                 
702                                                   
703 static const struct fs_context_operations pseu    
704         .free           = pseudo_fs_free,         
705         .get_tree       = pseudo_fs_get_tree,     
706 };                                                
707                                                   
708 /*                                                
709  * Common helper for pseudo-filesystems (sockf    
710  * will never be mountable)                       
711  */                                               
712 struct pseudo_fs_context *init_pseudo(struct f    
713                                         unsign    
714 {                                                 
715         struct pseudo_fs_context *ctx;            
716                                                   
717         ctx = kzalloc(sizeof(struct pseudo_fs_    
718         if (likely(ctx)) {                        
719                 ctx->magic = magic;               
720                 fc->fs_private = ctx;             
721                 fc->ops = &pseudo_fs_context_o    
722                 fc->sb_flags |= SB_NOUSER;        
723                 fc->global = true;                
724         }                                         
725         return ctx;                               
726 }                                                 
727 EXPORT_SYMBOL(init_pseudo);                       
728                                                   
729 int simple_open(struct inode *inode, struct fi    
730 {                                                 
731         if (inode->i_private)                     
732                 file->private_data = inode->i_    
733         return 0;                                 
734 }                                                 
735 EXPORT_SYMBOL(simple_open);                       
736                                                   
737 int simple_link(struct dentry *old_dentry, str    
738 {                                                 
739         struct inode *inode = d_inode(old_dent    
740                                                   
741         inode_set_mtime_to_ts(dir,                
742                               inode_set_ctime_    
743         inc_nlink(inode);                         
744         ihold(inode);                             
745         dget(dentry);                             
746         d_instantiate(dentry, inode);             
747         return 0;                                 
748 }                                                 
749 EXPORT_SYMBOL(simple_link);                       
750                                                   
751 int simple_empty(struct dentry *dentry)           
752 {                                                 
753         struct dentry *child;                     
754         int ret = 0;                              
755                                                   
756         spin_lock(&dentry->d_lock);               
757         hlist_for_each_entry(child, &dentry->d    
758                 spin_lock_nested(&child->d_loc    
759                 if (simple_positive(child)) {     
760                         spin_unlock(&child->d_    
761                         goto out;                 
762                 }                                 
763                 spin_unlock(&child->d_lock);      
764         }                                         
765         ret = 1;                                  
766 out:                                              
767         spin_unlock(&dentry->d_lock);             
768         return ret;                               
769 }                                                 
770 EXPORT_SYMBOL(simple_empty);                      
771                                                   
772 int simple_unlink(struct inode *dir, struct de    
773 {                                                 
774         struct inode *inode = d_inode(dentry);    
775                                                   
776         inode_set_mtime_to_ts(dir,                
777                               inode_set_ctime_    
778         drop_nlink(inode);                        
779         dput(dentry);                             
780         return 0;                                 
781 }                                                 
782 EXPORT_SYMBOL(simple_unlink);                     
783                                                   
784 int simple_rmdir(struct inode *dir, struct den    
785 {                                                 
786         if (!simple_empty(dentry))                
787                 return -ENOTEMPTY;                
788                                                   
789         drop_nlink(d_inode(dentry));              
790         simple_unlink(dir, dentry);               
791         drop_nlink(dir);                          
792         return 0;                                 
793 }                                                 
794 EXPORT_SYMBOL(simple_rmdir);                      
795                                                   
796 /**                                               
797  * simple_rename_timestamp - update the variou    
798  * @old_dir: old parent directory                 
799  * @old_dentry: dentry that is being renamed      
800  * @new_dir: new parent directory                 
801  * @new_dentry: target for rename                 
802  *                                                
803  * POSIX mandates that the old and new parent     
804  * mtime updated, and that inodes of @old_dent    
805  * their ctime updated.                           
806  */                                               
807 void simple_rename_timestamp(struct inode *old    
808                              struct inode *new    
809 {                                                 
810         struct inode *newino = d_inode(new_den    
811                                                   
812         inode_set_mtime_to_ts(old_dir, inode_s    
813         if (new_dir != old_dir)                   
814                 inode_set_mtime_to_ts(new_dir,    
815                                       inode_se    
816         inode_set_ctime_current(d_inode(old_de    
817         if (newino)                               
818                 inode_set_ctime_current(newino    
819 }                                                 
820 EXPORT_SYMBOL_GPL(simple_rename_timestamp);       
821                                                   
822 int simple_rename_exchange(struct inode *old_d    
823                            struct inode *new_d    
824 {                                                 
825         bool old_is_dir = d_is_dir(old_dentry)    
826         bool new_is_dir = d_is_dir(new_dentry)    
827                                                   
828         if (old_dir != new_dir && old_is_dir !    
829                 if (old_is_dir) {                 
830                         drop_nlink(old_dir);      
831                         inc_nlink(new_dir);       
832                 } else {                          
833                         drop_nlink(new_dir);      
834                         inc_nlink(old_dir);       
835                 }                                 
836         }                                         
837         simple_rename_timestamp(old_dir, old_d    
838         return 0;                                 
839 }                                                 
840 EXPORT_SYMBOL_GPL(simple_rename_exchange);        
841                                                   
842 int simple_rename(struct mnt_idmap *idmap, str    
843                   struct dentry *old_dentry, s    
844                   struct dentry *new_dentry, u    
845 {                                                 
846         int they_are_dirs = d_is_dir(old_dentr    
847                                                   
848         if (flags & ~(RENAME_NOREPLACE | RENAM    
849                 return -EINVAL;                   
850                                                   
851         if (flags & RENAME_EXCHANGE)              
852                 return simple_rename_exchange(    
853                                                   
854         if (!simple_empty(new_dentry))            
855                 return -ENOTEMPTY;                
856                                                   
857         if (d_really_is_positive(new_dentry))     
858                 simple_unlink(new_dir, new_den    
859                 if (they_are_dirs) {              
860                         drop_nlink(d_inode(new    
861                         drop_nlink(old_dir);      
862                 }                                 
863         } else if (they_are_dirs) {               
864                 drop_nlink(old_dir);              
865                 inc_nlink(new_dir);               
866         }                                         
867                                                   
868         simple_rename_timestamp(old_dir, old_d    
869         return 0;                                 
870 }                                                 
871 EXPORT_SYMBOL(simple_rename);                     
872                                                   
873 /**                                               
874  * simple_setattr - setattr for simple filesys    
875  * @idmap: idmap of the target mount              
876  * @dentry: dentry                                
877  * @iattr: iattr structure                        
878  *                                                
879  * Returns 0 on success, -error on failure.       
880  *                                                
881  * simple_setattr is a simple ->setattr implem    
882  * implementation of size changes.                
883  *                                                
884  * It can either be used for in-memory filesys    
885  * on simple regular filesystems.  Anything th    
886  * or wire state on size changes needs its own    
887  */                                               
888 int simple_setattr(struct mnt_idmap *idmap, st    
889                    struct iattr *iattr)           
890 {                                                 
891         struct inode *inode = d_inode(dentry);    
892         int error;                                
893                                                   
894         error = setattr_prepare(idmap, dentry,    
895         if (error)                                
896                 return error;                     
897                                                   
898         if (iattr->ia_valid & ATTR_SIZE)          
899                 truncate_setsize(inode, iattr-    
900         setattr_copy(idmap, inode, iattr);        
901         mark_inode_dirty(inode);                  
902         return 0;                                 
903 }                                                 
904 EXPORT_SYMBOL(simple_setattr);                    
905                                                   
906 static int simple_read_folio(struct file *file    
907 {                                                 
908         folio_zero_range(folio, 0, folio_size(    
909         flush_dcache_folio(folio);                
910         folio_mark_uptodate(folio);               
911         folio_unlock(folio);                      
912         return 0;                                 
913 }                                                 
914                                                   
915 int simple_write_begin(struct file *file, stru    
916                         loff_t pos, unsigned l    
917                         struct folio **foliop,    
918 {                                                 
919         struct folio *folio;                      
920                                                   
921         folio = __filemap_get_folio(mapping, p    
922                         mapping_gfp_mask(mappi    
923         if (IS_ERR(folio))                        
924                 return PTR_ERR(folio);            
925                                                   
926         *foliop = folio;                          
927                                                   
928         if (!folio_test_uptodate(folio) && (le    
929                 size_t from = offset_in_folio(    
930                                                   
931                 folio_zero_segments(folio, 0,     
932                                 from + len, fo    
933         }                                         
934         return 0;                                 
935 }                                                 
936 EXPORT_SYMBOL(simple_write_begin);                
937                                                   
938 /**                                               
939  * simple_write_end - .write_end helper for no    
940  * @file: See .write_end of address_space_oper    
941  * @mapping:            "                         
942  * @pos:                "                         
943  * @len:                "                         
944  * @copied:             "                         
945  * @folio:              "                         
946  * @fsdata:             "                         
947  *                                                
948  * simple_write_end does the minimum needed fo    
949  * writing is done. It has the same API signat    
950  * address_space_operations vector. So it can     
951  * FSes that don't need any other processing.     
952  * Block based filesystems should use generic_    
953  * NOTE: Even though i_size might get updated     
954  * is not called, so a filesystem that actuall    
955  * should extend on what's done here with a ca    
956  * case that i_size has changed.                  
957  *                                                
958  * Use *ONLY* with simple_read_folio()            
959  */                                               
960 static int simple_write_end(struct file *file,    
961                         loff_t pos, unsigned l    
962                         struct folio *folio, v    
963 {                                                 
964         struct inode *inode = folio->mapping->    
965         loff_t last_pos = pos + copied;           
966                                                   
967         /* zero the stale part of the folio if    
968         if (!folio_test_uptodate(folio)) {        
969                 if (copied < len) {               
970                         size_t from = offset_i    
971                                                   
972                         folio_zero_range(folio    
973                 }                                 
974                 folio_mark_uptodate(folio);       
975         }                                         
976         /*                                        
977          * No need to use i_size_read() here,     
978          * cannot change under us because we h    
979          */                                       
980         if (last_pos > inode->i_size)             
981                 i_size_write(inode, last_pos);    
982                                                   
983         folio_mark_dirty(folio);                  
984         folio_unlock(folio);                      
985         folio_put(folio);                         
986                                                   
987         return copied;                            
988 }                                                 
989                                                   
990 /*                                                
991  * Provides ramfs-style behavior: data in the     
992  */                                               
993 const struct address_space_operations ram_aops    
994         .read_folio     = simple_read_folio,      
995         .write_begin    = simple_write_begin,     
996         .write_end      = simple_write_end,       
997         .dirty_folio    = noop_dirty_folio,       
998 };                                                
999 EXPORT_SYMBOL(ram_aops);                          
1000                                                  
1001 /*                                               
1002  * the inodes created here are not hashed. If    
1003  * unique inode values later for this filesys    
1004  * to pass it an appropriate max_reserved val    
1005  */                                              
1006 int simple_fill_super(struct super_block *s,     
1007                       const struct tree_descr    
1008 {                                                
1009         struct inode *inode;                     
1010         struct dentry *dentry;                   
1011         int i;                                   
1012                                                  
1013         s->s_blocksize = PAGE_SIZE;              
1014         s->s_blocksize_bits = PAGE_SHIFT;        
1015         s->s_magic = magic;                      
1016         s->s_op = &simple_super_operations;      
1017         s->s_time_gran = 1;                      
1018                                                  
1019         inode = new_inode(s);                    
1020         if (!inode)                              
1021                 return -ENOMEM;                  
1022         /*                                       
1023          * because the root inode is 1, the f    
1024          * entry at index 1                      
1025          */                                      
1026         inode->i_ino = 1;                        
1027         inode->i_mode = S_IFDIR | 0755;          
1028         simple_inode_init_ts(inode);             
1029         inode->i_op = &simple_dir_inode_opera    
1030         inode->i_fop = &simple_dir_operations    
1031         set_nlink(inode, 2);                     
1032         s->s_root = d_make_root(inode);          
1033         if (!s->s_root)                          
1034                 return -ENOMEM;                  
1035         for (i = 0; !files->name || files->na    
1036                 if (!files->name)                
1037                         continue;                
1038                                                  
1039                 /* warn if it tries to confli    
1040                 if (unlikely(i == 1))            
1041                         printk(KERN_WARNING "    
1042                                 "with an inde    
1043                                 s->s_type->na    
1044                                                  
1045                 dentry = d_alloc_name(s->s_ro    
1046                 if (!dentry)                     
1047                         return -ENOMEM;          
1048                 inode = new_inode(s);            
1049                 if (!inode) {                    
1050                         dput(dentry);            
1051                         return -ENOMEM;          
1052                 }                                
1053                 inode->i_mode = S_IFREG | fil    
1054                 simple_inode_init_ts(inode);     
1055                 inode->i_fop = files->ops;       
1056                 inode->i_ino = i;                
1057                 d_add(dentry, inode);            
1058         }                                        
1059         return 0;                                
1060 }                                                
1061 EXPORT_SYMBOL(simple_fill_super);                
1062                                                  
1063 static DEFINE_SPINLOCK(pin_fs_lock);             
1064                                                  
1065 int simple_pin_fs(struct file_system_type *ty    
1066 {                                                
1067         struct vfsmount *mnt = NULL;             
1068         spin_lock(&pin_fs_lock);                 
1069         if (unlikely(!*mount)) {                 
1070                 spin_unlock(&pin_fs_lock);       
1071                 mnt = vfs_kern_mount(type, SB    
1072                 if (IS_ERR(mnt))                 
1073                         return PTR_ERR(mnt);     
1074                 spin_lock(&pin_fs_lock);         
1075                 if (!*mount)                     
1076                         *mount = mnt;            
1077         }                                        
1078         mntget(*mount);                          
1079         ++*count;                                
1080         spin_unlock(&pin_fs_lock);               
1081         mntput(mnt);                             
1082         return 0;                                
1083 }                                                
1084 EXPORT_SYMBOL(simple_pin_fs);                    
1085                                                  
1086 void simple_release_fs(struct vfsmount **moun    
1087 {                                                
1088         struct vfsmount *mnt;                    
1089         spin_lock(&pin_fs_lock);                 
1090         mnt = *mount;                            
1091         if (!--*count)                           
1092                 *mount = NULL;                   
1093         spin_unlock(&pin_fs_lock);               
1094         mntput(mnt);                             
1095 }                                                
1096 EXPORT_SYMBOL(simple_release_fs);                
1097                                                  
1098 /**                                              
1099  * simple_read_from_buffer - copy data from t    
1100  * @to: the user space buffer to read to         
1101  * @count: the maximum number of bytes to rea    
1102  * @ppos: the current position in the buffer     
1103  * @from: the buffer to read from                
1104  * @available: the size of the buffer            
1105  *                                               
1106  * The simple_read_from_buffer() function rea    
1107  * buffer @from at offset @ppos into the user    
1108  *                                               
1109  * On success, the number of bytes read is re    
1110  * advanced by this number, or negative value    
1111  **/                                             
1112 ssize_t simple_read_from_buffer(void __user *    
1113                                 const void *f    
1114 {                                                
1115         loff_t pos = *ppos;                      
1116         size_t ret;                              
1117                                                  
1118         if (pos < 0)                             
1119                 return -EINVAL;                  
1120         if (pos >= available || !count)          
1121                 return 0;                        
1122         if (count > available - pos)             
1123                 count = available - pos;         
1124         ret = copy_to_user(to, from + pos, co    
1125         if (ret == count)                        
1126                 return -EFAULT;                  
1127         count -= ret;                            
1128         *ppos = pos + count;                     
1129         return count;                            
1130 }                                                
1131 EXPORT_SYMBOL(simple_read_from_buffer);          
1132                                                  
1133 /**                                              
1134  * simple_write_to_buffer - copy data from us    
1135  * @to: the buffer to write to                   
1136  * @available: the size of the buffer            
1137  * @ppos: the current position in the buffer     
1138  * @from: the user space buffer to read from     
1139  * @count: the maximum number of bytes to rea    
1140  *                                               
1141  * The simple_write_to_buffer() function read    
1142  * space address starting at @from into the b    
1143  *                                               
1144  * On success, the number of bytes written is    
1145  * advanced by this number, or negative value    
1146  **/                                             
1147 ssize_t simple_write_to_buffer(void *to, size    
1148                 const void __user *from, size    
1149 {                                                
1150         loff_t pos = *ppos;                      
1151         size_t res;                              
1152                                                  
1153         if (pos < 0)                             
1154                 return -EINVAL;                  
1155         if (pos >= available || !count)          
1156                 return 0;                        
1157         if (count > available - pos)             
1158                 count = available - pos;         
1159         res = copy_from_user(to + pos, from,     
1160         if (res == count)                        
1161                 return -EFAULT;                  
1162         count -= res;                            
1163         *ppos = pos + count;                     
1164         return count;                            
1165 }                                                
1166 EXPORT_SYMBOL(simple_write_to_buffer);           
1167                                                  
1168 /**                                              
1169  * memory_read_from_buffer - copy data from t    
1170  * @to: the kernel space buffer to read to       
1171  * @count: the maximum number of bytes to rea    
1172  * @ppos: the current position in the buffer     
1173  * @from: the buffer to read from                
1174  * @available: the size of the buffer            
1175  *                                               
1176  * The memory_read_from_buffer() function rea    
1177  * buffer @from at offset @ppos into the kern    
1178  *                                               
1179  * On success, the number of bytes read is re    
1180  * advanced by this number, or negative value    
1181  **/                                             
1182 ssize_t memory_read_from_buffer(void *to, siz    
1183                                 const void *f    
1184 {                                                
1185         loff_t pos = *ppos;                      
1186                                                  
1187         if (pos < 0)                             
1188                 return -EINVAL;                  
1189         if (pos >= available)                    
1190                 return 0;                        
1191         if (count > available - pos)             
1192                 count = available - pos;         
1193         memcpy(to, from + pos, count);           
1194         *ppos = pos + count;                     
1195                                                  
1196         return count;                            
1197 }                                                
1198 EXPORT_SYMBOL(memory_read_from_buffer);          
1199                                                  
1200 /*                                               
1201  * Transaction based IO.                         
1202  * The file expects a single write which trig    
1203  * possibly a read which collects the result     
1204  * file-local buffer.                            
1205  */                                              
1206                                                  
1207 void simple_transaction_set(struct file *file    
1208 {                                                
1209         struct simple_transaction_argresp *ar    
1210                                                  
1211         BUG_ON(n > SIMPLE_TRANSACTION_LIMIT);    
1212                                                  
1213         /*                                       
1214          * The barrier ensures that ar->size     
1215          * ar->data is ready for reading.        
1216          */                                      
1217         smp_mb();                                
1218         ar->size = n;                            
1219 }                                                
1220 EXPORT_SYMBOL(simple_transaction_set);           
1221                                                  
1222 char *simple_transaction_get(struct file *fil    
1223 {                                                
1224         struct simple_transaction_argresp *ar    
1225         static DEFINE_SPINLOCK(simple_transac    
1226                                                  
1227         if (size > SIMPLE_TRANSACTION_LIMIT -    
1228                 return ERR_PTR(-EFBIG);          
1229                                                  
1230         ar = (struct simple_transaction_argre    
1231         if (!ar)                                 
1232                 return ERR_PTR(-ENOMEM);         
1233                                                  
1234         spin_lock(&simple_transaction_lock);     
1235                                                  
1236         /* only one write allowed per open */    
1237         if (file->private_data) {                
1238                 spin_unlock(&simple_transacti    
1239                 free_page((unsigned long)ar);    
1240                 return ERR_PTR(-EBUSY);          
1241         }                                        
1242                                                  
1243         file->private_data = ar;                 
1244                                                  
1245         spin_unlock(&simple_transaction_lock)    
1246                                                  
1247         if (copy_from_user(ar->data, buf, siz    
1248                 return ERR_PTR(-EFAULT);         
1249                                                  
1250         return ar->data;                         
1251 }                                                
1252 EXPORT_SYMBOL(simple_transaction_get);           
1253                                                  
1254 ssize_t simple_transaction_read(struct file *    
1255 {                                                
1256         struct simple_transaction_argresp *ar    
1257                                                  
1258         if (!ar)                                 
1259                 return 0;                        
1260         return simple_read_from_buffer(buf, s    
1261 }                                                
1262 EXPORT_SYMBOL(simple_transaction_read);          
1263                                                  
1264 int simple_transaction_release(struct inode *    
1265 {                                                
1266         free_page((unsigned long)file->privat    
1267         return 0;                                
1268 }                                                
1269 EXPORT_SYMBOL(simple_transaction_release);       
1270                                                  
1271 /* Simple attribute files */                     
1272                                                  
1273 struct simple_attr {                             
1274         int (*get)(void *, u64 *);               
1275         int (*set)(void *, u64);                 
1276         char get_buf[24];       /* enough to     
1277         char set_buf[24];                        
1278         void *data;                              
1279         const char *fmt;        /* format for    
1280         struct mutex mutex;     /* protects a    
1281 };                                               
1282                                                  
1283 /* simple_attr_open is called by an actual at    
1284  * to set the attribute specific access opera    
1285 int simple_attr_open(struct inode *inode, str    
1286                      int (*get)(void *, u64 *    
1287                      const char *fmt)            
1288 {                                                
1289         struct simple_attr *attr;                
1290                                                  
1291         attr = kzalloc(sizeof(*attr), GFP_KER    
1292         if (!attr)                               
1293                 return -ENOMEM;                  
1294                                                  
1295         attr->get = get;                         
1296         attr->set = set;                         
1297         attr->data = inode->i_private;           
1298         attr->fmt = fmt;                         
1299         mutex_init(&attr->mutex);                
1300                                                  
1301         file->private_data = attr;               
1302                                                  
1303         return nonseekable_open(inode, file);    
1304 }                                                
1305 EXPORT_SYMBOL_GPL(simple_attr_open);             
1306                                                  
1307 int simple_attr_release(struct inode *inode,     
1308 {                                                
1309         kfree(file->private_data);               
1310         return 0;                                
1311 }                                                
1312 EXPORT_SYMBOL_GPL(simple_attr_release); /* GP    
1313                                                  
1314 /* read from the buffer that is filled with t    
1315 ssize_t simple_attr_read(struct file *file, c    
1316                          size_t len, loff_t *    
1317 {                                                
1318         struct simple_attr *attr;                
1319         size_t size;                             
1320         ssize_t ret;                             
1321                                                  
1322         attr = file->private_data;               
1323                                                  
1324         if (!attr->get)                          
1325                 return -EACCES;                  
1326                                                  
1327         ret = mutex_lock_interruptible(&attr-    
1328         if (ret)                                 
1329                 return ret;                      
1330                                                  
1331         if (*ppos && attr->get_buf[0]) {         
1332                 /* continued read */             
1333                 size = strlen(attr->get_buf);    
1334         } else {                                 
1335                 /* first read */                 
1336                 u64 val;                         
1337                 ret = attr->get(attr->data, &    
1338                 if (ret)                         
1339                         goto out;                
1340                                                  
1341                 size = scnprintf(attr->get_bu    
1342                                  attr->fmt, (    
1343         }                                        
1344                                                  
1345         ret = simple_read_from_buffer(buf, le    
1346 out:                                             
1347         mutex_unlock(&attr->mutex);              
1348         return ret;                              
1349 }                                                
1350 EXPORT_SYMBOL_GPL(simple_attr_read);             
1351                                                  
1352 /* interpret the buffer as a number to call t    
1353 static ssize_t simple_attr_write_xsigned(stru    
1354                           size_t len, loff_t     
1355 {                                                
1356         struct simple_attr *attr;                
1357         unsigned long long val;                  
1358         size_t size;                             
1359         ssize_t ret;                             
1360                                                  
1361         attr = file->private_data;               
1362         if (!attr->set)                          
1363                 return -EACCES;                  
1364                                                  
1365         ret = mutex_lock_interruptible(&attr-    
1366         if (ret)                                 
1367                 return ret;                      
1368                                                  
1369         ret = -EFAULT;                           
1370         size = min(sizeof(attr->set_buf) - 1,    
1371         if (copy_from_user(attr->set_buf, buf    
1372                 goto out;                        
1373                                                  
1374         attr->set_buf[size] = '\0';              
1375         if (is_signed)                           
1376                 ret = kstrtoll(attr->set_buf,    
1377         else                                     
1378                 ret = kstrtoull(attr->set_buf    
1379         if (ret)                                 
1380                 goto out;                        
1381         ret = attr->set(attr->data, val);        
1382         if (ret == 0)                            
1383                 ret = len; /* on success, cla    
1384 out:                                             
1385         mutex_unlock(&attr->mutex);              
1386         return ret;                              
1387 }                                                
1388                                                  
1389 ssize_t simple_attr_write(struct file *file,     
1390                           size_t len, loff_t     
1391 {                                                
1392         return simple_attr_write_xsigned(file    
1393 }                                                
1394 EXPORT_SYMBOL_GPL(simple_attr_write);            
1395                                                  
1396 ssize_t simple_attr_write_signed(struct file     
1397                           size_t len, loff_t     
1398 {                                                
1399         return simple_attr_write_xsigned(file    
1400 }                                                
1401 EXPORT_SYMBOL_GPL(simple_attr_write_signed);     
1402                                                  
1403 /**                                              
1404  * generic_encode_ino32_fh - generic export_o    
1405  * @inode:   the object to encode                
1406  * @fh:      where to store the file handle f    
1407  * @max_len: maximum length to store there (i    
1408  * @parent:  parent directory inode, if wante    
1409  *                                               
1410  * This generic encode_fh function assumes th    
1411  * is suitable for locating an inode, and tha    
1412  * can be used to check that it is still vali    
1413  * filehandle fragment where export_decode_fh    
1414  */                                              
1415 int generic_encode_ino32_fh(struct inode *ino    
1416                             struct inode *par    
1417 {                                                
1418         struct fid *fid = (void *)fh;            
1419         int len = *max_len;                      
1420         int type = FILEID_INO32_GEN;             
1421                                                  
1422         if (parent && (len < 4)) {               
1423                 *max_len = 4;                    
1424                 return FILEID_INVALID;           
1425         } else if (len < 2) {                    
1426                 *max_len = 2;                    
1427                 return FILEID_INVALID;           
1428         }                                        
1429                                                  
1430         len = 2;                                 
1431         fid->i32.ino = inode->i_ino;             
1432         fid->i32.gen = inode->i_generation;      
1433         if (parent) {                            
1434                 fid->i32.parent_ino = parent-    
1435                 fid->i32.parent_gen = parent-    
1436                 len = 4;                         
1437                 type = FILEID_INO32_GEN_PAREN    
1438         }                                        
1439         *max_len = len;                          
1440         return type;                             
1441 }                                                
1442 EXPORT_SYMBOL_GPL(generic_encode_ino32_fh);      
1443                                                  
1444 /**                                              
1445  * generic_fh_to_dentry - generic helper for     
1446  * @sb:         filesystem to do the file han    
1447  * @fid:        file handle to convert           
1448  * @fh_len:     length of the file handle in     
1449  * @fh_type:    type of file handle              
1450  * @get_inode:  filesystem callback to retrie    
1451  *                                               
1452  * This function decodes @fid as long as it h    
1453  * Linux filehandle types and calls @get_inod    
1454  * inode for the object specified in the file    
1455  */                                              
1456 struct dentry *generic_fh_to_dentry(struct su    
1457                 int fh_len, int fh_type, stru    
1458                         (struct super_block *    
1459 {                                                
1460         struct inode *inode = NULL;              
1461                                                  
1462         if (fh_len < 2)                          
1463                 return NULL;                     
1464                                                  
1465         switch (fh_type) {                       
1466         case FILEID_INO32_GEN:                   
1467         case FILEID_INO32_GEN_PARENT:            
1468                 inode = get_inode(sb, fid->i3    
1469                 break;                           
1470         }                                        
1471                                                  
1472         return d_obtain_alias(inode);            
1473 }                                                
1474 EXPORT_SYMBOL_GPL(generic_fh_to_dentry);         
1475                                                  
1476 /**                                              
1477  * generic_fh_to_parent - generic helper for     
1478  * @sb:         filesystem to do the file han    
1479  * @fid:        file handle to convert           
1480  * @fh_len:     length of the file handle in     
1481  * @fh_type:    type of file handle              
1482  * @get_inode:  filesystem callback to retrie    
1483  *                                               
1484  * This function decodes @fid as long as it h    
1485  * Linux filehandle types and calls @get_inod    
1486  * inode for the _parent_ object specified in    
1487  * is specified in the file handle, or NULL o    
1488  */                                              
1489 struct dentry *generic_fh_to_parent(struct su    
1490                 int fh_len, int fh_type, stru    
1491                         (struct super_block *    
1492 {                                                
1493         struct inode *inode = NULL;              
1494                                                  
1495         if (fh_len <= 2)                         
1496                 return NULL;                     
1497                                                  
1498         switch (fh_type) {                       
1499         case FILEID_INO32_GEN_PARENT:            
1500                 inode = get_inode(sb, fid->i3    
1501                                   (fh_len > 3    
1502                 break;                           
1503         }                                        
1504                                                  
1505         return d_obtain_alias(inode);            
1506 }                                                
1507 EXPORT_SYMBOL_GPL(generic_fh_to_parent);         
1508                                                  
1509 /**                                              
1510  * __generic_file_fsync - generic fsync imple    
1511  *                                               
1512  * @file:       file to synchronize              
1513  * @start:      start offset in bytes            
1514  * @end:        end offset in bytes (inclusiv    
1515  * @datasync:   only synchronize essential me    
1516  *                                               
1517  * This is a generic implementation of the fs    
1518  * filesystems which track all non-inode meta    
1519  * hanging off the address_space structure.      
1520  */                                              
1521 int __generic_file_fsync(struct file *file, l    
1522                                  int datasync    
1523 {                                                
1524         struct inode *inode = file->f_mapping    
1525         int err;                                 
1526         int ret;                                 
1527                                                  
1528         err = file_write_and_wait_range(file,    
1529         if (err)                                 
1530                 return err;                      
1531                                                  
1532         inode_lock(inode);                       
1533         ret = sync_mapping_buffers(inode->i_m    
1534         if (!(inode->i_state & I_DIRTY_ALL))     
1535                 goto out;                        
1536         if (datasync && !(inode->i_state & I_    
1537                 goto out;                        
1538                                                  
1539         err = sync_inode_metadata(inode, 1);     
1540         if (ret == 0)                            
1541                 ret = err;                       
1542                                                  
1543 out:                                             
1544         inode_unlock(inode);                     
1545         /* check and advance again to catch e    
1546         err = file_check_and_advance_wb_err(f    
1547         if (ret == 0)                            
1548                 ret = err;                       
1549         return ret;                              
1550 }                                                
1551 EXPORT_SYMBOL(__generic_file_fsync);             
1552                                                  
1553 /**                                              
1554  * generic_file_fsync - generic fsync impleme    
1555  *                      with flush               
1556  * @file:       file to synchronize              
1557  * @start:      start offset in bytes            
1558  * @end:        end offset in bytes (inclusiv    
1559  * @datasync:   only synchronize essential me    
1560  *                                               
1561  */                                              
1562                                                  
1563 int generic_file_fsync(struct file *file, lof    
1564                        int datasync)             
1565 {                                                
1566         struct inode *inode = file->f_mapping    
1567         int err;                                 
1568                                                  
1569         err = __generic_file_fsync(file, star    
1570         if (err)                                 
1571                 return err;                      
1572         return blkdev_issue_flush(inode->i_sb    
1573 }                                                
1574 EXPORT_SYMBOL(generic_file_fsync);               
1575                                                  
1576 /**                                              
1577  * generic_check_addressable - Check addressa    
1578  * @blocksize_bits:     log of file system bl    
1579  * @num_blocks:         number of blocks in f    
1580  *                                               
1581  * Determine whether a file system with @num_    
1582  * block size of 2**@blocksize_bits) is addre    
1583  * and page cache of the system.  Return 0 if    
1584  */                                              
1585 int generic_check_addressable(unsigned blocks    
1586 {                                                
1587         u64 last_fs_block = num_blocks - 1;      
1588         u64 last_fs_page =                       
1589                 last_fs_block >> (PAGE_SHIFT     
1590                                                  
1591         if (unlikely(num_blocks == 0))           
1592                 return 0;                        
1593                                                  
1594         if ((blocksize_bits < 9) || (blocksiz    
1595                 return -EINVAL;                  
1596                                                  
1597         if ((last_fs_block > (sector_t)(~0ULL    
1598             (last_fs_page > (pgoff_t)(~0ULL))    
1599                 return -EFBIG;                   
1600         }                                        
1601         return 0;                                
1602 }                                                
1603 EXPORT_SYMBOL(generic_check_addressable);        
1604                                                  
1605 /*                                               
1606  * No-op implementation of ->fsync for in-mem    
1607  */                                              
1608 int noop_fsync(struct file *file, loff_t star    
1609 {                                                
1610         return 0;                                
1611 }                                                
1612 EXPORT_SYMBOL(noop_fsync);                       
1613                                                  
1614 ssize_t noop_direct_IO(struct kiocb *iocb, st    
1615 {                                                
1616         /*                                       
1617          * iomap based filesystems support di    
1618          * this callback. However, it still n    
1619          * inode->a_ops so that open/fcntl kn    
1620          * generally supported.                  
1621          */                                      
1622         return -EINVAL;                          
1623 }                                                
1624 EXPORT_SYMBOL_GPL(noop_direct_IO);               
1625                                                  
1626 /* Because kfree isn't assignment-compatible     
1627 void kfree_link(void *p)                         
1628 {                                                
1629         kfree(p);                                
1630 }                                                
1631 EXPORT_SYMBOL(kfree_link);                       
1632                                                  
1633 struct inode *alloc_anon_inode(struct super_b    
1634 {                                                
1635         static const struct address_space_ope    
1636                 .dirty_folio    = noop_dirty_    
1637         };                                       
1638         struct inode *inode = new_inode_pseud    
1639                                                  
1640         if (!inode)                              
1641                 return ERR_PTR(-ENOMEM);         
1642                                                  
1643         inode->i_ino = get_next_ino();           
1644         inode->i_mapping->a_ops = &anon_aops;    
1645                                                  
1646         /*                                       
1647          * Mark the inode dirty from the very    
1648          * that way it will never be moved to    
1649          * list because mark_inode_dirty() wi    
1650          * that it already _is_ on the dirty     
1651          */                                      
1652         inode->i_state = I_DIRTY;                
1653         inode->i_mode = S_IRUSR | S_IWUSR;       
1654         inode->i_uid = current_fsuid();          
1655         inode->i_gid = current_fsgid();          
1656         inode->i_flags |= S_PRIVATE;             
1657         simple_inode_init_ts(inode);             
1658         return inode;                            
1659 }                                                
1660 EXPORT_SYMBOL(alloc_anon_inode);                 
1661                                                  
1662 /**                                              
1663  * simple_nosetlease - generic helper for pro    
1664  * @filp: file pointer                           
1665  * @arg: type of lease to obtain                 
1666  * @flp: new lease supplied for insertion        
1667  * @priv: private data for lm_setup operation    
1668  *                                               
1669  * Generic helper for filesystems that do not    
1670  * All arguments are ignored and it just retu    
1671  */                                              
1672 int                                              
1673 simple_nosetlease(struct file *filp, int arg,    
1674                   void **priv)                   
1675 {                                                
1676         return -EINVAL;                          
1677 }                                                
1678 EXPORT_SYMBOL(simple_nosetlease);                
1679                                                  
1680 /**                                              
1681  * simple_get_link - generic helper to get th    
1682  * @dentry: not used here                        
1683  * @inode: the symlink inode                     
1684  * @done: not used here                          
1685  *                                               
1686  * Generic helper for filesystems to use for     
1687  * the symlink target is stored in ->i_link.     
1688  * since as an optimization the path lookup c    
1689  * directly, without calling ->get_link().  B    
1690  * to mark the inode_operations as being for     
1691  *                                               
1692  * Return: the symlink target                    
1693  */                                              
1694 const char *simple_get_link(struct dentry *de    
1695                             struct delayed_ca    
1696 {                                                
1697         return inode->i_link;                    
1698 }                                                
1699 EXPORT_SYMBOL(simple_get_link);                  
1700                                                  
1701 const struct inode_operations simple_symlink_    
1702         .get_link = simple_get_link,             
1703 };                                               
1704 EXPORT_SYMBOL(simple_symlink_inode_operations    
1705                                                  
1706 /*                                               
1707  * Operations for a permanently empty directo    
1708  */                                              
1709 static struct dentry *empty_dir_lookup(struct    
1710 {                                                
1711         return ERR_PTR(-ENOENT);                 
1712 }                                                
1713                                                  
1714 static int empty_dir_getattr(struct mnt_idmap    
1715                              const struct pat    
1716                              u32 request_mask    
1717 {                                                
1718         struct inode *inode = d_inode(path->d    
1719         generic_fillattr(&nop_mnt_idmap, requ    
1720         return 0;                                
1721 }                                                
1722                                                  
1723 static int empty_dir_setattr(struct mnt_idmap    
1724                              struct dentry *d    
1725 {                                                
1726         return -EPERM;                           
1727 }                                                
1728                                                  
1729 static ssize_t empty_dir_listxattr(struct den    
1730 {                                                
1731         return -EOPNOTSUPP;                      
1732 }                                                
1733                                                  
1734 static const struct inode_operations empty_di    
1735         .lookup         = empty_dir_lookup,      
1736         .permission     = generic_permission,    
1737         .setattr        = empty_dir_setattr,     
1738         .getattr        = empty_dir_getattr,     
1739         .listxattr      = empty_dir_listxattr    
1740 };                                               
1741                                                  
1742 static loff_t empty_dir_llseek(struct file *f    
1743 {                                                
1744         /* An empty directory has two entries    
1745         return generic_file_llseek_size(file,    
1746 }                                                
1747                                                  
1748 static int empty_dir_readdir(struct file *fil    
1749 {                                                
1750         dir_emit_dots(file, ctx);                
1751         return 0;                                
1752 }                                                
1753                                                  
1754 static const struct file_operations empty_dir    
1755         .llseek         = empty_dir_llseek,      
1756         .read           = generic_read_dir,      
1757         .iterate_shared = empty_dir_readdir,     
1758         .fsync          = noop_fsync,            
1759 };                                               
1760                                                  
1761                                                  
1762 void make_empty_dir_inode(struct inode *inode    
1763 {                                                
1764         set_nlink(inode, 2);                     
1765         inode->i_mode = S_IFDIR | S_IRUGO | S    
1766         inode->i_uid = GLOBAL_ROOT_UID;          
1767         inode->i_gid = GLOBAL_ROOT_GID;          
1768         inode->i_rdev = 0;                       
1769         inode->i_size = 0;                       
1770         inode->i_blkbits = PAGE_SHIFT;           
1771         inode->i_blocks = 0;                     
1772                                                  
1773         inode->i_op = &empty_dir_inode_operat    
1774         inode->i_opflags &= ~IOP_XATTR;          
1775         inode->i_fop = &empty_dir_operations;    
1776 }                                                
1777                                                  
1778 bool is_empty_dir_inode(struct inode *inode)     
1779 {                                                
1780         return (inode->i_fop == &empty_dir_op    
1781                 (inode->i_op == &empty_dir_in    
1782 }                                                
1783                                                  
1784 #if IS_ENABLED(CONFIG_UNICODE)                   
1785 /**                                              
1786  * generic_ci_d_compare - generic d_compare i    
1787  * @dentry:     dentry whose name we are chec    
1788  * @len:        len of name of dentry            
1789  * @str:        str pointer to name of dentry    
1790  * @name:       Name to compare against          
1791  *                                               
1792  * Return: 0 if names match, 1 if mismatch, o    
1793  */                                              
1794 static int generic_ci_d_compare(const struct     
1795                                 const char *s    
1796 {                                                
1797         const struct dentry *parent;             
1798         const struct inode *dir;                 
1799         char strbuf[DNAME_INLINE_LEN];           
1800         struct qstr qstr;                        
1801                                                  
1802         /*                                       
1803          * Attempt a case-sensitive match fir    
1804          * should cover most lookups, includi    
1805          * applications that expect a case-se    
1806          *                                       
1807          * This comparison is safe under RCU     
1808          * guarantees the consistency between    
1809          * __d_lookup_rcu_op_compare() for de    
1810          */                                      
1811         if (len == name->len && !memcmp(str,     
1812                 return 0;                        
1813                                                  
1814         parent = READ_ONCE(dentry->d_parent);    
1815         dir = READ_ONCE(parent->d_inode);        
1816         if (!dir || !IS_CASEFOLDED(dir))         
1817                 return 1;                        
1818                                                  
1819         /*                                       
1820          * If the dentry name is stored in-li    
1821          * modified by a rename.  If this hap    
1822          * the lookup, so it doesn't matter w    
1823          * However, it's unsafe to call utf8_    
1824          * string.  Therefore, we have to cop    
1825          */                                      
1826         if (len <= DNAME_INLINE_LEN - 1) {       
1827                 memcpy(strbuf, str, len);        
1828                 strbuf[len] = 0;                 
1829                 str = strbuf;                    
1830                 /* prevent compiler from opti    
1831                 barrier();                       
1832         }                                        
1833         qstr.len = len;                          
1834         qstr.name = str;                         
1835                                                  
1836         return utf8_strncasecmp(dentry->d_sb-    
1837 }                                                
1838                                                  
1839 /**                                              
1840  * generic_ci_d_hash - generic d_hash impleme    
1841  * @dentry:     dentry of the parent director    
1842  * @str:        qstr of name whose hash we sh    
1843  *                                               
1844  * Return: 0 if hash was successful or unchan    
1845  */                                              
1846 static int generic_ci_d_hash(const struct den    
1847 {                                                
1848         const struct inode *dir = READ_ONCE(d    
1849         struct super_block *sb = dentry->d_sb    
1850         const struct unicode_map *um = sb->s_    
1851         int ret;                                 
1852                                                  
1853         if (!dir || !IS_CASEFOLDED(dir))         
1854                 return 0;                        
1855                                                  
1856         ret = utf8_casefold_hash(um, dentry,     
1857         if (ret < 0 && sb_has_strict_encoding    
1858                 return -EINVAL;                  
1859         return 0;                                
1860 }                                                
1861                                                  
1862 static const struct dentry_operations generic    
1863         .d_hash = generic_ci_d_hash,             
1864         .d_compare = generic_ci_d_compare,       
1865 #ifdef CONFIG_FS_ENCRYPTION                      
1866         .d_revalidate = fscrypt_d_revalidate,    
1867 #endif                                           
1868 };                                               
1869                                                  
1870 /**                                              
1871  * generic_ci_match() - Match a name (case-in    
1872  * This is a filesystem helper for comparison    
1873  * generic_ci_d_compare should be used in VFS    
1874  *                                               
1875  * @parent: Inode of the parent of the dirent    
1876  * @name: name under lookup.                     
1877  * @folded_name: Optional pre-folded name und    
1878  * @de_name: Dirent name.                        
1879  * @de_name_len: dirent name length.             
1880  *                                               
1881  * Test whether a case-insensitive directory     
1882  * being searched.  If @folded_name is provid    
1883  * recalculating the casefold of @name.          
1884  *                                               
1885  * Return: > 0 if the directory entry matches    
1886  * < 0 on error.                                 
1887  */                                              
1888 int generic_ci_match(const struct inode *pare    
1889                      const struct qstr *name,    
1890                      const struct qstr *folde    
1891                      const u8 *de_name, u32 d    
1892 {                                                
1893         const struct super_block *sb = parent    
1894         const struct unicode_map *um = sb->s_    
1895         struct fscrypt_str decrypted_name = F    
1896         struct qstr dirent = QSTR_INIT(de_nam    
1897         int res = 0;                             
1898                                                  
1899         if (IS_ENCRYPTED(parent)) {              
1900                 const struct fscrypt_str encr    
1901                         FSTR_INIT((u8 *) de_n    
1902                                                  
1903                 if (WARN_ON_ONCE(!fscrypt_has    
1904                         return -EINVAL;          
1905                                                  
1906                 decrypted_name.name = kmalloc    
1907                 if (!decrypted_name.name)        
1908                         return -ENOMEM;          
1909                 res = fscrypt_fname_disk_to_u    
1910                                                  
1911                 if (res < 0) {                   
1912                         kfree(decrypted_name.    
1913                         return res;              
1914                 }                                
1915                 dirent.name = decrypted_name.    
1916                 dirent.len = decrypted_name.l    
1917         }                                        
1918                                                  
1919         /*                                       
1920          * Attempt a case-sensitive match fir    
1921          * should cover most lookups, includi    
1922          * applications that expect a case-se    
1923          */                                      
1924                                                  
1925         if (dirent.len == name->len &&           
1926             !memcmp(name->name, dirent.name,     
1927                 goto out;                        
1928                                                  
1929         if (folded_name->name)                   
1930                 res = utf8_strncasecmp_folded    
1931         else                                     
1932                 res = utf8_strncasecmp(um, na    
1933                                                  
1934 out:                                             
1935         kfree(decrypted_name.name);              
1936         if (res < 0 && sb_has_strict_encoding    
1937                 pr_err_ratelimited("Directory    
1938                 return 0;                        
1939         }                                        
1940         return !res;                             
1941 }                                                
1942 EXPORT_SYMBOL(generic_ci_match);                 
1943 #endif                                           
1944                                                  
1945 #ifdef CONFIG_FS_ENCRYPTION                      
1946 static const struct dentry_operations generic    
1947         .d_revalidate = fscrypt_d_revalidate,    
1948 };                                               
1949 #endif                                           
1950                                                  
1951 /**                                              
1952  * generic_set_sb_d_ops - helper for choosing    
1953  * filesystem-wide dentry operations for the     
1954  * @sb: superblock to be configured              
1955  *                                               
1956  * Filesystems supporting casefolding and/or     
1957  * helper at mount-time to configure sb->s_d_    
1958  * operations required for the enabled featur    
1959  * called after these have been configured, b    
1960  * is created.                                   
1961  */                                              
1962 void generic_set_sb_d_ops(struct super_block     
1963 {                                                
1964 #if IS_ENABLED(CONFIG_UNICODE)                   
1965         if (sb->s_encoding) {                    
1966                 sb->s_d_op = &generic_ci_dent    
1967                 return;                          
1968         }                                        
1969 #endif                                           
1970 #ifdef CONFIG_FS_ENCRYPTION                      
1971         if (sb->s_cop) {                         
1972                 sb->s_d_op = &generic_encrypt    
1973                 return;                          
1974         }                                        
1975 #endif                                           
1976 }                                                
1977 EXPORT_SYMBOL(generic_set_sb_d_ops);             
1978                                                  
1979 /**                                              
1980  * inode_maybe_inc_iversion - increments i_ve    
1981  * @inode: inode with the i_version that shou    
1982  * @force: increment the counter even if it's    
1983  *                                               
1984  * Every time the inode is modified, the i_ve    
1985  * changed by any observer.                      
1986  *                                               
1987  * If "force" is set or the QUERIED flag is s    
1988  * the value, and clear the queried flag.        
1989  *                                               
1990  * In the common case where neither is set, t    
1991  * updating i_version.                           
1992  *                                               
1993  * If this function returns false, and no oth    
1994  * can avoid logging the metadata.               
1995  */                                              
1996 bool inode_maybe_inc_iversion(struct inode *i    
1997 {                                                
1998         u64 cur, new;                            
1999                                                  
2000         /*                                       
2001          * The i_version field is not strictl    
2002          * information, but the legacy inode_    
2003          * to serialize increments.              
2004          *                                       
2005          * We add a full memory barrier to en    
2006          * with other state is preserved (eit    
2007          * or explicitly from smp_mb if we do    
2008          * the former).                          
2009          *                                       
2010          * These barriers pair with inode_que    
2011          */                                      
2012         cur = inode_peek_iversion_raw(inode);    
2013         if (!force && !(cur & I_VERSION_QUERI    
2014                 smp_mb();                        
2015                 cur = inode_peek_iversion_raw    
2016         }                                        
2017                                                  
2018         do {                                     
2019                 /* If flag is clear then we n    
2020                 if (!force && !(cur & I_VERSI    
2021                         return false;            
2022                                                  
2023                 /* Since lowest bit is flag,     
2024                 new = (cur & ~I_VERSION_QUERI    
2025         } while (!atomic64_try_cmpxchg(&inode    
2026         return true;                             
2027 }                                                
2028 EXPORT_SYMBOL(inode_maybe_inc_iversion);         
2029                                                  
2030 /**                                              
2031  * inode_query_iversion - read i_version for     
2032  * @inode: inode from which i_version should     
2033  *                                               
2034  * Read the inode i_version counter. This sho    
2035  * to store the returned i_version for later     
2036  * that a later query of the i_version will r    
2037  * anything has changed.                         
2038  *                                               
2039  * In this implementation, we fetch the curre    
2040  * then try to swap it into place with a cmpx    
2041  * that fails, we try again with the newly fe    
2042  */                                              
2043 u64 inode_query_iversion(struct inode *inode)    
2044 {                                                
2045         u64 cur, new;                            
2046         bool fenced = false;                     
2047                                                  
2048         /*                                       
2049          * Memory barriers (implicit in cmpxc    
2050          * inode_maybe_inc_iversion(), see th    
2051          */                                      
2052         cur = inode_peek_iversion_raw(inode);    
2053         do {                                     
2054                 /* If flag is already set, th    
2055                 if (cur & I_VERSION_QUERIED)     
2056                         if (!fenced)             
2057                                 smp_mb();        
2058                         break;                   
2059                 }                                
2060                                                  
2061                 fenced = true;                   
2062                 new = cur | I_VERSION_QUERIED    
2063         } while (!atomic64_try_cmpxchg(&inode    
2064         return cur >> I_VERSION_QUERIED_SHIFT    
2065 }                                                
2066 EXPORT_SYMBOL(inode_query_iversion);             
2067                                                  
2068 ssize_t direct_write_fallback(struct kiocb *i    
2069                 ssize_t direct_written, ssize    
2070 {                                                
2071         struct address_space *mapping = iocb-    
2072         loff_t pos = iocb->ki_pos - buffered_    
2073         loff_t end = iocb->ki_pos - 1;           
2074         int err;                                 
2075                                                  
2076         /*                                       
2077          * If the buffered write fallback ret    
2078          * the number of bytes which were wri    
2079          * code if that was zero.                
2080          *                                       
2081          * Note that this differs from normal    
2082          * return -EFOO even if some bytes we    
2083          */                                      
2084         if (unlikely(buffered_written < 0)) {    
2085                 if (direct_written)              
2086                         return direct_written    
2087                 return buffered_written;         
2088         }                                        
2089                                                  
2090         /*                                       
2091          * We need to ensure that the page ca    
2092          * invalidated to preserve the expect    
2093          */                                      
2094         err = filemap_write_and_wait_range(ma    
2095         if (err < 0) {                           
2096                 /*                               
2097                  * We don't know how much we     
2098                  * bytes which were direct-wr    
2099                  */                              
2100                 iocb->ki_pos -= buffered_writ    
2101                 if (direct_written)              
2102                         return direct_written    
2103                 return err;                      
2104         }                                        
2105         invalidate_mapping_pages(mapping, pos    
2106         return direct_written + buffered_writ    
2107 }                                                
2108 EXPORT_SYMBOL_GPL(direct_write_fallback);        
2109                                                  
2110 /**                                              
2111  * simple_inode_init_ts - initialize the time    
2112  * @inode: inode to be initialized               
2113  *                                               
2114  * When a new inode is created, most filesyst    
2115  * current time. Add a helper to do this.        
2116  */                                              
2117 struct timespec64 simple_inode_init_ts(struct    
2118 {                                                
2119         struct timespec64 ts = inode_set_ctim    
2120                                                  
2121         inode_set_atime_to_ts(inode, ts);        
2122         inode_set_mtime_to_ts(inode, ts);        
2123         return ts;                               
2124 }                                                
2125 EXPORT_SYMBOL(simple_inode_init_ts);             
2126                                                  
2127 static inline struct dentry *get_stashed_dent    
2128 {                                                
2129         struct dentry *dentry;                   
2130                                                  
2131         guard(rcu)();                            
2132         dentry = rcu_dereference(*stashed);      
2133         if (!dentry)                             
2134                 return NULL;                     
2135         if (!lockref_get_not_dead(&dentry->d_    
2136                 return NULL;                     
2137         return dentry;                           
2138 }                                                
2139                                                  
2140 static struct dentry *prepare_anon_dentry(str    
2141                                           str    
2142                                           voi    
2143 {                                                
2144         struct dentry *dentry;                   
2145         struct inode *inode;                     
2146         const struct stashed_operations *sops    
2147         int ret;                                 
2148                                                  
2149         inode = new_inode_pseudo(sb);            
2150         if (!inode) {                            
2151                 sops->put_data(data);            
2152                 return ERR_PTR(-ENOMEM);         
2153         }                                        
2154                                                  
2155         inode->i_flags |= S_IMMUTABLE;           
2156         inode->i_mode = S_IFREG;                 
2157         simple_inode_init_ts(inode);             
2158                                                  
2159         ret = sops->init_inode(inode, data);     
2160         if (ret < 0) {                           
2161                 iput(inode);                     
2162                 return ERR_PTR(ret);             
2163         }                                        
2164                                                  
2165         /* Notice when this is changed. */       
2166         WARN_ON_ONCE(!S_ISREG(inode->i_mode))    
2167         WARN_ON_ONCE(!IS_IMMUTABLE(inode));      
2168                                                  
2169         dentry = d_alloc_anon(sb);               
2170         if (!dentry) {                           
2171                 iput(inode);                     
2172                 return ERR_PTR(-ENOMEM);         
2173         }                                        
2174                                                  
2175         /* Store address of location where de    
2176         dentry->d_fsdata = stashed;              
2177                                                  
2178         /* @data is now owned by the fs */       
2179         d_instantiate(dentry, inode);            
2180         return dentry;                           
2181 }                                                
2182                                                  
2183 static struct dentry *stash_dentry(struct den    
2184                                    struct den    
2185 {                                                
2186         guard(rcu)();                            
2187         for (;;) {                               
2188                 struct dentry *old;              
2189                                                  
2190                 /* Assume any old dentry was     
2191                 old = cmpxchg(stashed, NULL,     
2192                 if (likely(!old))                
2193                         return dentry;           
2194                                                  
2195                 /* Check if somebody else ins    
2196                 if (lockref_get_not_dead(&old    
2197                         return old;              
2198                                                  
2199                 /* There's an old dead dentry    
2200                 if (likely(try_cmpxchg(stashe    
2201                         return dentry;           
2202         }                                        
2203 }                                                
2204                                                  
2205 /**                                              
2206  * path_from_stashed - create path from stash    
2207  * @stashed:    where to retrieve or stash de    
2208  * @mnt:        mnt of the filesystems to use    
2209  * @data:       data to store in inode->i_pri    
2210  * @path:       path to create                   
2211  *                                               
2212  * The function tries to retrieve a stashed d    
2213  * is still valid then it will be reused. If     
2214  * will allocate a new dentry and inode. It w    
2215  * can reuse an existing dentry in case one h    
2216  * update @stashed with the newly added dentr    
2217  *                                               
2218  * Special-purpose helper for nsfs and pidfs.    
2219  *                                               
2220  * Return: On success zero and on failure a n    
2221  */                                              
2222 int path_from_stashed(struct dentry **stashed    
2223                       struct path *path)         
2224 {                                                
2225         struct dentry *dentry;                   
2226         const struct stashed_operations *sops    
2227                                                  
2228         /* See if dentry can be reused. */       
2229         path->dentry = get_stashed_dentry(sta    
2230         if (path->dentry) {                      
2231                 sops->put_data(data);            
2232                 goto out_path;                   
2233         }                                        
2234                                                  
2235         /* Allocate a new dentry. */             
2236         dentry = prepare_anon_dentry(stashed,    
2237         if (IS_ERR(dentry))                      
2238                 return PTR_ERR(dentry);          
2239                                                  
2240         /* Added a new dentry. @data is now o    
2241         path->dentry = stash_dentry(stashed,     
2242         if (path->dentry != dentry)              
2243                 dput(dentry);                    
2244                                                  
2245 out_path:                                        
2246         WARN_ON_ONCE(path->dentry->d_fsdata !    
2247         WARN_ON_ONCE(d_inode(path->dentry)->i    
2248         path->mnt = mntget(mnt);                 
2249         return 0;                                
2250 }                                                
2251                                                  
2252 void stashed_dentry_prune(struct dentry *dent    
2253 {                                                
2254         struct dentry **stashed = dentry->d_f    
2255         struct inode *inode = d_inode(dentry)    
2256                                                  
2257         if (WARN_ON_ONCE(!stashed))              
2258                 return;                          
2259                                                  
2260         if (!inode)                              
2261                 return;                          
2262                                                  
2263         /*                                       
2264          * Only replace our own @dentry as so    
2265          * already cleared out @dentry and st    
2266          * dentry in there.                      
2267          */                                      
2268         cmpxchg(stashed, dentry, NULL);          
2269 }                                                
2270                                                  

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php