~ [ 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-2.6.32.71)


  1 // SPDX-License-Identifier: GPL-2.0-only       << 
  2 /*                                                  1 /*
  3  *      fs/libfs.c                                  2  *      fs/libfs.c
  4  *      Library for filesystems writers.            3  *      Library for filesystems writers.
  5  */                                                 4  */
  6                                                     5 
  7 #include <linux/blkdev.h>                      !!   6 #include <linux/module.h>
  8 #include <linux/export.h>                      << 
  9 #include <linux/pagemap.h>                          7 #include <linux/pagemap.h>
 10 #include <linux/slab.h>                        << 
 11 #include <linux/cred.h>                        << 
 12 #include <linux/mount.h>                            8 #include <linux/mount.h>
 13 #include <linux/vfs.h>                              9 #include <linux/vfs.h>
 14 #include <linux/quotaops.h>                    << 
 15 #include <linux/mutex.h>                           10 #include <linux/mutex.h>
 16 #include <linux/namei.h>                       << 
 17 #include <linux/exportfs.h>                        11 #include <linux/exportfs.h>
 18 #include <linux/iversion.h>                    << 
 19 #include <linux/writeback.h>                       12 #include <linux/writeback.h>
 20 #include <linux/buffer_head.h> /* sync_mapping !!  13 #include <linux/buffer_head.h>
 21 #include <linux/fs_context.h>                  !!  14 
 22 #include <linux/pseudo_fs.h>                   !!  15 #include <asm/uaccess.h>
 23 #include <linux/fsnotify.h>                    !!  16 
 24 #include <linux/unicode.h>                     !!  17 int simple_getattr(struct vfsmount *mnt, struct dentry *dentry,
 25 #include <linux/fscrypt.h>                     !!  18                    struct kstat *stat)
 26 #include <linux/pidfs.h>                       !!  19 {
 27                                                !!  20         struct inode *inode = dentry->d_inode;
 28 #include <linux/uaccess.h>                     !!  21         generic_fillattr(inode, stat);
 29                                                !!  22         stat->blocks = inode->i_mapping->nrpages << (PAGE_CACHE_SHIFT - 9);
 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;                                  23         return 0;
 40 }                                                  24 }
 41 EXPORT_SYMBOL(simple_getattr);                 << 
 42                                                    25 
 43 int simple_statfs(struct dentry *dentry, struc     26 int simple_statfs(struct dentry *dentry, struct kstatfs *buf)
 44 {                                                  27 {
 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;       28         buf->f_type = dentry->d_sb->s_magic;
 49         buf->f_bsize = PAGE_SIZE;              !!  29         buf->f_bsize = PAGE_CACHE_SIZE;
 50         buf->f_namelen = NAME_MAX;                 30         buf->f_namelen = NAME_MAX;
 51         return 0;                                  31         return 0;
 52 }                                                  32 }
 53 EXPORT_SYMBOL(simple_statfs);                  << 
 54                                                    33 
 55 /*                                                 34 /*
 56  * Retaining negative dentries for an in-memor     35  * Retaining negative dentries for an in-memory filesystem just wastes
 57  * memory and lookup time: arrange for them to     36  * memory and lookup time: arrange for them to be deleted immediately.
 58  */                                                37  */
 59 int always_delete_dentry(const struct dentry * !!  38 static int simple_delete_dentry(struct dentry *dentry)
 60 {                                                  39 {
 61         return 1;                                  40         return 1;
 62 }                                                  41 }
 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                                                    42 
 70 /*                                                 43 /*
 71  * Lookup the data. This is trivial - if the d     44  * Lookup the data. This is trivial - if the dentry didn't already
 72  * exist, we know it is negative.  Set d_op to     45  * exist, we know it is negative.  Set d_op to delete negative dentries.
 73  */                                                46  */
 74 struct dentry *simple_lookup(struct inode *dir !!  47 struct dentry *simple_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
 75 {                                                  48 {
                                                   >>  49         static const struct dentry_operations simple_dentry_operations = {
                                                   >>  50                 .d_delete = simple_delete_dentry,
                                                   >>  51         };
                                                   >>  52 
 76         if (dentry->d_name.len > NAME_MAX)         53         if (dentry->d_name.len > NAME_MAX)
 77                 return ERR_PTR(-ENAMETOOLONG);     54                 return ERR_PTR(-ENAMETOOLONG);
 78         if (!dentry->d_sb->s_d_op)             !!  55         dentry->d_op = &simple_dentry_operations;
 79                 d_set_d_op(dentry, &simple_den << 
 80         d_add(dentry, NULL);                       56         d_add(dentry, NULL);
 81         return NULL;                               57         return NULL;
 82 }                                                  58 }
 83 EXPORT_SYMBOL(simple_lookup);                  << 
 84                                                    59 
                                                   >>  60 int simple_sync_file(struct file * file, struct dentry *dentry, int datasync)
                                                   >>  61 {
                                                   >>  62         return 0;
                                                   >>  63 }
                                                   >>  64  
 85 int dcache_dir_open(struct inode *inode, struc     65 int dcache_dir_open(struct inode *inode, struct file *file)
 86 {                                                  66 {
 87         file->private_data = d_alloc_cursor(fi !!  67         static struct qstr cursor_name = {.len = 1, .name = "."};
                                                   >>  68 
                                                   >>  69         file->private_data = d_alloc(file->f_path.dentry, &cursor_name);
 88                                                    70 
 89         return file->private_data ? 0 : -ENOME     71         return file->private_data ? 0 : -ENOMEM;
 90 }                                                  72 }
 91 EXPORT_SYMBOL(dcache_dir_open);                << 
 92                                                    73 
 93 int dcache_dir_close(struct inode *inode, stru     74 int dcache_dir_close(struct inode *inode, struct file *file)
 94 {                                                  75 {
 95         dput(file->private_data);                  76         dput(file->private_data);
 96         return 0;                                  77         return 0;
 97 }                                                  78 }
 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                                                    79 
145 loff_t dcache_dir_lseek(struct file *file, lof !!  80 loff_t dcache_dir_lseek(struct file *file, loff_t offset, int origin)
146 {                                                  81 {
147         struct dentry *dentry = file->f_path.d !!  82         mutex_lock(&file->f_path.dentry->d_inode->i_mutex);
148         switch (whence) {                      !!  83         switch (origin) {
149                 case 1:                            84                 case 1:
150                         offset += file->f_pos;     85                         offset += file->f_pos;
151                         fallthrough;           << 
152                 case 0:                            86                 case 0:
153                         if (offset >= 0)           87                         if (offset >= 0)
154                                 break;             88                                 break;
155                         fallthrough;           << 
156                 default:                           89                 default:
                                                   >>  90                         mutex_unlock(&file->f_path.dentry->d_inode->i_mutex);
157                         return -EINVAL;            91                         return -EINVAL;
158         }                                          92         }
159         if (offset != file->f_pos) {               93         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;              94                 file->f_pos = offset;
176                                                !!  95                 if (file->f_pos >= 2) {
177                 inode_unlock_shared(dentry->d_ !!  96                         struct list_head *p;
                                                   >>  97                         struct dentry *cursor = file->private_data;
                                                   >>  98                         loff_t n = file->f_pos - 2;
                                                   >>  99 
                                                   >> 100                         spin_lock(&dcache_lock);
                                                   >> 101                         list_del(&cursor->d_u.d_child);
                                                   >> 102                         p = file->f_path.dentry->d_subdirs.next;
                                                   >> 103                         while (n && p != &file->f_path.dentry->d_subdirs) {
                                                   >> 104                                 struct dentry *next;
                                                   >> 105                                 next = list_entry(p, struct dentry, d_u.d_child);
                                                   >> 106                                 if (!d_unhashed(next) && next->d_inode)
                                                   >> 107                                         n--;
                                                   >> 108                                 p = p->next;
                                                   >> 109                         }
                                                   >> 110                         list_add_tail(&cursor->d_u.d_child, p);
                                                   >> 111                         spin_unlock(&dcache_lock);
                                                   >> 112                 }
178         }                                         113         }
                                                   >> 114         mutex_unlock(&file->f_path.dentry->d_inode->i_mutex);
179         return offset;                            115         return offset;
180 }                                                 116 }
181 EXPORT_SYMBOL(dcache_dir_lseek);               !! 117 
                                                   >> 118 /* Relationship between i_mode and the DT_xxx types */
                                                   >> 119 static inline unsigned char dt_type(struct inode *inode)
                                                   >> 120 {
                                                   >> 121         return (inode->i_mode >> 12) & 15;
                                                   >> 122 }
182                                                   123 
183 /*                                                124 /*
184  * Directory is locked and all positive dentri    125  * Directory is locked and all positive dentries in it are safe, since
185  * for ramfs-type trees they can't go away wit    126  * for ramfs-type trees they can't go away without unlink() or rmdir(),
186  * both impossible due to the lock on director    127  * both impossible due to the lock on directory.
187  */                                               128  */
188                                                   129 
189 int dcache_readdir(struct file *file, struct d !! 130 int dcache_readdir(struct file * filp, void * dirent, filldir_t filldir)
190 {                                                 131 {
191         struct dentry *dentry = file->f_path.d !! 132         struct dentry *dentry = filp->f_path.dentry;
192         struct dentry *cursor = file->private_ !! 133         struct dentry *cursor = filp->private_data;
193         struct dentry *next = NULL;            !! 134         struct list_head *p, *q = &cursor->d_u.d_child;
194         struct hlist_node **p;                 !! 135         ino_t ino;
195                                                !! 136         int i = filp->f_pos;
196         if (!dir_emit_dots(file, ctx))         << 
197                 return 0;                      << 
198                                                   137 
199         if (ctx->pos == 2)                     !! 138         switch (i) {
200                 p = &dentry->d_children.first; !! 139                 case 0:
201         else                                   !! 140                         ino = dentry->d_inode->i_ino;
202                 p = &cursor->d_sib.next;       !! 141                         if (filldir(dirent, ".", 1, i, ino, DT_DIR) < 0)
203                                                !! 142                                 break;
204         while ((next = scan_positives(cursor,  !! 143                         filp->f_pos++;
205                 if (!dir_emit(ctx, next->d_nam !! 144                         i++;
206                               d_inode(next)->i !! 145                         /* fallthrough */
207                               fs_umode_to_dtyp !! 146                 case 1:
208                         break;                 !! 147                         ino = parent_ino(dentry);
209                 ctx->pos++;                    !! 148                         if (filldir(dirent, "..", 2, i, ino, DT_DIR) < 0)
210                 p = &next->d_sib.next;         !! 149                                 break;
                                                   >> 150                         filp->f_pos++;
                                                   >> 151                         i++;
                                                   >> 152                         /* fallthrough */
                                                   >> 153                 default:
                                                   >> 154                         spin_lock(&dcache_lock);
                                                   >> 155                         if (filp->f_pos == 2)
                                                   >> 156                                 list_move(q, &dentry->d_subdirs);
                                                   >> 157 
                                                   >> 158                         for (p=q->next; p != &dentry->d_subdirs; p=p->next) {
                                                   >> 159                                 struct dentry *next;
                                                   >> 160                                 next = list_entry(p, struct dentry, d_u.d_child);
                                                   >> 161                                 if (d_unhashed(next) || !next->d_inode)
                                                   >> 162                                         continue;
                                                   >> 163 
                                                   >> 164                                 spin_unlock(&dcache_lock);
                                                   >> 165                                 if (filldir(dirent, next->d_name.name, 
                                                   >> 166                                             next->d_name.len, filp->f_pos, 
                                                   >> 167                                             next->d_inode->i_ino, 
                                                   >> 168                                             dt_type(next->d_inode)) < 0)
                                                   >> 169                                         return 0;
                                                   >> 170                                 spin_lock(&dcache_lock);
                                                   >> 171                                 /* next is still alive */
                                                   >> 172                                 list_move(q, p);
                                                   >> 173                                 p = q;
                                                   >> 174                                 filp->f_pos++;
                                                   >> 175                         }
                                                   >> 176                         spin_unlock(&dcache_lock);
211         }                                         177         }
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;                                 178         return 0;
220 }                                                 179 }
221 EXPORT_SYMBOL(dcache_readdir);                 << 
222                                                   180 
223 ssize_t generic_read_dir(struct file *filp, ch    181 ssize_t generic_read_dir(struct file *filp, char __user *buf, size_t siz, loff_t *ppos)
224 {                                                 182 {
225         return -EISDIR;                           183         return -EISDIR;
226 }                                                 184 }
227 EXPORT_SYMBOL(generic_read_dir);               << 
228                                                   185 
229 const struct file_operations simple_dir_operat    186 const struct file_operations simple_dir_operations = {
230         .open           = dcache_dir_open,        187         .open           = dcache_dir_open,
231         .release        = dcache_dir_close,       188         .release        = dcache_dir_close,
232         .llseek         = dcache_dir_lseek,       189         .llseek         = dcache_dir_lseek,
233         .read           = generic_read_dir,       190         .read           = generic_read_dir,
234         .iterate_shared = dcache_readdir,      !! 191         .readdir        = dcache_readdir,
235         .fsync          = noop_fsync,          !! 192         .fsync          = simple_sync_file,
236 };                                                193 };
237 EXPORT_SYMBOL(simple_dir_operations);          << 
238                                                   194 
239 const struct inode_operations simple_dir_inode    195 const struct inode_operations simple_dir_inode_operations = {
240         .lookup         = simple_lookup,          196         .lookup         = simple_lookup,
241 };                                                197 };
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                                                   198 
658 static const struct super_operations simple_su    199 static const struct super_operations simple_super_operations = {
659         .statfs         = simple_statfs,          200         .statfs         = simple_statfs,
660 };                                                201 };
661                                                   202 
662 static int pseudo_fs_fill_super(struct super_b !! 203 /*
                                                   >> 204  * Common helper for pseudo-filesystems (sockfs, pipefs, bdev - stuff that
                                                   >> 205  * will never be mountable)
                                                   >> 206  */
                                                   >> 207 int get_sb_pseudo(struct file_system_type *fs_type, char *name,
                                                   >> 208         const struct super_operations *ops, unsigned long magic,
                                                   >> 209         struct vfsmount *mnt)
663 {                                                 210 {
664         struct pseudo_fs_context *ctx = fc->fs !! 211         struct super_block *s = sget(fs_type, NULL, set_anon_super, NULL);
                                                   >> 212         struct dentry *dentry;
665         struct inode *root;                       213         struct inode *root;
                                                   >> 214         struct qstr d_name = {.name = name, .len = strlen(name)};
                                                   >> 215 
                                                   >> 216         if (IS_ERR(s))
                                                   >> 217                 return PTR_ERR(s);
666                                                   218 
                                                   >> 219         s->s_flags = MS_NOUSER;
667         s->s_maxbytes = MAX_LFS_FILESIZE;         220         s->s_maxbytes = MAX_LFS_FILESIZE;
668         s->s_blocksize = PAGE_SIZE;               221         s->s_blocksize = PAGE_SIZE;
669         s->s_blocksize_bits = PAGE_SHIFT;         222         s->s_blocksize_bits = PAGE_SHIFT;
670         s->s_magic = ctx->magic;               !! 223         s->s_magic = magic;
671         s->s_op = ctx->ops ?: &simple_super_op !! 224         s->s_op = ops ? ops : &simple_super_operations;
672         s->s_xattr = ctx->xattr;               << 
673         s->s_time_gran = 1;                       225         s->s_time_gran = 1;
674         root = new_inode(s);                      226         root = new_inode(s);
675         if (!root)                                227         if (!root)
676                 return -ENOMEM;                !! 228                 goto Enomem;
677                                                << 
678         /*                                        229         /*
679          * since this is the first inode, make    230          * since this is the first inode, make it number 1. New inodes created
680          * after this must take care not to co    231          * after this must take care not to collide with it (by passing
681          * max_reserved of 1 to iunique).         232          * max_reserved of 1 to iunique).
682          */                                       233          */
683         root->i_ino = 1;                          234         root->i_ino = 1;
684         root->i_mode = S_IFDIR | S_IRUSR | S_I    235         root->i_mode = S_IFDIR | S_IRUSR | S_IWUSR;
685         simple_inode_init_ts(root);            !! 236         root->i_atime = root->i_mtime = root->i_ctime = CURRENT_TIME;
686         s->s_root = d_make_root(root);         !! 237         dentry = d_alloc(NULL, &d_name);
687         if (!s->s_root)                        !! 238         if (!dentry) {
688                 return -ENOMEM;                !! 239                 iput(root);
689         s->s_d_op = ctx->dops;                 !! 240                 goto Enomem;
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         }                                         241         }
725         return ctx;                            !! 242         dentry->d_sb = s;
726 }                                              !! 243         dentry->d_parent = dentry;
727 EXPORT_SYMBOL(init_pseudo);                    !! 244         d_instantiate(dentry, root);
728                                                !! 245         s->s_root = dentry;
729 int simple_open(struct inode *inode, struct fi !! 246         s->s_flags |= MS_ACTIVE;
730 {                                              !! 247         simple_set_mnt(mnt, s);
731         if (inode->i_private)                  << 
732                 file->private_data = inode->i_ << 
733         return 0;                                 248         return 0;
                                                   >> 249 
                                                   >> 250 Enomem:
                                                   >> 251         deactivate_locked_super(s);
                                                   >> 252         return -ENOMEM;
734 }                                                 253 }
735 EXPORT_SYMBOL(simple_open);                    << 
736                                                   254 
737 int simple_link(struct dentry *old_dentry, str    255 int simple_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)
738 {                                                 256 {
739         struct inode *inode = d_inode(old_dent !! 257         struct inode *inode = old_dentry->d_inode;
740                                                   258 
741         inode_set_mtime_to_ts(dir,             !! 259         inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
742                               inode_set_ctime_ << 
743         inc_nlink(inode);                         260         inc_nlink(inode);
744         ihold(inode);                          !! 261         atomic_inc(&inode->i_count);
745         dget(dentry);                             262         dget(dentry);
746         d_instantiate(dentry, inode);             263         d_instantiate(dentry, inode);
747         return 0;                                 264         return 0;
748 }                                                 265 }
749 EXPORT_SYMBOL(simple_link);                    !! 266 
                                                   >> 267 static inline int simple_positive(struct dentry *dentry)
                                                   >> 268 {
                                                   >> 269         return dentry->d_inode && !d_unhashed(dentry);
                                                   >> 270 }
750                                                   271 
751 int simple_empty(struct dentry *dentry)           272 int simple_empty(struct dentry *dentry)
752 {                                                 273 {
753         struct dentry *child;                     274         struct dentry *child;
754         int ret = 0;                              275         int ret = 0;
755                                                   276 
756         spin_lock(&dentry->d_lock);            !! 277         spin_lock(&dcache_lock);
757         hlist_for_each_entry(child, &dentry->d !! 278         list_for_each_entry(child, &dentry->d_subdirs, d_u.d_child)
758                 spin_lock_nested(&child->d_loc !! 279                 if (simple_positive(child))
759                 if (simple_positive(child)) {  << 
760                         spin_unlock(&child->d_ << 
761                         goto out;                 280                         goto out;
762                 }                              << 
763                 spin_unlock(&child->d_lock);   << 
764         }                                      << 
765         ret = 1;                                  281         ret = 1;
766 out:                                              282 out:
767         spin_unlock(&dentry->d_lock);          !! 283         spin_unlock(&dcache_lock);
768         return ret;                               284         return ret;
769 }                                                 285 }
770 EXPORT_SYMBOL(simple_empty);                   << 
771                                                   286 
772 int simple_unlink(struct inode *dir, struct de    287 int simple_unlink(struct inode *dir, struct dentry *dentry)
773 {                                                 288 {
774         struct inode *inode = d_inode(dentry); !! 289         struct inode *inode = dentry->d_inode;
775                                                   290 
776         inode_set_mtime_to_ts(dir,             !! 291         inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
777                               inode_set_ctime_ << 
778         drop_nlink(inode);                        292         drop_nlink(inode);
779         dput(dentry);                             293         dput(dentry);
780         return 0;                                 294         return 0;
781 }                                                 295 }
782 EXPORT_SYMBOL(simple_unlink);                  << 
783                                                   296 
784 int simple_rmdir(struct inode *dir, struct den    297 int simple_rmdir(struct inode *dir, struct dentry *dentry)
785 {                                                 298 {
786         if (!simple_empty(dentry))                299         if (!simple_empty(dentry))
787                 return -ENOTEMPTY;                300                 return -ENOTEMPTY;
788                                                   301 
789         drop_nlink(d_inode(dentry));           !! 302         drop_nlink(dentry->d_inode);
790         simple_unlink(dir, dentry);               303         simple_unlink(dir, dentry);
791         drop_nlink(dir);                          304         drop_nlink(dir);
792         return 0;                                 305         return 0;
793 }                                                 306 }
794 EXPORT_SYMBOL(simple_rmdir);                   << 
795                                                   307 
796 /**                                            !! 308 int simple_rename(struct inode *old_dir, struct dentry *old_dentry,
797  * simple_rename_timestamp - update the variou !! 309                 struct inode *new_dir, struct dentry *new_dentry)
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 {                                                 310 {
810         struct inode *newino = d_inode(new_den !! 311         struct inode *inode = old_dentry->d_inode;
811                                                !! 312         int they_are_dirs = S_ISDIR(old_dentry->d_inode->i_mode);
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                                                   313 
854         if (!simple_empty(new_dentry))            314         if (!simple_empty(new_dentry))
855                 return -ENOTEMPTY;                315                 return -ENOTEMPTY;
856                                                   316 
857         if (d_really_is_positive(new_dentry))  !! 317         if (new_dentry->d_inode) {
858                 simple_unlink(new_dir, new_den    318                 simple_unlink(new_dir, new_dentry);
859                 if (they_are_dirs) {           !! 319                 if (they_are_dirs)
860                         drop_nlink(d_inode(new << 
861                         drop_nlink(old_dir);      320                         drop_nlink(old_dir);
862                 }                              << 
863         } else if (they_are_dirs) {               321         } else if (they_are_dirs) {
864                 drop_nlink(old_dir);              322                 drop_nlink(old_dir);
865                 inc_nlink(new_dir);               323                 inc_nlink(new_dir);
866         }                                         324         }
867                                                   325 
868         simple_rename_timestamp(old_dir, old_d !! 326         old_dir->i_ctime = old_dir->i_mtime = new_dir->i_ctime =
                                                   >> 327                 new_dir->i_mtime = inode->i_ctime = CURRENT_TIME;
                                                   >> 328 
869         return 0;                                 329         return 0;
870 }                                                 330 }
871 EXPORT_SYMBOL(simple_rename);                  << 
872                                                   331 
873 /**                                            !! 332 int simple_readpage(struct file *file, struct page *page)
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 {                                                 333 {
891         struct inode *inode = d_inode(dentry); !! 334         clear_highpage(page);
892         int error;                             !! 335         flush_dcache_page(page);
893                                                !! 336         SetPageUptodate(page);
894         error = setattr_prepare(idmap, dentry, !! 337         unlock_page(page);
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;                                 338         return 0;
903 }                                                 339 }
904 EXPORT_SYMBOL(simple_setattr);                 << 
905                                                   340 
906 static int simple_read_folio(struct file *file !! 341 int simple_prepare_write(struct file *file, struct page *page,
                                                   >> 342                         unsigned from, unsigned to)
907 {                                                 343 {
908         folio_zero_range(folio, 0, folio_size( !! 344         if (!PageUptodate(page)) {
909         flush_dcache_folio(folio);             !! 345                 if (to - from != PAGE_CACHE_SIZE)
910         folio_mark_uptodate(folio);            !! 346                         zero_user_segments(page,
911         folio_unlock(folio);                   !! 347                                 0, from,
                                                   >> 348                                 to, PAGE_CACHE_SIZE);
                                                   >> 349         }
912         return 0;                                 350         return 0;
913 }                                                 351 }
914                                                   352 
915 int simple_write_begin(struct file *file, stru    353 int simple_write_begin(struct file *file, struct address_space *mapping,
916                         loff_t pos, unsigned l !! 354                         loff_t pos, unsigned len, unsigned flags,
917                         struct folio **foliop, !! 355                         struct page **pagep, void **fsdata)
918 {                                                 356 {
919         struct folio *folio;                   !! 357         struct page *page;
                                                   >> 358         pgoff_t index;
                                                   >> 359         unsigned from;
920                                                   360 
921         folio = __filemap_get_folio(mapping, p !! 361         index = pos >> PAGE_CACHE_SHIFT;
922                         mapping_gfp_mask(mappi !! 362         from = pos & (PAGE_CACHE_SIZE - 1);
923         if (IS_ERR(folio))                     << 
924                 return PTR_ERR(folio);         << 
925                                                   363 
926         *foliop = folio;                       !! 364         page = grab_cache_page_write_begin(mapping, index, flags);
                                                   >> 365         if (!page)
                                                   >> 366                 return -ENOMEM;
927                                                   367 
928         if (!folio_test_uptodate(folio) && (le !! 368         *pagep = page;
929                 size_t from = offset_in_folio( << 
930                                                   369 
931                 folio_zero_segments(folio, 0,  !! 370         return simple_prepare_write(file, page, from, from+len);
932                                 from + len, fo << 
933         }                                      << 
934         return 0;                              << 
935 }                                                 371 }
936 EXPORT_SYMBOL(simple_write_begin);             << 
937                                                   372 
938 /**                                            !! 373 static int simple_commit_write(struct file *file, struct page *page,
939  * simple_write_end - .write_end helper for no !! 374                                unsigned from, unsigned to)
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 {                                                 375 {
964         struct inode *inode = folio->mapping-> !! 376         struct inode *inode = page->mapping->host;
965         loff_t last_pos = pos + copied;        !! 377         loff_t pos = ((loff_t)page->index << PAGE_CACHE_SHIFT) + to;
966                                                   378 
967         /* zero the stale part of the folio if !! 379         if (!PageUptodate(page))
968         if (!folio_test_uptodate(folio)) {     !! 380                 SetPageUptodate(page);
969                 if (copied < len) {            << 
970                         size_t from = offset_i << 
971                                                << 
972                         folio_zero_range(folio << 
973                 }                              << 
974                 folio_mark_uptodate(folio);    << 
975         }                                      << 
976         /*                                        381         /*
977          * No need to use i_size_read() here,     382          * No need to use i_size_read() here, the i_size
978          * cannot change under us because we h    383          * cannot change under us because we hold the i_mutex.
979          */                                       384          */
980         if (last_pos > inode->i_size)          !! 385         if (pos > inode->i_size)
981                 i_size_write(inode, last_pos); !! 386                 i_size_write(inode, pos);
                                                   >> 387         set_page_dirty(page);
                                                   >> 388         return 0;
                                                   >> 389 }
                                                   >> 390 
                                                   >> 391 int simple_write_end(struct file *file, struct address_space *mapping,
                                                   >> 392                         loff_t pos, unsigned len, unsigned copied,
                                                   >> 393                         struct page *page, void *fsdata)
                                                   >> 394 {
                                                   >> 395         unsigned from = pos & (PAGE_CACHE_SIZE - 1);
                                                   >> 396 
                                                   >> 397         /* zero the stale part of the page if we did a short copy */
                                                   >> 398         if (copied < len) {
                                                   >> 399                 void *kaddr = kmap_atomic(page, KM_USER0);
                                                   >> 400                 memset(kaddr + from + copied, 0, len - copied);
                                                   >> 401                 flush_dcache_page(page);
                                                   >> 402                 kunmap_atomic(kaddr, KM_USER0);
                                                   >> 403         }
982                                                   404 
983         folio_mark_dirty(folio);               !! 405         simple_commit_write(file, page, from, from+copied);
984         folio_unlock(folio);                   !! 406 
985         folio_put(folio);                      !! 407         unlock_page(page);
                                                   >> 408         page_cache_release(page);
986                                                   409 
987         return copied;                            410         return copied;
988 }                                                 411 }
989                                                   412 
990 /*                                                413 /*
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    414  * the inodes created here are not hashed. If you use iunique to generate
1003  * unique inode values later for this filesys    415  * unique inode values later for this filesystem, then you must take care
1004  * to pass it an appropriate max_reserved val    416  * to pass it an appropriate max_reserved value to avoid collisions.
1005  */                                              417  */
1006 int simple_fill_super(struct super_block *s,     418 int simple_fill_super(struct super_block *s, unsigned long magic,
1007                       const struct tree_descr !! 419                       struct tree_descr *files)
1008 {                                                420 {
1009         struct inode *inode;                     421         struct inode *inode;
                                                   >> 422         struct dentry *root;
1010         struct dentry *dentry;                   423         struct dentry *dentry;
1011         int i;                                   424         int i;
1012                                                  425 
1013         s->s_blocksize = PAGE_SIZE;           !! 426         s->s_blocksize = PAGE_CACHE_SIZE;
1014         s->s_blocksize_bits = PAGE_SHIFT;     !! 427         s->s_blocksize_bits = PAGE_CACHE_SHIFT;
1015         s->s_magic = magic;                      428         s->s_magic = magic;
1016         s->s_op = &simple_super_operations;      429         s->s_op = &simple_super_operations;
1017         s->s_time_gran = 1;                      430         s->s_time_gran = 1;
1018                                                  431 
1019         inode = new_inode(s);                    432         inode = new_inode(s);
1020         if (!inode)                              433         if (!inode)
1021                 return -ENOMEM;                  434                 return -ENOMEM;
1022         /*                                       435         /*
1023          * because the root inode is 1, the f    436          * because the root inode is 1, the files array must not contain an
1024          * entry at index 1                      437          * entry at index 1
1025          */                                      438          */
1026         inode->i_ino = 1;                        439         inode->i_ino = 1;
1027         inode->i_mode = S_IFDIR | 0755;          440         inode->i_mode = S_IFDIR | 0755;
1028         simple_inode_init_ts(inode);          !! 441         inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
1029         inode->i_op = &simple_dir_inode_opera    442         inode->i_op = &simple_dir_inode_operations;
1030         inode->i_fop = &simple_dir_operations    443         inode->i_fop = &simple_dir_operations;
1031         set_nlink(inode, 2);                  !! 444         inode->i_nlink = 2;
1032         s->s_root = d_make_root(inode);       !! 445         root = d_alloc_root(inode);
1033         if (!s->s_root)                       !! 446         if (!root) {
                                                   >> 447                 iput(inode);
1034                 return -ENOMEM;                  448                 return -ENOMEM;
                                                   >> 449         }
1035         for (i = 0; !files->name || files->na    450         for (i = 0; !files->name || files->name[0]; i++, files++) {
1036                 if (!files->name)                451                 if (!files->name)
1037                         continue;                452                         continue;
1038                                                  453 
1039                 /* warn if it tries to confli    454                 /* warn if it tries to conflict with the root inode */
1040                 if (unlikely(i == 1))            455                 if (unlikely(i == 1))
1041                         printk(KERN_WARNING "    456                         printk(KERN_WARNING "%s: %s passed in a files array"
1042                                 "with an inde    457                                 "with an index of 1!\n", __func__,
1043                                 s->s_type->na    458                                 s->s_type->name);
1044                                                  459 
1045                 dentry = d_alloc_name(s->s_ro !! 460                 dentry = d_alloc_name(root, files->name);
1046                 if (!dentry)                     461                 if (!dentry)
1047                         return -ENOMEM;       !! 462                         goto out;
1048                 inode = new_inode(s);            463                 inode = new_inode(s);
1049                 if (!inode) {                 !! 464                 if (!inode)
1050                         dput(dentry);         !! 465                         goto out;
1051                         return -ENOMEM;       << 
1052                 }                             << 
1053                 inode->i_mode = S_IFREG | fil    466                 inode->i_mode = S_IFREG | files->mode;
1054                 simple_inode_init_ts(inode);  !! 467                 inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
1055                 inode->i_fop = files->ops;       468                 inode->i_fop = files->ops;
1056                 inode->i_ino = i;                469                 inode->i_ino = i;
1057                 d_add(dentry, inode);            470                 d_add(dentry, inode);
1058         }                                        471         }
                                                   >> 472         s->s_root = root;
1059         return 0;                                473         return 0;
                                                   >> 474 out:
                                                   >> 475         d_genocide(root);
                                                   >> 476         dput(root);
                                                   >> 477         return -ENOMEM;
1060 }                                                478 }
1061 EXPORT_SYMBOL(simple_fill_super);             << 
1062                                                  479 
1063 static DEFINE_SPINLOCK(pin_fs_lock);             480 static DEFINE_SPINLOCK(pin_fs_lock);
1064                                                  481 
1065 int simple_pin_fs(struct file_system_type *ty    482 int simple_pin_fs(struct file_system_type *type, struct vfsmount **mount, int *count)
1066 {                                                483 {
1067         struct vfsmount *mnt = NULL;             484         struct vfsmount *mnt = NULL;
1068         spin_lock(&pin_fs_lock);                 485         spin_lock(&pin_fs_lock);
1069         if (unlikely(!*mount)) {                 486         if (unlikely(!*mount)) {
1070                 spin_unlock(&pin_fs_lock);       487                 spin_unlock(&pin_fs_lock);
1071                 mnt = vfs_kern_mount(type, SB !! 488                 mnt = vfs_kern_mount(type, 0, type->name, NULL);
1072                 if (IS_ERR(mnt))                 489                 if (IS_ERR(mnt))
1073                         return PTR_ERR(mnt);     490                         return PTR_ERR(mnt);
1074                 spin_lock(&pin_fs_lock);         491                 spin_lock(&pin_fs_lock);
1075                 if (!*mount)                     492                 if (!*mount)
1076                         *mount = mnt;            493                         *mount = mnt;
1077         }                                        494         }
1078         mntget(*mount);                          495         mntget(*mount);
1079         ++*count;                                496         ++*count;
1080         spin_unlock(&pin_fs_lock);               497         spin_unlock(&pin_fs_lock);
1081         mntput(mnt);                             498         mntput(mnt);
1082         return 0;                                499         return 0;
1083 }                                                500 }
1084 EXPORT_SYMBOL(simple_pin_fs);                 << 
1085                                                  501 
1086 void simple_release_fs(struct vfsmount **moun    502 void simple_release_fs(struct vfsmount **mount, int *count)
1087 {                                                503 {
1088         struct vfsmount *mnt;                    504         struct vfsmount *mnt;
1089         spin_lock(&pin_fs_lock);                 505         spin_lock(&pin_fs_lock);
1090         mnt = *mount;                            506         mnt = *mount;
1091         if (!--*count)                           507         if (!--*count)
1092                 *mount = NULL;                   508                 *mount = NULL;
1093         spin_unlock(&pin_fs_lock);               509         spin_unlock(&pin_fs_lock);
1094         mntput(mnt);                             510         mntput(mnt);
1095 }                                                511 }
1096 EXPORT_SYMBOL(simple_release_fs);             << 
1097                                                  512 
1098 /**                                              513 /**
1099  * simple_read_from_buffer - copy data from t    514  * simple_read_from_buffer - copy data from the buffer to user space
1100  * @to: the user space buffer to read to         515  * @to: the user space buffer to read to
1101  * @count: the maximum number of bytes to rea    516  * @count: the maximum number of bytes to read
1102  * @ppos: the current position in the buffer     517  * @ppos: the current position in the buffer
1103  * @from: the buffer to read from                518  * @from: the buffer to read from
1104  * @available: the size of the buffer            519  * @available: the size of the buffer
1105  *                                               520  *
1106  * The simple_read_from_buffer() function rea    521  * The simple_read_from_buffer() function reads up to @count bytes from the
1107  * buffer @from at offset @ppos into the user    522  * buffer @from at offset @ppos into the user space address starting at @to.
1108  *                                               523  *
1109  * On success, the number of bytes read is re    524  * On success, the number of bytes read is returned and the offset @ppos is
1110  * advanced by this number, or negative value    525  * advanced by this number, or negative value is returned on error.
1111  **/                                             526  **/
1112 ssize_t simple_read_from_buffer(void __user *    527 ssize_t simple_read_from_buffer(void __user *to, size_t count, loff_t *ppos,
1113                                 const void *f    528                                 const void *from, size_t available)
1114 {                                                529 {
1115         loff_t pos = *ppos;                      530         loff_t pos = *ppos;
1116         size_t ret;                              531         size_t ret;
1117                                                  532 
1118         if (pos < 0)                             533         if (pos < 0)
1119                 return -EINVAL;                  534                 return -EINVAL;
1120         if (pos >= available || !count)          535         if (pos >= available || !count)
1121                 return 0;                        536                 return 0;
1122         if (count > available - pos)             537         if (count > available - pos)
1123                 count = available - pos;         538                 count = available - pos;
1124         ret = copy_to_user(to, from + pos, co    539         ret = copy_to_user(to, from + pos, count);
1125         if (ret == count)                        540         if (ret == count)
1126                 return -EFAULT;                  541                 return -EFAULT;
1127         count -= ret;                            542         count -= ret;
1128         *ppos = pos + count;                     543         *ppos = pos + count;
1129         return count;                            544         return count;
1130 }                                                545 }
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                                                  546 
1168 /**                                              547 /**
1169  * memory_read_from_buffer - copy data from t    548  * memory_read_from_buffer - copy data from the buffer
1170  * @to: the kernel space buffer to read to       549  * @to: the kernel space buffer to read to
1171  * @count: the maximum number of bytes to rea    550  * @count: the maximum number of bytes to read
1172  * @ppos: the current position in the buffer     551  * @ppos: the current position in the buffer
1173  * @from: the buffer to read from                552  * @from: the buffer to read from
1174  * @available: the size of the buffer            553  * @available: the size of the buffer
1175  *                                               554  *
1176  * The memory_read_from_buffer() function rea    555  * The memory_read_from_buffer() function reads up to @count bytes from the
1177  * buffer @from at offset @ppos into the kern    556  * buffer @from at offset @ppos into the kernel space address starting at @to.
1178  *                                               557  *
1179  * On success, the number of bytes read is re    558  * On success, the number of bytes read is returned and the offset @ppos is
1180  * advanced by this number, or negative value    559  * advanced by this number, or negative value is returned on error.
1181  **/                                             560  **/
1182 ssize_t memory_read_from_buffer(void *to, siz    561 ssize_t memory_read_from_buffer(void *to, size_t count, loff_t *ppos,
1183                                 const void *f    562                                 const void *from, size_t available)
1184 {                                                563 {
1185         loff_t pos = *ppos;                      564         loff_t pos = *ppos;
1186                                                  565 
1187         if (pos < 0)                             566         if (pos < 0)
1188                 return -EINVAL;                  567                 return -EINVAL;
1189         if (pos >= available)                    568         if (pos >= available)
1190                 return 0;                        569                 return 0;
1191         if (count > available - pos)             570         if (count > available - pos)
1192                 count = available - pos;         571                 count = available - pos;
1193         memcpy(to, from + pos, count);           572         memcpy(to, from + pos, count);
1194         *ppos = pos + count;                     573         *ppos = pos + count;
1195                                                  574 
1196         return count;                            575         return count;
1197 }                                                576 }
1198 EXPORT_SYMBOL(memory_read_from_buffer);       << 
1199                                                  577 
1200 /*                                               578 /*
1201  * Transaction based IO.                         579  * Transaction based IO.
1202  * The file expects a single write which trig    580  * The file expects a single write which triggers the transaction, and then
1203  * possibly a read which collects the result     581  * possibly a read which collects the result - which is stored in a
1204  * file-local buffer.                            582  * file-local buffer.
1205  */                                              583  */
1206                                                  584 
1207 void simple_transaction_set(struct file *file    585 void simple_transaction_set(struct file *file, size_t n)
1208 {                                                586 {
1209         struct simple_transaction_argresp *ar    587         struct simple_transaction_argresp *ar = file->private_data;
1210                                                  588 
1211         BUG_ON(n > SIMPLE_TRANSACTION_LIMIT);    589         BUG_ON(n > SIMPLE_TRANSACTION_LIMIT);
1212                                                  590 
1213         /*                                       591         /*
1214          * The barrier ensures that ar->size     592          * The barrier ensures that ar->size will really remain zero until
1215          * ar->data is ready for reading.        593          * ar->data is ready for reading.
1216          */                                      594          */
1217         smp_mb();                                595         smp_mb();
1218         ar->size = n;                            596         ar->size = n;
1219 }                                                597 }
1220 EXPORT_SYMBOL(simple_transaction_set);        << 
1221                                                  598 
1222 char *simple_transaction_get(struct file *fil    599 char *simple_transaction_get(struct file *file, const char __user *buf, size_t size)
1223 {                                                600 {
1224         struct simple_transaction_argresp *ar    601         struct simple_transaction_argresp *ar;
1225         static DEFINE_SPINLOCK(simple_transac    602         static DEFINE_SPINLOCK(simple_transaction_lock);
1226                                                  603 
1227         if (size > SIMPLE_TRANSACTION_LIMIT -    604         if (size > SIMPLE_TRANSACTION_LIMIT - 1)
1228                 return ERR_PTR(-EFBIG);          605                 return ERR_PTR(-EFBIG);
1229                                                  606 
1230         ar = (struct simple_transaction_argre    607         ar = (struct simple_transaction_argresp *)get_zeroed_page(GFP_KERNEL);
1231         if (!ar)                                 608         if (!ar)
1232                 return ERR_PTR(-ENOMEM);         609                 return ERR_PTR(-ENOMEM);
1233                                                  610 
1234         spin_lock(&simple_transaction_lock);     611         spin_lock(&simple_transaction_lock);
1235                                                  612 
1236         /* only one write allowed per open */    613         /* only one write allowed per open */
1237         if (file->private_data) {                614         if (file->private_data) {
1238                 spin_unlock(&simple_transacti    615                 spin_unlock(&simple_transaction_lock);
1239                 free_page((unsigned long)ar);    616                 free_page((unsigned long)ar);
1240                 return ERR_PTR(-EBUSY);          617                 return ERR_PTR(-EBUSY);
1241         }                                        618         }
1242                                                  619 
1243         file->private_data = ar;                 620         file->private_data = ar;
1244                                                  621 
1245         spin_unlock(&simple_transaction_lock)    622         spin_unlock(&simple_transaction_lock);
1246                                                  623 
1247         if (copy_from_user(ar->data, buf, siz    624         if (copy_from_user(ar->data, buf, size))
1248                 return ERR_PTR(-EFAULT);         625                 return ERR_PTR(-EFAULT);
1249                                                  626 
1250         return ar->data;                         627         return ar->data;
1251 }                                                628 }
1252 EXPORT_SYMBOL(simple_transaction_get);        << 
1253                                                  629 
1254 ssize_t simple_transaction_read(struct file *    630 ssize_t simple_transaction_read(struct file *file, char __user *buf, size_t size, loff_t *pos)
1255 {                                                631 {
1256         struct simple_transaction_argresp *ar    632         struct simple_transaction_argresp *ar = file->private_data;
1257                                                  633 
1258         if (!ar)                                 634         if (!ar)
1259                 return 0;                        635                 return 0;
1260         return simple_read_from_buffer(buf, s    636         return simple_read_from_buffer(buf, size, pos, ar->data, ar->size);
1261 }                                                637 }
1262 EXPORT_SYMBOL(simple_transaction_read);       << 
1263                                                  638 
1264 int simple_transaction_release(struct inode *    639 int simple_transaction_release(struct inode *inode, struct file *file)
1265 {                                                640 {
1266         free_page((unsigned long)file->privat    641         free_page((unsigned long)file->private_data);
1267         return 0;                                642         return 0;
1268 }                                                643 }
1269 EXPORT_SYMBOL(simple_transaction_release);    << 
1270                                                  644 
1271 /* Simple attribute files */                     645 /* Simple attribute files */
1272                                                  646 
1273 struct simple_attr {                             647 struct simple_attr {
1274         int (*get)(void *, u64 *);               648         int (*get)(void *, u64 *);
1275         int (*set)(void *, u64);                 649         int (*set)(void *, u64);
1276         char get_buf[24];       /* enough to     650         char get_buf[24];       /* enough to store a u64 and "\n\0" */
1277         char set_buf[24];                        651         char set_buf[24];
1278         void *data;                              652         void *data;
1279         const char *fmt;        /* format for    653         const char *fmt;        /* format for read operation */
1280         struct mutex mutex;     /* protects a    654         struct mutex mutex;     /* protects access to these buffers */
1281 };                                               655 };
1282                                                  656 
1283 /* simple_attr_open is called by an actual at    657 /* simple_attr_open is called by an actual attribute open file operation
1284  * to set the attribute specific access opera    658  * to set the attribute specific access operations. */
1285 int simple_attr_open(struct inode *inode, str    659 int simple_attr_open(struct inode *inode, struct file *file,
1286                      int (*get)(void *, u64 *    660                      int (*get)(void *, u64 *), int (*set)(void *, u64),
1287                      const char *fmt)            661                      const char *fmt)
1288 {                                                662 {
1289         struct simple_attr *attr;                663         struct simple_attr *attr;
1290                                                  664 
1291         attr = kzalloc(sizeof(*attr), GFP_KER !! 665         attr = kmalloc(sizeof(*attr), GFP_KERNEL);
1292         if (!attr)                               666         if (!attr)
1293                 return -ENOMEM;                  667                 return -ENOMEM;
1294                                                  668 
1295         attr->get = get;                         669         attr->get = get;
1296         attr->set = set;                         670         attr->set = set;
1297         attr->data = inode->i_private;           671         attr->data = inode->i_private;
1298         attr->fmt = fmt;                         672         attr->fmt = fmt;
1299         mutex_init(&attr->mutex);                673         mutex_init(&attr->mutex);
1300                                                  674 
1301         file->private_data = attr;               675         file->private_data = attr;
1302                                                  676 
1303         return nonseekable_open(inode, file);    677         return nonseekable_open(inode, file);
1304 }                                                678 }
1305 EXPORT_SYMBOL_GPL(simple_attr_open);          << 
1306                                                  679 
1307 int simple_attr_release(struct inode *inode,     680 int simple_attr_release(struct inode *inode, struct file *file)
1308 {                                                681 {
1309         kfree(file->private_data);               682         kfree(file->private_data);
1310         return 0;                                683         return 0;
1311 }                                                684 }
1312 EXPORT_SYMBOL_GPL(simple_attr_release); /* GP << 
1313                                                  685 
1314 /* read from the buffer that is filled with t    686 /* read from the buffer that is filled with the get function */
1315 ssize_t simple_attr_read(struct file *file, c    687 ssize_t simple_attr_read(struct file *file, char __user *buf,
1316                          size_t len, loff_t *    688                          size_t len, loff_t *ppos)
1317 {                                                689 {
1318         struct simple_attr *attr;                690         struct simple_attr *attr;
1319         size_t size;                             691         size_t size;
1320         ssize_t ret;                             692         ssize_t ret;
1321                                                  693 
1322         attr = file->private_data;               694         attr = file->private_data;
1323                                                  695 
1324         if (!attr->get)                          696         if (!attr->get)
1325                 return -EACCES;                  697                 return -EACCES;
1326                                                  698 
1327         ret = mutex_lock_interruptible(&attr-    699         ret = mutex_lock_interruptible(&attr->mutex);
1328         if (ret)                                 700         if (ret)
1329                 return ret;                      701                 return ret;
1330                                                  702 
1331         if (*ppos && attr->get_buf[0]) {      !! 703         if (*ppos) {            /* continued read */
1332                 /* continued read */          << 
1333                 size = strlen(attr->get_buf);    704                 size = strlen(attr->get_buf);
1334         } else {                              !! 705         } else {                /* first read */
1335                 /* first read */              << 
1336                 u64 val;                         706                 u64 val;
1337                 ret = attr->get(attr->data, &    707                 ret = attr->get(attr->data, &val);
1338                 if (ret)                         708                 if (ret)
1339                         goto out;                709                         goto out;
1340                                                  710 
1341                 size = scnprintf(attr->get_bu    711                 size = scnprintf(attr->get_buf, sizeof(attr->get_buf),
1342                                  attr->fmt, (    712                                  attr->fmt, (unsigned long long)val);
1343         }                                        713         }
1344                                                  714 
1345         ret = simple_read_from_buffer(buf, le    715         ret = simple_read_from_buffer(buf, len, ppos, attr->get_buf, size);
1346 out:                                             716 out:
1347         mutex_unlock(&attr->mutex);              717         mutex_unlock(&attr->mutex);
1348         return ret;                              718         return ret;
1349 }                                                719 }
1350 EXPORT_SYMBOL_GPL(simple_attr_read);          << 
1351                                                  720 
1352 /* interpret the buffer as a number to call t    721 /* interpret the buffer as a number to call the set function with */
1353 static ssize_t simple_attr_write_xsigned(stru !! 722 ssize_t simple_attr_write(struct file *file, const char __user *buf,
1354                           size_t len, loff_t  !! 723                           size_t len, loff_t *ppos)
1355 {                                                724 {
1356         struct simple_attr *attr;                725         struct simple_attr *attr;
1357         unsigned long long val;               !! 726         u64 val;
1358         size_t size;                             727         size_t size;
1359         ssize_t ret;                             728         ssize_t ret;
1360                                                  729 
1361         attr = file->private_data;               730         attr = file->private_data;
1362         if (!attr->set)                          731         if (!attr->set)
1363                 return -EACCES;                  732                 return -EACCES;
1364                                                  733 
1365         ret = mutex_lock_interruptible(&attr-    734         ret = mutex_lock_interruptible(&attr->mutex);
1366         if (ret)                                 735         if (ret)
1367                 return ret;                      736                 return ret;
1368                                                  737 
1369         ret = -EFAULT;                           738         ret = -EFAULT;
1370         size = min(sizeof(attr->set_buf) - 1,    739         size = min(sizeof(attr->set_buf) - 1, len);
1371         if (copy_from_user(attr->set_buf, buf    740         if (copy_from_user(attr->set_buf, buf, size))
1372                 goto out;                        741                 goto out;
1373                                                  742 
1374         attr->set_buf[size] = '\0';              743         attr->set_buf[size] = '\0';
1375         if (is_signed)                        !! 744         val = simple_strtol(attr->set_buf, NULL, 0);
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);        745         ret = attr->set(attr->data, val);
1382         if (ret == 0)                            746         if (ret == 0)
1383                 ret = len; /* on success, cla    747                 ret = len; /* on success, claim we got the whole input */
1384 out:                                             748 out:
1385         mutex_unlock(&attr->mutex);              749         mutex_unlock(&attr->mutex);
1386         return ret;                              750         return ret;
1387 }                                                751 }
1388                                                  752 
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 /**                                              753 /**
1445  * generic_fh_to_dentry - generic helper for     754  * generic_fh_to_dentry - generic helper for the fh_to_dentry export operation
1446  * @sb:         filesystem to do the file han    755  * @sb:         filesystem to do the file handle conversion on
1447  * @fid:        file handle to convert           756  * @fid:        file handle to convert
1448  * @fh_len:     length of the file handle in     757  * @fh_len:     length of the file handle in bytes
1449  * @fh_type:    type of file handle              758  * @fh_type:    type of file handle
1450  * @get_inode:  filesystem callback to retrie    759  * @get_inode:  filesystem callback to retrieve inode
1451  *                                               760  *
1452  * This function decodes @fid as long as it h    761  * This function decodes @fid as long as it has one of the well-known
1453  * Linux filehandle types and calls @get_inod    762  * Linux filehandle types and calls @get_inode on it to retrieve the
1454  * inode for the object specified in the file    763  * inode for the object specified in the file handle.
1455  */                                              764  */
1456 struct dentry *generic_fh_to_dentry(struct su    765 struct dentry *generic_fh_to_dentry(struct super_block *sb, struct fid *fid,
1457                 int fh_len, int fh_type, stru    766                 int fh_len, int fh_type, struct inode *(*get_inode)
1458                         (struct super_block *    767                         (struct super_block *sb, u64 ino, u32 gen))
1459 {                                                768 {
1460         struct inode *inode = NULL;              769         struct inode *inode = NULL;
1461                                                  770 
1462         if (fh_len < 2)                          771         if (fh_len < 2)
1463                 return NULL;                     772                 return NULL;
1464                                                  773 
1465         switch (fh_type) {                       774         switch (fh_type) {
1466         case FILEID_INO32_GEN:                   775         case FILEID_INO32_GEN:
1467         case FILEID_INO32_GEN_PARENT:            776         case FILEID_INO32_GEN_PARENT:
1468                 inode = get_inode(sb, fid->i3    777                 inode = get_inode(sb, fid->i32.ino, fid->i32.gen);
1469                 break;                           778                 break;
1470         }                                        779         }
1471                                                  780 
1472         return d_obtain_alias(inode);            781         return d_obtain_alias(inode);
1473 }                                                782 }
1474 EXPORT_SYMBOL_GPL(generic_fh_to_dentry);         783 EXPORT_SYMBOL_GPL(generic_fh_to_dentry);
1475                                                  784 
1476 /**                                              785 /**
1477  * generic_fh_to_parent - generic helper for  !! 786  * generic_fh_to_dentry - generic helper for the fh_to_parent export operation
1478  * @sb:         filesystem to do the file han    787  * @sb:         filesystem to do the file handle conversion on
1479  * @fid:        file handle to convert           788  * @fid:        file handle to convert
1480  * @fh_len:     length of the file handle in     789  * @fh_len:     length of the file handle in bytes
1481  * @fh_type:    type of file handle              790  * @fh_type:    type of file handle
1482  * @get_inode:  filesystem callback to retrie    791  * @get_inode:  filesystem callback to retrieve inode
1483  *                                               792  *
1484  * This function decodes @fid as long as it h    793  * This function decodes @fid as long as it has one of the well-known
1485  * Linux filehandle types and calls @get_inod    794  * Linux filehandle types and calls @get_inode on it to retrieve the
1486  * inode for the _parent_ object specified in    795  * inode for the _parent_ object specified in the file handle if it
1487  * is specified in the file handle, or NULL o    796  * is specified in the file handle, or NULL otherwise.
1488  */                                              797  */
1489 struct dentry *generic_fh_to_parent(struct su    798 struct dentry *generic_fh_to_parent(struct super_block *sb, struct fid *fid,
1490                 int fh_len, int fh_type, stru    799                 int fh_len, int fh_type, struct inode *(*get_inode)
1491                         (struct super_block *    800                         (struct super_block *sb, u64 ino, u32 gen))
1492 {                                                801 {
1493         struct inode *inode = NULL;              802         struct inode *inode = NULL;
1494                                                  803 
1495         if (fh_len <= 2)                         804         if (fh_len <= 2)
1496                 return NULL;                     805                 return NULL;
1497                                                  806 
1498         switch (fh_type) {                       807         switch (fh_type) {
1499         case FILEID_INO32_GEN_PARENT:            808         case FILEID_INO32_GEN_PARENT:
1500                 inode = get_inode(sb, fid->i3    809                 inode = get_inode(sb, fid->i32.parent_ino,
1501                                   (fh_len > 3    810                                   (fh_len > 3 ? fid->i32.parent_gen : 0));
1502                 break;                           811                 break;
1503         }                                        812         }
1504                                                  813 
1505         return d_obtain_alias(inode);            814         return d_obtain_alias(inode);
1506 }                                                815 }
1507 EXPORT_SYMBOL_GPL(generic_fh_to_parent);         816 EXPORT_SYMBOL_GPL(generic_fh_to_parent);
1508                                                  817 
1509 /**                                           !! 818 int simple_fsync(struct file *file, struct dentry *dentry, int datasync)
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 {                                                819 {
1524         struct inode *inode = file->f_mapping !! 820         struct writeback_control wbc = {
                                                   >> 821                 .sync_mode = WB_SYNC_ALL,
                                                   >> 822                 .nr_to_write = 0, /* metadata-only; caller takes care of data */
                                                   >> 823         };
                                                   >> 824         struct inode *inode = dentry->d_inode;
1525         int err;                                 825         int err;
1526         int ret;                                 826         int ret;
1527                                                  827 
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    828         ret = sync_mapping_buffers(inode->i_mapping);
1534         if (!(inode->i_state & I_DIRTY_ALL))  !! 829         if (!(inode->i_state & I_DIRTY))
1535                 goto out;                     !! 830                 return ret;
1536         if (datasync && !(inode->i_state & I_    831         if (datasync && !(inode->i_state & I_DIRTY_DATASYNC))
1537                 goto out;                     !! 832                 return ret;
1538                                               << 
1539         err = sync_inode_metadata(inode, 1);  << 
1540         if (ret == 0)                         << 
1541                 ret = err;                    << 
1542                                                  833 
1543 out:                                          !! 834         err = sync_inode(inode, &wbc);
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)                            835         if (ret == 0)
1548                 ret = err;                       836                 ret = err;
1549         return ret;                              837         return ret;
1550 }                                                838 }
1551 EXPORT_SYMBOL(__generic_file_fsync);          !! 839 EXPORT_SYMBOL(simple_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                                                  840 
1856         ret = utf8_casefold_hash(um, dentry,  !! 841 EXPORT_SYMBOL(dcache_dir_close);
1857         if (ret < 0 && sb_has_strict_encoding !! 842 EXPORT_SYMBOL(dcache_dir_lseek);
1858                 return -EINVAL;               !! 843 EXPORT_SYMBOL(dcache_dir_open);
1859         return 0;                             !! 844 EXPORT_SYMBOL(dcache_readdir);
1860 }                                             !! 845 EXPORT_SYMBOL(generic_read_dir);
1861                                               !! 846 EXPORT_SYMBOL(get_sb_pseudo);
1862 static const struct dentry_operations generic !! 847 EXPORT_SYMBOL(simple_write_begin);
1863         .d_hash = generic_ci_d_hash,          !! 848 EXPORT_SYMBOL(simple_write_end);
1864         .d_compare = generic_ci_d_compare,    !! 849 EXPORT_SYMBOL(simple_dir_inode_operations);
1865 #ifdef CONFIG_FS_ENCRYPTION                   !! 850 EXPORT_SYMBOL(simple_dir_operations);
1866         .d_revalidate = fscrypt_d_revalidate, !! 851 EXPORT_SYMBOL(simple_empty);
1867 #endif                                        !! 852 EXPORT_SYMBOL(d_alloc_name);
1868 };                                            !! 853 EXPORT_SYMBOL(simple_fill_super);
1869                                               !! 854 EXPORT_SYMBOL(simple_getattr);
1870 /**                                           !! 855 EXPORT_SYMBOL(simple_link);
1871  * generic_ci_match() - Match a name (case-in !! 856 EXPORT_SYMBOL(simple_lookup);
1872  * This is a filesystem helper for comparison !! 857 EXPORT_SYMBOL(simple_pin_fs);
1873  * generic_ci_d_compare should be used in VFS !! 858 EXPORT_UNUSED_SYMBOL(simple_prepare_write);
1874  *                                            !! 859 EXPORT_SYMBOL(simple_readpage);
1875  * @parent: Inode of the parent of the dirent !! 860 EXPORT_SYMBOL(simple_release_fs);
1876  * @name: name under lookup.                  !! 861 EXPORT_SYMBOL(simple_rename);
1877  * @folded_name: Optional pre-folded name und !! 862 EXPORT_SYMBOL(simple_rmdir);
1878  * @de_name: Dirent name.                     !! 863 EXPORT_SYMBOL(simple_statfs);
1879  * @de_name_len: dirent name length.          !! 864 EXPORT_SYMBOL(simple_sync_file);
1880  *                                            !! 865 EXPORT_SYMBOL(simple_unlink);
1881  * Test whether a case-insensitive directory  !! 866 EXPORT_SYMBOL(simple_read_from_buffer);
1882  * being searched.  If @folded_name is provid !! 867 EXPORT_SYMBOL(memory_read_from_buffer);
1883  * recalculating the casefold of @name.       !! 868 EXPORT_SYMBOL(simple_transaction_set);
1884  *                                            !! 869 EXPORT_SYMBOL(simple_transaction_get);
1885  * Return: > 0 if the directory entry matches !! 870 EXPORT_SYMBOL(simple_transaction_read);
1886  * < 0 on error.                              !! 871 EXPORT_SYMBOL(simple_transaction_release);
1887  */                                           !! 872 EXPORT_SYMBOL_GPL(simple_attr_open);
1888 int generic_ci_match(const struct inode *pare !! 873 EXPORT_SYMBOL_GPL(simple_attr_release);
1889                      const struct qstr *name, !! 874 EXPORT_SYMBOL_GPL(simple_attr_read);
1890                      const struct qstr *folde !! 875 EXPORT_SYMBOL_GPL(simple_attr_write);
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                                                  876 

~ [ 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