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

TOMOYO Linux Cross Reference
Linux/fs/fuse/dir.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ 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.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /fs/fuse/dir.c (Version linux-6.11.5) and /fs/fuse/dir.c (Version policy-sample)


  1 /*                                                  1 
  2   FUSE: Filesystem in Userspace                   
  3   Copyright (C) 2001-2008  Miklos Szeredi <mik    
  4                                                   
  5   This program can be distributed under the te    
  6   See the file COPYING.                           
  7 */                                                
  8                                                   
  9 #include "fuse_i.h"                               
 10                                                   
 11 #include <linux/pagemap.h>                        
 12 #include <linux/file.h>                           
 13 #include <linux/fs_context.h>                     
 14 #include <linux/moduleparam.h>                    
 15 #include <linux/sched.h>                          
 16 #include <linux/namei.h>                          
 17 #include <linux/slab.h>                           
 18 #include <linux/xattr.h>                          
 19 #include <linux/iversion.h>                       
 20 #include <linux/posix_acl.h>                      
 21 #include <linux/security.h>                       
 22 #include <linux/types.h>                          
 23 #include <linux/kernel.h>                         
 24                                                   
 25 static bool __read_mostly allow_sys_admin_acce    
 26 module_param(allow_sys_admin_access, bool, 064    
 27 MODULE_PARM_DESC(allow_sys_admin_access,          
 28                  "Allow users with CAP_SYS_ADM    
 29                                                   
 30 static void fuse_advise_use_readdirplus(struct    
 31 {                                                 
 32         struct fuse_inode *fi = get_fuse_inode    
 33                                                   
 34         set_bit(FUSE_I_ADVISE_RDPLUS, &fi->sta    
 35 }                                                 
 36                                                   
 37 #if BITS_PER_LONG >= 64                           
 38 static inline void __fuse_dentry_settime(struc    
 39 {                                                 
 40         entry->d_fsdata = (void *) time;          
 41 }                                                 
 42                                                   
 43 static inline u64 fuse_dentry_time(const struc    
 44 {                                                 
 45         return (u64)entry->d_fsdata;              
 46 }                                                 
 47                                                   
 48 #else                                             
 49 union fuse_dentry {                               
 50         u64 time;                                 
 51         struct rcu_head rcu;                      
 52 };                                                
 53                                                   
 54 static inline void __fuse_dentry_settime(struc    
 55 {                                                 
 56         ((union fuse_dentry *) dentry->d_fsdat    
 57 }                                                 
 58                                                   
 59 static inline u64 fuse_dentry_time(const struc    
 60 {                                                 
 61         return ((union fuse_dentry *) entry->d    
 62 }                                                 
 63 #endif                                            
 64                                                   
 65 static void fuse_dentry_settime(struct dentry     
 66 {                                                 
 67         struct fuse_conn *fc = get_fuse_conn_s    
 68         bool delete = !time && fc->delete_stal    
 69         /*                                        
 70          * Mess with DCACHE_OP_DELETE because     
 71          * Don't care about races, either way     
 72          */                                       
 73         if ((!delete && (dentry->d_flags & DCA    
 74             (delete && !(dentry->d_flags & DCA    
 75                 spin_lock(&dentry->d_lock);       
 76                 if (!delete)                      
 77                         dentry->d_flags &= ~DC    
 78                 else                              
 79                         dentry->d_flags |= DCA    
 80                 spin_unlock(&dentry->d_lock);     
 81         }                                         
 82                                                   
 83         __fuse_dentry_settime(dentry, time);      
 84 }                                                 
 85                                                   
 86 /*                                                
 87  * FUSE caches dentries and attributes with se    
 88  * time in jiffies until the dentry/attributes    
 89  * dentry->d_fsdata and fuse_inode->i_time res    
 90  */                                               
 91                                                   
 92 /*                                                
 93  * Calculate the time in jiffies until a dentr    
 94  */                                               
 95 u64 fuse_time_to_jiffies(u64 sec, u32 nsec)       
 96 {                                                 
 97         if (sec || nsec) {                        
 98                 struct timespec64 ts = {          
 99                         sec,                      
100                         min_t(u32, nsec, NSEC_    
101                 };                                
102                                                   
103                 return get_jiffies_64() + time    
104         } else                                    
105                 return 0;                         
106 }                                                 
107                                                   
108 /*                                                
109  * Set dentry and possibly attribute timeouts     
110  * replies                                        
111  */                                               
112 void fuse_change_entry_timeout(struct dentry *    
113 {                                                 
114         fuse_dentry_settime(entry,                
115                 fuse_time_to_jiffies(o->entry_    
116 }                                                 
117                                                   
118 void fuse_invalidate_attr_mask(struct inode *i    
119 {                                                 
120         set_mask_bits(&get_fuse_inode(inode)->    
121 }                                                 
122                                                   
123 /*                                                
124  * Mark the attributes as stale, so that at th    
125  * ->getattr() they will be fetched from users    
126  */                                               
127 void fuse_invalidate_attr(struct inode *inode)    
128 {                                                 
129         fuse_invalidate_attr_mask(inode, STATX    
130 }                                                 
131                                                   
132 static void fuse_dir_changed(struct inode *dir    
133 {                                                 
134         fuse_invalidate_attr(dir);                
135         inode_maybe_inc_iversion(dir, false);     
136 }                                                 
137                                                   
138 /*                                                
139  * Mark the attributes as stale due to an atim    
140  * atime is not used.                             
141  */                                               
142 void fuse_invalidate_atime(struct inode *inode    
143 {                                                 
144         if (!IS_RDONLY(inode))                    
145                 fuse_invalidate_attr_mask(inod    
146 }                                                 
147                                                   
148 /*                                                
149  * Just mark the entry as stale, so that a nex    
150  * will result in a new lookup call to userspa    
151  *                                                
152  * This is called when a dentry is about to be    
153  * timeout is unknown (unlink, rmdir, rename a    
154  * lookup)                                        
155  */                                               
156 void fuse_invalidate_entry_cache(struct dentry    
157 {                                                 
158         fuse_dentry_settime(entry, 0);            
159 }                                                 
160                                                   
161 /*                                                
162  * Same as fuse_invalidate_entry_cache(), but     
163  * dentry from the hash                           
164  */                                               
165 static void fuse_invalidate_entry(struct dentr    
166 {                                                 
167         d_invalidate(entry);                      
168         fuse_invalidate_entry_cache(entry);       
169 }                                                 
170                                                   
171 static void fuse_lookup_init(struct fuse_conn     
172                              u64 nodeid, const    
173                              struct fuse_entry    
174 {                                                 
175         memset(outarg, 0, sizeof(struct fuse_e    
176         args->opcode = FUSE_LOOKUP;               
177         args->nodeid = nodeid;                    
178         args->in_numargs = 1;                     
179         args->in_args[0].size = name->len + 1;    
180         args->in_args[0].value = name->name;      
181         args->out_numargs = 1;                    
182         args->out_args[0].size = sizeof(struct    
183         args->out_args[0].value = outarg;         
184 }                                                 
185                                                   
186 /*                                                
187  * Check whether the dentry is still valid        
188  *                                                
189  * If the entry validity timeout has expired a    
190  * positive, try to redo the lookup.  If the l    
191  * different inode, then let the VFS invalidat    
192  * the lookup once more.  If the lookup result    
193  * then refresh the attributes, timeouts and m    
194  */                                               
195 static int fuse_dentry_revalidate(struct dentr    
196 {                                                 
197         struct inode *inode;                      
198         struct dentry *parent;                    
199         struct fuse_mount *fm;                    
200         struct fuse_inode *fi;                    
201         int ret;                                  
202                                                   
203         inode = d_inode_rcu(entry);               
204         if (inode && fuse_is_bad(inode))          
205                 goto invalid;                     
206         else if (time_before64(fuse_dentry_tim    
207                  (flags & (LOOKUP_EXCL | LOOKU    
208                 struct fuse_entry_out outarg;     
209                 FUSE_ARGS(args);                  
210                 struct fuse_forget_link *forge    
211                 u64 attr_version;                 
212                                                   
213                 /* For negative dentries, alwa    
214                 if (!inode)                       
215                         goto invalid;             
216                                                   
217                 ret = -ECHILD;                    
218                 if (flags & LOOKUP_RCU)           
219                         goto out;                 
220                                                   
221                 fm = get_fuse_mount(inode);       
222                                                   
223                 forget = fuse_alloc_forget();     
224                 ret = -ENOMEM;                    
225                 if (!forget)                      
226                         goto out;                 
227                                                   
228                 attr_version = fuse_get_attr_v    
229                                                   
230                 parent = dget_parent(entry);      
231                 fuse_lookup_init(fm->fc, &args    
232                                  &entry->d_nam    
233                 ret = fuse_simple_request(fm,     
234                 dput(parent);                     
235                 /* Zero nodeid is same as -ENO    
236                 if (!ret && !outarg.nodeid)       
237                         ret = -ENOENT;            
238                 if (!ret) {                       
239                         fi = get_fuse_inode(in    
240                         if (outarg.nodeid != g    
241                             (bool) IS_AUTOMOUN    
242                                 fuse_queue_for    
243                                                   
244                                 goto invalid;     
245                         }                         
246                         spin_lock(&fi->lock);     
247                         fi->nlookup++;            
248                         spin_unlock(&fi->lock)    
249                 }                                 
250                 kfree(forget);                    
251                 if (ret == -ENOMEM || ret == -    
252                         goto out;                 
253                 if (ret || fuse_invalid_attr(&    
254                     fuse_stale_inode(inode, ou    
255                         goto invalid;             
256                                                   
257                 forget_all_cached_acls(inode);    
258                 fuse_change_attributes(inode,     
259                                        ATTR_TI    
260                                        attr_ve    
261                 fuse_change_entry_timeout(entr    
262         } else if (inode) {                       
263                 fi = get_fuse_inode(inode);       
264                 if (flags & LOOKUP_RCU) {         
265                         if (test_bit(FUSE_I_IN    
266                                 return -ECHILD    
267                 } else if (test_and_clear_bit(    
268                         parent = dget_parent(e    
269                         fuse_advise_use_readdi    
270                         dput(parent);             
271                 }                                 
272         }                                         
273         ret = 1;                                  
274 out:                                              
275         return ret;                               
276                                                   
277 invalid:                                          
278         ret = 0;                                  
279         goto out;                                 
280 }                                                 
281                                                   
282 #if BITS_PER_LONG < 64                            
283 static int fuse_dentry_init(struct dentry *den    
284 {                                                 
285         dentry->d_fsdata = kzalloc(sizeof(unio    
286                                    GFP_KERNEL_    
287                                                   
288         return dentry->d_fsdata ? 0 : -ENOMEM;    
289 }                                                 
290 static void fuse_dentry_release(struct dentry     
291 {                                                 
292         union fuse_dentry *fd = dentry->d_fsda    
293                                                   
294         kfree_rcu(fd, rcu);                       
295 }                                                 
296 #endif                                            
297                                                   
298 static int fuse_dentry_delete(const struct den    
299 {                                                 
300         return time_before64(fuse_dentry_time(    
301 }                                                 
302                                                   
303 /*                                                
304  * Create a fuse_mount object with a new super    
305  * as the root), and return that mount so it c    
306  * @path.                                         
307  */                                               
308 static struct vfsmount *fuse_dentry_automount(    
309 {                                                 
310         struct fs_context *fsc;                   
311         struct vfsmount *mnt;                     
312         struct fuse_inode *mp_fi = get_fuse_in    
313                                                   
314         fsc = fs_context_for_submount(path->mn    
315         if (IS_ERR(fsc))                          
316                 return ERR_CAST(fsc);             
317                                                   
318         /* Pass the FUSE inode of the mount fo    
319         fsc->fs_private = mp_fi;                  
320                                                   
321         /* Create the submount */                 
322         mnt = fc_mount(fsc);                      
323         if (!IS_ERR(mnt))                         
324                 mntget(mnt);                      
325                                                   
326         put_fs_context(fsc);                      
327         return mnt;                               
328 }                                                 
329                                                   
330 const struct dentry_operations fuse_dentry_ope    
331         .d_revalidate   = fuse_dentry_revalida    
332         .d_delete       = fuse_dentry_delete,     
333 #if BITS_PER_LONG < 64                            
334         .d_init         = fuse_dentry_init,       
335         .d_release      = fuse_dentry_release,    
336 #endif                                            
337         .d_automount    = fuse_dentry_automoun    
338 };                                                
339                                                   
340 const struct dentry_operations fuse_root_dentr    
341 #if BITS_PER_LONG < 64                            
342         .d_init         = fuse_dentry_init,       
343         .d_release      = fuse_dentry_release,    
344 #endif                                            
345 };                                                
346                                                   
347 int fuse_valid_type(int m)                        
348 {                                                 
349         return S_ISREG(m) || S_ISDIR(m) || S_I    
350                 S_ISBLK(m) || S_ISFIFO(m) || S    
351 }                                                 
352                                                   
353 static bool fuse_valid_size(u64 size)             
354 {                                                 
355         return size <= LLONG_MAX;                 
356 }                                                 
357                                                   
358 bool fuse_invalid_attr(struct fuse_attr *attr)    
359 {                                                 
360         return !fuse_valid_type(attr->mode) ||    
361 }                                                 
362                                                   
363 int fuse_lookup_name(struct super_block *sb, u    
364                      struct fuse_entry_out *ou    
365 {                                                 
366         struct fuse_mount *fm = get_fuse_mount    
367         FUSE_ARGS(args);                          
368         struct fuse_forget_link *forget;          
369         u64 attr_version;                         
370         int err;                                  
371                                                   
372         *inode = NULL;                            
373         err = -ENAMETOOLONG;                      
374         if (name->len > FUSE_NAME_MAX)            
375                 goto out;                         
376                                                   
377                                                   
378         forget = fuse_alloc_forget();             
379         err = -ENOMEM;                            
380         if (!forget)                              
381                 goto out;                         
382                                                   
383         attr_version = fuse_get_attr_version(f    
384                                                   
385         fuse_lookup_init(fm->fc, &args, nodeid    
386         err = fuse_simple_request(fm, &args);     
387         /* Zero nodeid is same as -ENOENT, but    
388         if (err || !outarg->nodeid)               
389                 goto out_put_forget;              
390                                                   
391         err = -EIO;                               
392         if (fuse_invalid_attr(&outarg->attr))     
393                 goto out_put_forget;              
394         if (outarg->nodeid == FUSE_ROOT_ID &&     
395                 pr_warn_once("root generation     
396                 outarg->generation = 0;           
397         }                                         
398                                                   
399         *inode = fuse_iget(sb, outarg->nodeid,    
400                            &outarg->attr, ATTR    
401                            attr_version);         
402         err = -ENOMEM;                            
403         if (!*inode) {                            
404                 fuse_queue_forget(fm->fc, forg    
405                 goto out;                         
406         }                                         
407         err = 0;                                  
408                                                   
409  out_put_forget:                                  
410         kfree(forget);                            
411  out:                                             
412         return err;                               
413 }                                                 
414                                                   
415 static struct dentry *fuse_lookup(struct inode    
416                                   unsigned int    
417 {                                                 
418         int err;                                  
419         struct fuse_entry_out outarg;             
420         struct inode *inode;                      
421         struct dentry *newent;                    
422         bool outarg_valid = true;                 
423         bool locked;                              
424                                                   
425         if (fuse_is_bad(dir))                     
426                 return ERR_PTR(-EIO);             
427                                                   
428         locked = fuse_lock_inode(dir);            
429         err = fuse_lookup_name(dir->i_sb, get_    
430                                &outarg, &inode    
431         fuse_unlock_inode(dir, locked);           
432         if (err == -ENOENT) {                     
433                 outarg_valid = false;             
434                 err = 0;                          
435         }                                         
436         if (err)                                  
437                 goto out_err;                     
438                                                   
439         err = -EIO;                               
440         if (inode && get_node_id(inode) == FUS    
441                 goto out_iput;                    
442                                                   
443         newent = d_splice_alias(inode, entry);    
444         err = PTR_ERR(newent);                    
445         if (IS_ERR(newent))                       
446                 goto out_err;                     
447                                                   
448         entry = newent ? newent : entry;          
449         if (outarg_valid)                         
450                 fuse_change_entry_timeout(entr    
451         else                                      
452                 fuse_invalidate_entry_cache(en    
453                                                   
454         if (inode)                                
455                 fuse_advise_use_readdirplus(di    
456         return newent;                            
457                                                   
458  out_iput:                                        
459         iput(inode);                              
460  out_err:                                         
461         return ERR_PTR(err);                      
462 }                                                 
463                                                   
464 static int get_security_context(struct dentry     
465                                 struct fuse_in    
466 {                                                 
467         struct fuse_secctx *fctx;                 
468         struct fuse_secctx_header *header;        
469         void *ctx = NULL, *ptr;                   
470         u32 ctxlen, total_len = sizeof(*header    
471         int err, nr_ctx = 0;                      
472         const char *name;                         
473         size_t namelen;                           
474                                                   
475         err = security_dentry_init_security(en    
476                                             &n    
477         if (err) {                                
478                 if (err != -EOPNOTSUPP)           
479                         goto out_err;             
480                 /* No LSM is supporting this s    
481                 ctxlen = 0;                       
482                 ctx = NULL;                       
483         }                                         
484                                                   
485         if (ctxlen) {                             
486                 nr_ctx = 1;                       
487                 namelen = strlen(name) + 1;       
488                 err = -EIO;                       
489                 if (WARN_ON(namelen > XATTR_NA    
490                         goto out_err;             
491                 total_len += FUSE_REC_ALIGN(si    
492         }                                         
493                                                   
494         err = -ENOMEM;                            
495         header = ptr = kzalloc(total_len, GFP_    
496         if (!ptr)                                 
497                 goto out_err;                     
498                                                   
499         header->nr_secctx = nr_ctx;               
500         header->size = total_len;                 
501         ptr += sizeof(*header);                   
502         if (nr_ctx) {                             
503                 fctx = ptr;                       
504                 fctx->size = ctxlen;              
505                 ptr += sizeof(*fctx);             
506                                                   
507                 strcpy(ptr, name);                
508                 ptr += namelen;                   
509                                                   
510                 memcpy(ptr, ctx, ctxlen);         
511         }                                         
512         ext->size = total_len;                    
513         ext->value = header;                      
514         err = 0;                                  
515 out_err:                                          
516         kfree(ctx);                               
517         return err;                               
518 }                                                 
519                                                   
520 static void *extend_arg(struct fuse_in_arg *bu    
521 {                                                 
522         void *p;                                  
523         u32 newlen = buf->size + bytes;           
524                                                   
525         p = krealloc(buf->value, newlen, GFP_K    
526         if (!p) {                                 
527                 kfree(buf->value);                
528                 buf->size = 0;                    
529                 buf->value = NULL;                
530                 return NULL;                      
531         }                                         
532                                                   
533         memset(p + buf->size, 0, bytes);          
534         buf->value = p;                           
535         buf->size = newlen;                       
536                                                   
537         return p + newlen - bytes;                
538 }                                                 
539                                                   
540 static u32 fuse_ext_size(size_t size)             
541 {                                                 
542         return FUSE_REC_ALIGN(sizeof(struct fu    
543 }                                                 
544                                                   
545 /*                                                
546  * This adds just a single supplementary group    
547  */                                               
548 static int get_create_supp_group(struct inode     
549 {                                                 
550         struct fuse_conn *fc = get_fuse_conn(d    
551         struct fuse_ext_header *xh;               
552         struct fuse_supp_groups *sg;              
553         kgid_t kgid = dir->i_gid;                 
554         gid_t parent_gid = from_kgid(fc->user_    
555         u32 sg_len = fuse_ext_size(sizeof(*sg)    
556                                                   
557         if (parent_gid == (gid_t) -1 || gid_eq    
558             !in_group_p(kgid))                    
559                 return 0;                         
560                                                   
561         xh = extend_arg(ext, sg_len);             
562         if (!xh)                                  
563                 return -ENOMEM;                   
564                                                   
565         xh->size = sg_len;                        
566         xh->type = FUSE_EXT_GROUPS;               
567                                                   
568         sg = (struct fuse_supp_groups *) &xh[1    
569         sg->nr_groups = 1;                        
570         sg->groups[0] = parent_gid;               
571                                                   
572         return 0;                                 
573 }                                                 
574                                                   
575 static int get_create_ext(struct fuse_args *ar    
576                           struct inode *dir, s    
577                           umode_t mode)           
578 {                                                 
579         struct fuse_conn *fc = get_fuse_conn_s    
580         struct fuse_in_arg ext = { .size = 0,     
581         int err = 0;                              
582                                                   
583         if (fc->init_security)                    
584                 err = get_security_context(den    
585         if (!err && fc->create_supp_group)        
586                 err = get_create_supp_group(di    
587                                                   
588         if (!err && ext.size) {                   
589                 WARN_ON(args->in_numargs >= AR    
590                 args->is_ext = true;              
591                 args->ext_idx = args->in_numar    
592                 args->in_args[args->ext_idx] =    
593         } else {                                  
594                 kfree(ext.value);                 
595         }                                         
596                                                   
597         return err;                               
598 }                                                 
599                                                   
600 static void free_ext_value(struct fuse_args *a    
601 {                                                 
602         if (args->is_ext)                         
603                 kfree(args->in_args[args->ext_    
604 }                                                 
605                                                   
606 /*                                                
607  * Atomic create+open operation                   
608  *                                                
609  * If the filesystem doesn't support this, the    
610  * 'mknod' + 'open' requests.                     
611  */                                               
612 static int fuse_create_open(struct inode *dir,    
613                             struct file *file,    
614                             umode_t mode, u32     
615 {                                                 
616         int err;                                  
617         struct inode *inode;                      
618         struct fuse_mount *fm = get_fuse_mount    
619         FUSE_ARGS(args);                          
620         struct fuse_forget_link *forget;          
621         struct fuse_create_in inarg;              
622         struct fuse_open_out *outopenp;           
623         struct fuse_entry_out outentry;           
624         struct fuse_inode *fi;                    
625         struct fuse_file *ff;                     
626         bool trunc = flags & O_TRUNC;             
627                                                   
628         /* Userspace expects S_IFREG in create    
629         BUG_ON((mode & S_IFMT) != S_IFREG);       
630                                                   
631         forget = fuse_alloc_forget();             
632         err = -ENOMEM;                            
633         if (!forget)                              
634                 goto out_err;                     
635                                                   
636         err = -ENOMEM;                            
637         ff = fuse_file_alloc(fm, true);           
638         if (!ff)                                  
639                 goto out_put_forget_req;          
640                                                   
641         if (!fm->fc->dont_mask)                   
642                 mode &= ~current_umask();         
643                                                   
644         flags &= ~O_NOCTTY;                       
645         memset(&inarg, 0, sizeof(inarg));         
646         memset(&outentry, 0, sizeof(outentry))    
647         inarg.flags = flags;                      
648         inarg.mode = mode;                        
649         inarg.umask = current_umask();            
650                                                   
651         if (fm->fc->handle_killpriv_v2 && trun    
652             !(flags & O_EXCL) && !capable(CAP_    
653                 inarg.open_flags |= FUSE_OPEN_    
654         }                                         
655                                                   
656         args.opcode = opcode;                     
657         args.nodeid = get_node_id(dir);           
658         args.in_numargs = 2;                      
659         args.in_args[0].size = sizeof(inarg);     
660         args.in_args[0].value = &inarg;           
661         args.in_args[1].size = entry->d_name.l    
662         args.in_args[1].value = entry->d_name.    
663         args.out_numargs = 2;                     
664         args.out_args[0].size = sizeof(outentr    
665         args.out_args[0].value = &outentry;       
666         /* Store outarg for fuse_finish_open()    
667         outopenp = &ff->args->open_outarg;        
668         args.out_args[1].size = sizeof(*outope    
669         args.out_args[1].value = outopenp;        
670                                                   
671         err = get_create_ext(&args, dir, entry    
672         if (err)                                  
673                 goto out_free_ff;                 
674                                                   
675         err = fuse_simple_request(fm, &args);     
676         free_ext_value(&args);                    
677         if (err)                                  
678                 goto out_free_ff;                 
679                                                   
680         err = -EIO;                               
681         if (!S_ISREG(outentry.attr.mode) || in    
682             fuse_invalid_attr(&outentry.attr))    
683                 goto out_free_ff;                 
684                                                   
685         ff->fh = outopenp->fh;                    
686         ff->nodeid = outentry.nodeid;             
687         ff->open_flags = outopenp->open_flags;    
688         inode = fuse_iget(dir->i_sb, outentry.    
689                           &outentry.attr, ATTR    
690         if (!inode) {                             
691                 flags &= ~(O_CREAT | O_EXCL |     
692                 fuse_sync_release(NULL, ff, fl    
693                 fuse_queue_forget(fm->fc, forg    
694                 err = -ENOMEM;                    
695                 goto out_err;                     
696         }                                         
697         kfree(forget);                            
698         d_instantiate(entry, inode);              
699         fuse_change_entry_timeout(entry, &oute    
700         fuse_dir_changed(dir);                    
701         err = generic_file_open(inode, file);     
702         if (!err) {                               
703                 file->private_data = ff;          
704                 err = finish_open(file, entry,    
705         }                                         
706         if (err) {                                
707                 fi = get_fuse_inode(inode);       
708                 fuse_sync_release(fi, ff, flag    
709         } else {                                  
710                 if (fm->fc->atomic_o_trunc &&     
711                         truncate_pagecache(ino    
712                 else if (!(ff->open_flags & FO    
713                         invalidate_inode_pages    
714         }                                         
715         return err;                               
716                                                   
717 out_free_ff:                                      
718         fuse_file_free(ff);                       
719 out_put_forget_req:                               
720         kfree(forget);                            
721 out_err:                                          
722         return err;                               
723 }                                                 
724                                                   
725 static int fuse_mknod(struct mnt_idmap *, stru    
726                       umode_t, dev_t);            
727 static int fuse_atomic_open(struct inode *dir,    
728                             struct file *file,    
729                             umode_t mode)         
730 {                                                 
731         int err;                                  
732         struct fuse_conn *fc = get_fuse_conn(d    
733         struct dentry *res = NULL;                
734                                                   
735         if (fuse_is_bad(dir))                     
736                 return -EIO;                      
737                                                   
738         if (d_in_lookup(entry)) {                 
739                 res = fuse_lookup(dir, entry,     
740                 if (IS_ERR(res))                  
741                         return PTR_ERR(res);      
742                                                   
743                 if (res)                          
744                         entry = res;              
745         }                                         
746                                                   
747         if (!(flags & O_CREAT) || d_really_is_    
748                 goto no_open;                     
749                                                   
750         /* Only creates */                        
751         file->f_mode |= FMODE_CREATED;            
752                                                   
753         if (fc->no_create)                        
754                 goto mknod;                       
755                                                   
756         err = fuse_create_open(dir, entry, fil    
757         if (err == -ENOSYS) {                     
758                 fc->no_create = 1;                
759                 goto mknod;                       
760         } else if (err == -EEXIST)                
761                 fuse_invalidate_entry(entry);     
762 out_dput:                                         
763         dput(res);                                
764         return err;                               
765                                                   
766 mknod:                                            
767         err = fuse_mknod(&nop_mnt_idmap, dir,     
768         if (err)                                  
769                 goto out_dput;                    
770 no_open:                                          
771         return finish_no_open(file, res);         
772 }                                                 
773                                                   
774 /*                                                
775  * Code shared between mknod, mkdir, symlink a    
776  */                                               
777 static int create_new_entry(struct fuse_mount     
778                             struct inode *dir,    
779                             umode_t mode)         
780 {                                                 
781         struct fuse_entry_out outarg;             
782         struct inode *inode;                      
783         struct dentry *d;                         
784         int err;                                  
785         struct fuse_forget_link *forget;          
786                                                   
787         if (fuse_is_bad(dir))                     
788                 return -EIO;                      
789                                                   
790         forget = fuse_alloc_forget();             
791         if (!forget)                              
792                 return -ENOMEM;                   
793                                                   
794         memset(&outarg, 0, sizeof(outarg));       
795         args->nodeid = get_node_id(dir);          
796         args->out_numargs = 1;                    
797         args->out_args[0].size = sizeof(outarg    
798         args->out_args[0].value = &outarg;        
799                                                   
800         if (args->opcode != FUSE_LINK) {          
801                 err = get_create_ext(args, dir    
802                 if (err)                          
803                         goto out_put_forget_re    
804         }                                         
805                                                   
806         err = fuse_simple_request(fm, args);      
807         free_ext_value(args);                     
808         if (err)                                  
809                 goto out_put_forget_req;          
810                                                   
811         err = -EIO;                               
812         if (invalid_nodeid(outarg.nodeid) || f    
813                 goto out_put_forget_req;          
814                                                   
815         if ((outarg.attr.mode ^ mode) & S_IFMT    
816                 goto out_put_forget_req;          
817                                                   
818         inode = fuse_iget(dir->i_sb, outarg.no    
819                           &outarg.attr, ATTR_T    
820         if (!inode) {                             
821                 fuse_queue_forget(fm->fc, forg    
822                 return -ENOMEM;                   
823         }                                         
824         kfree(forget);                            
825                                                   
826         d_drop(entry);                            
827         d = d_splice_alias(inode, entry);         
828         if (IS_ERR(d))                            
829                 return PTR_ERR(d);                
830                                                   
831         if (d) {                                  
832                 fuse_change_entry_timeout(d, &    
833                 dput(d);                          
834         } else {                                  
835                 fuse_change_entry_timeout(entr    
836         }                                         
837         fuse_dir_changed(dir);                    
838         return 0;                                 
839                                                   
840  out_put_forget_req:                              
841         if (err == -EEXIST)                       
842                 fuse_invalidate_entry(entry);     
843         kfree(forget);                            
844         return err;                               
845 }                                                 
846                                                   
847 static int fuse_mknod(struct mnt_idmap *idmap,    
848                       struct dentry *entry, um    
849 {                                                 
850         struct fuse_mknod_in inarg;               
851         struct fuse_mount *fm = get_fuse_mount    
852         FUSE_ARGS(args);                          
853                                                   
854         if (!fm->fc->dont_mask)                   
855                 mode &= ~current_umask();         
856                                                   
857         memset(&inarg, 0, sizeof(inarg));         
858         inarg.mode = mode;                        
859         inarg.rdev = new_encode_dev(rdev);        
860         inarg.umask = current_umask();            
861         args.opcode = FUSE_MKNOD;                 
862         args.in_numargs = 2;                      
863         args.in_args[0].size = sizeof(inarg);     
864         args.in_args[0].value = &inarg;           
865         args.in_args[1].size = entry->d_name.l    
866         args.in_args[1].value = entry->d_name.    
867         return create_new_entry(fm, &args, dir    
868 }                                                 
869                                                   
870 static int fuse_create(struct mnt_idmap *idmap    
871                        struct dentry *entry, u    
872 {                                                 
873         return fuse_mknod(&nop_mnt_idmap, dir,    
874 }                                                 
875                                                   
876 static int fuse_tmpfile(struct mnt_idmap *idma    
877                         struct file *file, umo    
878 {                                                 
879         struct fuse_conn *fc = get_fuse_conn(d    
880         int err;                                  
881                                                   
882         if (fc->no_tmpfile)                       
883                 return -EOPNOTSUPP;               
884                                                   
885         err = fuse_create_open(dir, file->f_pa    
886         if (err == -ENOSYS) {                     
887                 fc->no_tmpfile = 1;               
888                 err = -EOPNOTSUPP;                
889         }                                         
890         return err;                               
891 }                                                 
892                                                   
893 static int fuse_mkdir(struct mnt_idmap *idmap,    
894                       struct dentry *entry, um    
895 {                                                 
896         struct fuse_mkdir_in inarg;               
897         struct fuse_mount *fm = get_fuse_mount    
898         FUSE_ARGS(args);                          
899                                                   
900         if (!fm->fc->dont_mask)                   
901                 mode &= ~current_umask();         
902                                                   
903         memset(&inarg, 0, sizeof(inarg));         
904         inarg.mode = mode;                        
905         inarg.umask = current_umask();            
906         args.opcode = FUSE_MKDIR;                 
907         args.in_numargs = 2;                      
908         args.in_args[0].size = sizeof(inarg);     
909         args.in_args[0].value = &inarg;           
910         args.in_args[1].size = entry->d_name.l    
911         args.in_args[1].value = entry->d_name.    
912         return create_new_entry(fm, &args, dir    
913 }                                                 
914                                                   
915 static int fuse_symlink(struct mnt_idmap *idma    
916                         struct dentry *entry,     
917 {                                                 
918         struct fuse_mount *fm = get_fuse_mount    
919         unsigned len = strlen(link) + 1;          
920         FUSE_ARGS(args);                          
921                                                   
922         args.opcode = FUSE_SYMLINK;               
923         args.in_numargs = 2;                      
924         args.in_args[0].size = entry->d_name.l    
925         args.in_args[0].value = entry->d_name.    
926         args.in_args[1].size = len;               
927         args.in_args[1].value = link;             
928         return create_new_entry(fm, &args, dir    
929 }                                                 
930                                                   
931 void fuse_flush_time_update(struct inode *inod    
932 {                                                 
933         int err = sync_inode_metadata(inode, 1    
934                                                   
935         mapping_set_error(inode->i_mapping, er    
936 }                                                 
937                                                   
938 static void fuse_update_ctime_in_cache(struct     
939 {                                                 
940         if (!IS_NOCMTIME(inode)) {                
941                 inode_set_ctime_current(inode)    
942                 mark_inode_dirty_sync(inode);     
943                 fuse_flush_time_update(inode);    
944         }                                         
945 }                                                 
946                                                   
947 void fuse_update_ctime(struct inode *inode)       
948 {                                                 
949         fuse_invalidate_attr_mask(inode, STATX    
950         fuse_update_ctime_in_cache(inode);        
951 }                                                 
952                                                   
953 static void fuse_entry_unlinked(struct dentry     
954 {                                                 
955         struct inode *inode = d_inode(entry);     
956         struct fuse_conn *fc = get_fuse_conn(i    
957         struct fuse_inode *fi = get_fuse_inode    
958                                                   
959         spin_lock(&fi->lock);                     
960         fi->attr_version = atomic64_inc_return    
961         /*                                        
962          * If i_nlink == 0 then unlink doesn't    
963          * happen if userspace filesystem is c    
964          * difficult to enforce correct nlink     
965          * condition here                         
966          */                                       
967         if (S_ISDIR(inode->i_mode))               
968                 clear_nlink(inode);               
969         else if (inode->i_nlink > 0)              
970                 drop_nlink(inode);                
971         spin_unlock(&fi->lock);                   
972         fuse_invalidate_entry_cache(entry);       
973         fuse_update_ctime(inode);                 
974 }                                                 
975                                                   
976 static int fuse_unlink(struct inode *dir, stru    
977 {                                                 
978         int err;                                  
979         struct fuse_mount *fm = get_fuse_mount    
980         FUSE_ARGS(args);                          
981                                                   
982         if (fuse_is_bad(dir))                     
983                 return -EIO;                      
984                                                   
985         args.opcode = FUSE_UNLINK;                
986         args.nodeid = get_node_id(dir);           
987         args.in_numargs = 1;                      
988         args.in_args[0].size = entry->d_name.l    
989         args.in_args[0].value = entry->d_name.    
990         err = fuse_simple_request(fm, &args);     
991         if (!err) {                               
992                 fuse_dir_changed(dir);            
993                 fuse_entry_unlinked(entry);       
994         } else if (err == -EINTR || err == -EN    
995                 fuse_invalidate_entry(entry);     
996         return err;                               
997 }                                                 
998                                                   
999 static int fuse_rmdir(struct inode *dir, struc    
1000 {                                                
1001         int err;                                 
1002         struct fuse_mount *fm = get_fuse_moun    
1003         FUSE_ARGS(args);                         
1004                                                  
1005         if (fuse_is_bad(dir))                    
1006                 return -EIO;                     
1007                                                  
1008         args.opcode = FUSE_RMDIR;                
1009         args.nodeid = get_node_id(dir);          
1010         args.in_numargs = 1;                     
1011         args.in_args[0].size = entry->d_name.    
1012         args.in_args[0].value = entry->d_name    
1013         err = fuse_simple_request(fm, &args);    
1014         if (!err) {                              
1015                 fuse_dir_changed(dir);           
1016                 fuse_entry_unlinked(entry);      
1017         } else if (err == -EINTR || err == -E    
1018                 fuse_invalidate_entry(entry);    
1019         return err;                              
1020 }                                                
1021                                                  
1022 static int fuse_rename_common(struct inode *o    
1023                               struct inode *n    
1024                               unsigned int fl    
1025 {                                                
1026         int err;                                 
1027         struct fuse_rename2_in inarg;            
1028         struct fuse_mount *fm = get_fuse_moun    
1029         FUSE_ARGS(args);                         
1030                                                  
1031         memset(&inarg, 0, argsize);              
1032         inarg.newdir = get_node_id(newdir);      
1033         inarg.flags = flags;                     
1034         args.opcode = opcode;                    
1035         args.nodeid = get_node_id(olddir);       
1036         args.in_numargs = 3;                     
1037         args.in_args[0].size = argsize;          
1038         args.in_args[0].value = &inarg;          
1039         args.in_args[1].size = oldent->d_name    
1040         args.in_args[1].value = oldent->d_nam    
1041         args.in_args[2].size = newent->d_name    
1042         args.in_args[2].value = newent->d_nam    
1043         err = fuse_simple_request(fm, &args);    
1044         if (!err) {                              
1045                 /* ctime changes */              
1046                 fuse_update_ctime(d_inode(old    
1047                                                  
1048                 if (flags & RENAME_EXCHANGE)     
1049                         fuse_update_ctime(d_i    
1050                                                  
1051                 fuse_dir_changed(olddir);        
1052                 if (olddir != newdir)            
1053                         fuse_dir_changed(newd    
1054                                                  
1055                 /* newent will end up negativ    
1056                 if (!(flags & RENAME_EXCHANGE    
1057                         fuse_entry_unlinked(n    
1058         } else if (err == -EINTR || err == -E    
1059                 /* If request was interrupted    
1060                    rename actually took place    
1061                    fails (e.g. some process h    
1062                    directory), then there can    
1063                    the dcache and the real fi    
1064                 fuse_invalidate_entry(oldent)    
1065                 if (d_really_is_positive(newe    
1066                         fuse_invalidate_entry    
1067         }                                        
1068                                                  
1069         return err;                              
1070 }                                                
1071                                                  
1072 static int fuse_rename2(struct mnt_idmap *idm    
1073                         struct dentry *oldent    
1074                         struct dentry *newent    
1075 {                                                
1076         struct fuse_conn *fc = get_fuse_conn(    
1077         int err;                                 
1078                                                  
1079         if (fuse_is_bad(olddir))                 
1080                 return -EIO;                     
1081                                                  
1082         if (flags & ~(RENAME_NOREPLACE | RENA    
1083                 return -EINVAL;                  
1084                                                  
1085         if (flags) {                             
1086                 if (fc->no_rename2 || fc->min    
1087                         return -EINVAL;          
1088                                                  
1089                 err = fuse_rename_common(oldd    
1090                                          FUSE    
1091                                          size    
1092                 if (err == -ENOSYS) {            
1093                         fc->no_rename2 = 1;      
1094                         err = -EINVAL;           
1095                 }                                
1096         } else {                                 
1097                 err = fuse_rename_common(oldd    
1098                                          FUSE    
1099                                          size    
1100         }                                        
1101                                                  
1102         return err;                              
1103 }                                                
1104                                                  
1105 static int fuse_link(struct dentry *entry, st    
1106                      struct dentry *newent)      
1107 {                                                
1108         int err;                                 
1109         struct fuse_link_in inarg;               
1110         struct inode *inode = d_inode(entry);    
1111         struct fuse_mount *fm = get_fuse_moun    
1112         FUSE_ARGS(args);                         
1113                                                  
1114         memset(&inarg, 0, sizeof(inarg));        
1115         inarg.oldnodeid = get_node_id(inode);    
1116         args.opcode = FUSE_LINK;                 
1117         args.in_numargs = 2;                     
1118         args.in_args[0].size = sizeof(inarg);    
1119         args.in_args[0].value = &inarg;          
1120         args.in_args[1].size = newent->d_name    
1121         args.in_args[1].value = newent->d_nam    
1122         err = create_new_entry(fm, &args, new    
1123         if (!err)                                
1124                 fuse_update_ctime_in_cache(in    
1125         else if (err == -EINTR)                  
1126                 fuse_invalidate_attr(inode);     
1127                                                  
1128         return err;                              
1129 }                                                
1130                                                  
1131 static void fuse_fillattr(struct inode *inode    
1132                           struct kstat *stat)    
1133 {                                                
1134         unsigned int blkbits;                    
1135         struct fuse_conn *fc = get_fuse_conn(    
1136                                                  
1137         stat->dev = inode->i_sb->s_dev;          
1138         stat->ino = attr->ino;                   
1139         stat->mode = (inode->i_mode & S_IFMT)    
1140         stat->nlink = attr->nlink;               
1141         stat->uid = make_kuid(fc->user_ns, at    
1142         stat->gid = make_kgid(fc->user_ns, at    
1143         stat->rdev = inode->i_rdev;              
1144         stat->atime.tv_sec = attr->atime;        
1145         stat->atime.tv_nsec = attr->atimensec    
1146         stat->mtime.tv_sec = attr->mtime;        
1147         stat->mtime.tv_nsec = attr->mtimensec    
1148         stat->ctime.tv_sec = attr->ctime;        
1149         stat->ctime.tv_nsec = attr->ctimensec    
1150         stat->size = attr->size;                 
1151         stat->blocks = attr->blocks;             
1152                                                  
1153         if (attr->blksize != 0)                  
1154                 blkbits = ilog2(attr->blksize    
1155         else                                     
1156                 blkbits = inode->i_sb->s_bloc    
1157                                                  
1158         stat->blksize = 1 << blkbits;            
1159 }                                                
1160                                                  
1161 static void fuse_statx_to_attr(struct fuse_st    
1162 {                                                
1163         memset(attr, 0, sizeof(*attr));          
1164         attr->ino = sx->ino;                     
1165         attr->size = sx->size;                   
1166         attr->blocks = sx->blocks;               
1167         attr->atime = sx->atime.tv_sec;          
1168         attr->mtime = sx->mtime.tv_sec;          
1169         attr->ctime = sx->ctime.tv_sec;          
1170         attr->atimensec = sx->atime.tv_nsec;     
1171         attr->mtimensec = sx->mtime.tv_nsec;     
1172         attr->ctimensec = sx->ctime.tv_nsec;     
1173         attr->mode = sx->mode;                   
1174         attr->nlink = sx->nlink;                 
1175         attr->uid = sx->uid;                     
1176         attr->gid = sx->gid;                     
1177         attr->rdev = new_encode_dev(MKDEV(sx-    
1178         attr->blksize = sx->blksize;             
1179 }                                                
1180                                                  
1181 static int fuse_do_statx(struct inode *inode,    
1182                          struct kstat *stat)     
1183 {                                                
1184         int err;                                 
1185         struct fuse_attr attr;                   
1186         struct fuse_statx *sx;                   
1187         struct fuse_statx_in inarg;              
1188         struct fuse_statx_out outarg;            
1189         struct fuse_mount *fm = get_fuse_moun    
1190         u64 attr_version = fuse_get_attr_vers    
1191         FUSE_ARGS(args);                         
1192                                                  
1193         memset(&inarg, 0, sizeof(inarg));        
1194         memset(&outarg, 0, sizeof(outarg));      
1195         /* Directories have separate file-han    
1196         if (file && S_ISREG(inode->i_mode)) {    
1197                 struct fuse_file *ff = file->    
1198                                                  
1199                 inarg.getattr_flags |= FUSE_G    
1200                 inarg.fh = ff->fh;               
1201         }                                        
1202         /* For now leave sync hints as the de    
1203         inarg.sx_flags = 0;                      
1204         inarg.sx_mask = STATX_BASIC_STATS | S    
1205         args.opcode = FUSE_STATX;                
1206         args.nodeid = get_node_id(inode);        
1207         args.in_numargs = 1;                     
1208         args.in_args[0].size = sizeof(inarg);    
1209         args.in_args[0].value = &inarg;          
1210         args.out_numargs = 1;                    
1211         args.out_args[0].size = sizeof(outarg    
1212         args.out_args[0].value = &outarg;        
1213         err = fuse_simple_request(fm, &args);    
1214         if (err)                                 
1215                 return err;                      
1216                                                  
1217         sx = &outarg.stat;                       
1218         if (((sx->mask & STATX_SIZE) && !fuse    
1219             ((sx->mask & STATX_TYPE) && (!fus    
1220                                          inod    
1221                 fuse_make_bad(inode);            
1222                 return -EIO;                     
1223         }                                        
1224                                                  
1225         fuse_statx_to_attr(&outarg.stat, &att    
1226         if ((sx->mask & STATX_BASIC_STATS) ==    
1227                 fuse_change_attributes(inode,    
1228                                        ATTR_T    
1229         }                                        
1230                                                  
1231         if (stat) {                              
1232                 stat->result_mask = sx->mask     
1233                 stat->btime.tv_sec = sx->btim    
1234                 stat->btime.tv_nsec = min_t(u    
1235                 fuse_fillattr(inode, &attr, s    
1236                 stat->result_mask |= STATX_TY    
1237         }                                        
1238                                                  
1239         return 0;                                
1240 }                                                
1241                                                  
1242 static int fuse_do_getattr(struct inode *inod    
1243                            struct file *file)    
1244 {                                                
1245         int err;                                 
1246         struct fuse_getattr_in inarg;            
1247         struct fuse_attr_out outarg;             
1248         struct fuse_mount *fm = get_fuse_moun    
1249         FUSE_ARGS(args);                         
1250         u64 attr_version;                        
1251                                                  
1252         attr_version = fuse_get_attr_version(    
1253                                                  
1254         memset(&inarg, 0, sizeof(inarg));        
1255         memset(&outarg, 0, sizeof(outarg));      
1256         /* Directories have separate file-han    
1257         if (file && S_ISREG(inode->i_mode)) {    
1258                 struct fuse_file *ff = file->    
1259                                                  
1260                 inarg.getattr_flags |= FUSE_G    
1261                 inarg.fh = ff->fh;               
1262         }                                        
1263         args.opcode = FUSE_GETATTR;              
1264         args.nodeid = get_node_id(inode);        
1265         args.in_numargs = 1;                     
1266         args.in_args[0].size = sizeof(inarg);    
1267         args.in_args[0].value = &inarg;          
1268         args.out_numargs = 1;                    
1269         args.out_args[0].size = sizeof(outarg    
1270         args.out_args[0].value = &outarg;        
1271         err = fuse_simple_request(fm, &args);    
1272         if (!err) {                              
1273                 if (fuse_invalid_attr(&outarg    
1274                     inode_wrong_type(inode, o    
1275                         fuse_make_bad(inode);    
1276                         err = -EIO;              
1277                 } else {                         
1278                         fuse_change_attribute    
1279                                                  
1280                                                  
1281                         if (stat)                
1282                                 fuse_fillattr    
1283                 }                                
1284         }                                        
1285         return err;                              
1286 }                                                
1287                                                  
1288 static int fuse_update_get_attr(struct inode     
1289                                 struct kstat     
1290                                 unsigned int     
1291 {                                                
1292         struct fuse_inode *fi = get_fuse_inod    
1293         struct fuse_conn *fc = get_fuse_conn(    
1294         int err = 0;                             
1295         bool sync;                               
1296         u32 inval_mask = READ_ONCE(fi->inval_    
1297         u32 cache_mask = fuse_get_cache_mask(    
1298                                                  
1299                                                  
1300         /* FUSE only supports basic stats and    
1301         request_mask &= STATX_BASIC_STATS | S    
1302 retry:                                           
1303         if (fc->no_statx)                        
1304                 request_mask &= STATX_BASIC_S    
1305                                                  
1306         if (!request_mask)                       
1307                 sync = false;                    
1308         else if (flags & AT_STATX_FORCE_SYNC)    
1309                 sync = true;                     
1310         else if (flags & AT_STATX_DONT_SYNC)     
1311                 sync = false;                    
1312         else if (request_mask & inval_mask &     
1313                 sync = true;                     
1314         else                                     
1315                 sync = time_before64(fi->i_ti    
1316                                                  
1317         if (sync) {                              
1318                 forget_all_cached_acls(inode)    
1319                 /* Try statx if BTIME is requ    
1320                 if (!fc->no_statx && (request    
1321                         err = fuse_do_statx(i    
1322                         if (err == -ENOSYS) {    
1323                                 fc->no_statx     
1324                                 err = 0;         
1325                                 goto retry;      
1326                         }                        
1327                 } else {                         
1328                         err = fuse_do_getattr    
1329                 }                                
1330         } else if (stat) {                       
1331                 generic_fillattr(&nop_mnt_idm    
1332                 stat->mode = fi->orig_i_mode;    
1333                 stat->ino = fi->orig_ino;        
1334                 if (test_bit(FUSE_I_BTIME, &f    
1335                         stat->btime = fi->i_b    
1336                         stat->result_mask |=     
1337                 }                                
1338         }                                        
1339                                                  
1340         return err;                              
1341 }                                                
1342                                                  
1343 int fuse_update_attributes(struct inode *inod    
1344 {                                                
1345         return fuse_update_get_attr(inode, fi    
1346 }                                                
1347                                                  
1348 int fuse_reverse_inval_entry(struct fuse_conn    
1349                              u64 child_nodeid    
1350 {                                                
1351         int err = -ENOTDIR;                      
1352         struct inode *parent;                    
1353         struct dentry *dir;                      
1354         struct dentry *entry;                    
1355                                                  
1356         parent = fuse_ilookup(fc, parent_node    
1357         if (!parent)                             
1358                 return -ENOENT;                  
1359                                                  
1360         inode_lock_nested(parent, I_MUTEX_PAR    
1361         if (!S_ISDIR(parent->i_mode))            
1362                 goto unlock;                     
1363                                                  
1364         err = -ENOENT;                           
1365         dir = d_find_alias(parent);              
1366         if (!dir)                                
1367                 goto unlock;                     
1368                                                  
1369         name->hash = full_name_hash(dir, name    
1370         entry = d_lookup(dir, name);             
1371         dput(dir);                               
1372         if (!entry)                              
1373                 goto unlock;                     
1374                                                  
1375         fuse_dir_changed(parent);                
1376         if (!(flags & FUSE_EXPIRE_ONLY))         
1377                 d_invalidate(entry);             
1378         fuse_invalidate_entry_cache(entry);      
1379                                                  
1380         if (child_nodeid != 0 && d_really_is_    
1381                 inode_lock(d_inode(entry));      
1382                 if (get_node_id(d_inode(entry    
1383                         err = -ENOENT;           
1384                         goto badentry;           
1385                 }                                
1386                 if (d_mountpoint(entry)) {       
1387                         err = -EBUSY;            
1388                         goto badentry;           
1389                 }                                
1390                 if (d_is_dir(entry)) {           
1391                         shrink_dcache_parent(    
1392                         if (!simple_empty(ent    
1393                                 err = -ENOTEM    
1394                                 goto badentry    
1395                         }                        
1396                         d_inode(entry)->i_fla    
1397                 }                                
1398                 dont_mount(entry);               
1399                 clear_nlink(d_inode(entry));     
1400                 err = 0;                         
1401  badentry:                                       
1402                 inode_unlock(d_inode(entry));    
1403                 if (!err)                        
1404                         d_delete(entry);         
1405         } else {                                 
1406                 err = 0;                         
1407         }                                        
1408         dput(entry);                             
1409                                                  
1410  unlock:                                         
1411         inode_unlock(parent);                    
1412         iput(parent);                            
1413         return err;                              
1414 }                                                
1415                                                  
1416 static inline bool fuse_permissible_uidgid(st    
1417 {                                                
1418         const struct cred *cred = current_cre    
1419                                                  
1420         return (uid_eq(cred->euid, fc->user_i    
1421                 uid_eq(cred->suid, fc->user_i    
1422                 uid_eq(cred->uid,  fc->user_i    
1423                 gid_eq(cred->egid, fc->group_    
1424                 gid_eq(cred->sgid, fc->group_    
1425                 gid_eq(cred->gid,  fc->group_    
1426 }                                                
1427                                                  
1428 /*                                               
1429  * Calling into a user-controlled filesystem     
1430  * daemon ptrace-like capabilities over the c    
1431  * means, that the filesystem daemon is able     
1432  * filesystem operations performed, and can a    
1433  * of the requester process in otherwise impo    
1434  * it can delay the operation for arbitrary l    
1435  * DoS against the requester.                    
1436  *                                               
1437  * For this reason only those processes can c    
1438  * for which the owner of the mount has ptrac    
1439  * excludes processes started by other users,    
1440  */                                              
1441 bool fuse_allow_current_process(struct fuse_c    
1442 {                                                
1443         bool allow;                              
1444                                                  
1445         if (fc->allow_other)                     
1446                 allow = current_in_userns(fc-    
1447         else                                     
1448                 allow = fuse_permissible_uidg    
1449                                                  
1450         if (!allow && allow_sys_admin_access     
1451                 allow = true;                    
1452                                                  
1453         return allow;                            
1454 }                                                
1455                                                  
1456 static int fuse_access(struct inode *inode, i    
1457 {                                                
1458         struct fuse_mount *fm = get_fuse_moun    
1459         FUSE_ARGS(args);                         
1460         struct fuse_access_in inarg;             
1461         int err;                                 
1462                                                  
1463         BUG_ON(mask & MAY_NOT_BLOCK);            
1464                                                  
1465         if (fm->fc->no_access)                   
1466                 return 0;                        
1467                                                  
1468         memset(&inarg, 0, sizeof(inarg));        
1469         inarg.mask = mask & (MAY_READ | MAY_W    
1470         args.opcode = FUSE_ACCESS;               
1471         args.nodeid = get_node_id(inode);        
1472         args.in_numargs = 1;                     
1473         args.in_args[0].size = sizeof(inarg);    
1474         args.in_args[0].value = &inarg;          
1475         err = fuse_simple_request(fm, &args);    
1476         if (err == -ENOSYS) {                    
1477                 fm->fc->no_access = 1;           
1478                 err = 0;                         
1479         }                                        
1480         return err;                              
1481 }                                                
1482                                                  
1483 static int fuse_perm_getattr(struct inode *in    
1484 {                                                
1485         if (mask & MAY_NOT_BLOCK)                
1486                 return -ECHILD;                  
1487                                                  
1488         forget_all_cached_acls(inode);           
1489         return fuse_do_getattr(inode, NULL, N    
1490 }                                                
1491                                                  
1492 /*                                               
1493  * Check permission.  The two basic access mo    
1494  *                                               
1495  * 1) Local access checking ('default_permiss    
1496  * on file mode.  This is the plain old disk     
1497  * model.                                        
1498  *                                               
1499  * 2) "Remote" access checking, where server     
1500  * checking permission in each inode operatio    
1501  * is if ->permission() was invoked from sys_    
1502  * access request is sent.  Execute permissio    
1503  * locally based on file mode.                   
1504  */                                              
1505 static int fuse_permission(struct mnt_idmap *    
1506                            struct inode *inod    
1507 {                                                
1508         struct fuse_conn *fc = get_fuse_conn(    
1509         bool refreshed = false;                  
1510         int err = 0;                             
1511                                                  
1512         if (fuse_is_bad(inode))                  
1513                 return -EIO;                     
1514                                                  
1515         if (!fuse_allow_current_process(fc))     
1516                 return -EACCES;                  
1517                                                  
1518         /*                                       
1519          * If attributes are needed, refresh     
1520          */                                      
1521         if (fc->default_permissions ||           
1522             ((mask & MAY_EXEC) && S_ISREG(ino    
1523                 struct fuse_inode *fi = get_f    
1524                 u32 perm_mask = STATX_MODE |     
1525                                                  
1526                 if (perm_mask & READ_ONCE(fi-    
1527                     time_before64(fi->i_time,    
1528                         refreshed = true;        
1529                                                  
1530                         err = fuse_perm_getat    
1531                         if (err)                 
1532                                 return err;      
1533                 }                                
1534         }                                        
1535                                                  
1536         if (fc->default_permissions) {           
1537                 err = generic_permission(&nop    
1538                                                  
1539                 /* If permission is denied, t    
1540                    attributes.  This is also     
1541                    node will at first have no    
1542                 if (err == -EACCES && !refres    
1543                         err = fuse_perm_getat    
1544                         if (!err)                
1545                                 err = generic    
1546                                                  
1547                 }                                
1548                                                  
1549                 /* Note: the opposite of the     
1550                    exist.  So if permissions     
1551                    noticed immediately, only     
1552                    timeout has expired */        
1553         } else if (mask & (MAY_ACCESS | MAY_C    
1554                 err = fuse_access(inode, mask    
1555         } else if ((mask & MAY_EXEC) && S_ISR    
1556                 if (!(inode->i_mode & S_IXUGO    
1557                         if (refreshed)           
1558                                 return -EACCE    
1559                                                  
1560                         err = fuse_perm_getat    
1561                         if (!err && !(inode->    
1562                                 return -EACCE    
1563                 }                                
1564         }                                        
1565         return err;                              
1566 }                                                
1567                                                  
1568 static int fuse_readlink_page(struct inode *i    
1569 {                                                
1570         struct fuse_mount *fm = get_fuse_moun    
1571         struct fuse_page_desc desc = { .lengt    
1572         struct fuse_args_pages ap = {            
1573                 .num_pages = 1,                  
1574                 .pages = &page,                  
1575                 .descs = &desc,                  
1576         };                                       
1577         char *link;                              
1578         ssize_t res;                             
1579                                                  
1580         ap.args.opcode = FUSE_READLINK;          
1581         ap.args.nodeid = get_node_id(inode);     
1582         ap.args.out_pages = true;                
1583         ap.args.out_argvar = true;               
1584         ap.args.page_zeroing = true;             
1585         ap.args.out_numargs = 1;                 
1586         ap.args.out_args[0].size = desc.lengt    
1587         res = fuse_simple_request(fm, &ap.arg    
1588                                                  
1589         fuse_invalidate_atime(inode);            
1590                                                  
1591         if (res < 0)                             
1592                 return res;                      
1593                                                  
1594         if (WARN_ON(res >= PAGE_SIZE))           
1595                 return -EIO;                     
1596                                                  
1597         link = page_address(page);               
1598         link[res] = '\0';                        
1599                                                  
1600         return 0;                                
1601 }                                                
1602                                                  
1603 static const char *fuse_get_link(struct dentr    
1604                                  struct delay    
1605 {                                                
1606         struct fuse_conn *fc = get_fuse_conn(    
1607         struct page *page;                       
1608         int err;                                 
1609                                                  
1610         err = -EIO;                              
1611         if (fuse_is_bad(inode))                  
1612                 goto out_err;                    
1613                                                  
1614         if (fc->cache_symlinks)                  
1615                 return page_get_link(dentry,     
1616                                                  
1617         err = -ECHILD;                           
1618         if (!dentry)                             
1619                 goto out_err;                    
1620                                                  
1621         page = alloc_page(GFP_KERNEL);           
1622         err = -ENOMEM;                           
1623         if (!page)                               
1624                 goto out_err;                    
1625                                                  
1626         err = fuse_readlink_page(inode, page)    
1627         if (err) {                               
1628                 __free_page(page);               
1629                 goto out_err;                    
1630         }                                        
1631                                                  
1632         set_delayed_call(callback, page_put_l    
1633                                                  
1634         return page_address(page);               
1635                                                  
1636 out_err:                                         
1637         return ERR_PTR(err);                     
1638 }                                                
1639                                                  
1640 static int fuse_dir_open(struct inode *inode,    
1641 {                                                
1642         struct fuse_mount *fm = get_fuse_moun    
1643         int err;                                 
1644                                                  
1645         if (fuse_is_bad(inode))                  
1646                 return -EIO;                     
1647                                                  
1648         err = generic_file_open(inode, file);    
1649         if (err)                                 
1650                 return err;                      
1651                                                  
1652         err = fuse_do_open(fm, get_node_id(in    
1653         if (!err) {                              
1654                 struct fuse_file *ff = file->    
1655                                                  
1656                 /*                               
1657                  * Keep handling FOPEN_STREAM    
1658                  * directories for backward c    
1659                  * to be useful.                 
1660                  */                              
1661                 if (ff->open_flags & (FOPEN_S    
1662                         nonseekable_open(inod    
1663         }                                        
1664                                                  
1665         return err;                              
1666 }                                                
1667                                                  
1668 static int fuse_dir_release(struct inode *ino    
1669 {                                                
1670         fuse_release_common(file, true);         
1671                                                  
1672         return 0;                                
1673 }                                                
1674                                                  
1675 static int fuse_dir_fsync(struct file *file,     
1676                           int datasync)          
1677 {                                                
1678         struct inode *inode = file->f_mapping    
1679         struct fuse_conn *fc = get_fuse_conn(    
1680         int err;                                 
1681                                                  
1682         if (fuse_is_bad(inode))                  
1683                 return -EIO;                     
1684                                                  
1685         if (fc->no_fsyncdir)                     
1686                 return 0;                        
1687                                                  
1688         inode_lock(inode);                       
1689         err = fuse_fsync_common(file, start,     
1690         if (err == -ENOSYS) {                    
1691                 fc->no_fsyncdir = 1;             
1692                 err = 0;                         
1693         }                                        
1694         inode_unlock(inode);                     
1695                                                  
1696         return err;                              
1697 }                                                
1698                                                  
1699 static long fuse_dir_ioctl(struct file *file,    
1700                             unsigned long arg    
1701 {                                                
1702         struct fuse_conn *fc = get_fuse_conn(    
1703                                                  
1704         /* FUSE_IOCTL_DIR only supported for     
1705         if (fc->minor < 18)                      
1706                 return -ENOTTY;                  
1707                                                  
1708         return fuse_ioctl_common(file, cmd, a    
1709 }                                                
1710                                                  
1711 static long fuse_dir_compat_ioctl(struct file    
1712                                    unsigned l    
1713 {                                                
1714         struct fuse_conn *fc = get_fuse_conn(    
1715                                                  
1716         if (fc->minor < 18)                      
1717                 return -ENOTTY;                  
1718                                                  
1719         return fuse_ioctl_common(file, cmd, a    
1720                                  FUSE_IOCTL_C    
1721 }                                                
1722                                                  
1723 static bool update_mtime(unsigned ivalid, boo    
1724 {                                                
1725         /* Always update if mtime is explicit    
1726         if (ivalid & ATTR_MTIME_SET)             
1727                 return true;                     
1728                                                  
1729         /* Or if kernel i_mtime is the offici    
1730         if (trust_local_mtime)                   
1731                 return true;                     
1732                                                  
1733         /* If it's an open(O_TRUNC) or an ftr    
1734         if ((ivalid & ATTR_SIZE) && (ivalid &    
1735                 return false;                    
1736                                                  
1737         /* In all other cases update */          
1738         return true;                             
1739 }                                                
1740                                                  
1741 static void iattr_to_fattr(struct fuse_conn *    
1742                            struct fuse_setatt    
1743 {                                                
1744         unsigned ivalid = iattr->ia_valid;       
1745                                                  
1746         if (ivalid & ATTR_MODE)                  
1747                 arg->valid |= FATTR_MODE,   a    
1748         if (ivalid & ATTR_UID)                   
1749                 arg->valid |= FATTR_UID,    a    
1750         if (ivalid & ATTR_GID)                   
1751                 arg->valid |= FATTR_GID,    a    
1752         if (ivalid & ATTR_SIZE)                  
1753                 arg->valid |= FATTR_SIZE,   a    
1754         if (ivalid & ATTR_ATIME) {               
1755                 arg->valid |= FATTR_ATIME;       
1756                 arg->atime = iattr->ia_atime.    
1757                 arg->atimensec = iattr->ia_at    
1758                 if (!(ivalid & ATTR_ATIME_SET    
1759                         arg->valid |= FATTR_A    
1760         }                                        
1761         if ((ivalid & ATTR_MTIME) && update_m    
1762                 arg->valid |= FATTR_MTIME;       
1763                 arg->mtime = iattr->ia_mtime.    
1764                 arg->mtimensec = iattr->ia_mt    
1765                 if (!(ivalid & ATTR_MTIME_SET    
1766                         arg->valid |= FATTR_M    
1767         }                                        
1768         if ((ivalid & ATTR_CTIME) && trust_lo    
1769                 arg->valid |= FATTR_CTIME;       
1770                 arg->ctime = iattr->ia_ctime.    
1771                 arg->ctimensec = iattr->ia_ct    
1772         }                                        
1773 }                                                
1774                                                  
1775 /*                                               
1776  * Prevent concurrent writepages on inode        
1777  *                                               
1778  * This is done by adding a negative bias to     
1779  * and waiting for all pending writes to fini    
1780  */                                              
1781 void fuse_set_nowrite(struct inode *inode)       
1782 {                                                
1783         struct fuse_inode *fi = get_fuse_inod    
1784                                                  
1785         BUG_ON(!inode_is_locked(inode));         
1786                                                  
1787         spin_lock(&fi->lock);                    
1788         BUG_ON(fi->writectr < 0);                
1789         fi->writectr += FUSE_NOWRITE;            
1790         spin_unlock(&fi->lock);                  
1791         wait_event(fi->page_waitq, fi->writec    
1792 }                                                
1793                                                  
1794 /*                                               
1795  * Allow writepages on inode                     
1796  *                                               
1797  * Remove the bias from the writecounter and     
1798  * writepages.                                   
1799  */                                              
1800 static void __fuse_release_nowrite(struct ino    
1801 {                                                
1802         struct fuse_inode *fi = get_fuse_inod    
1803                                                  
1804         BUG_ON(fi->writectr != FUSE_NOWRITE);    
1805         fi->writectr = 0;                        
1806         fuse_flush_writepages(inode);            
1807 }                                                
1808                                                  
1809 void fuse_release_nowrite(struct inode *inode    
1810 {                                                
1811         struct fuse_inode *fi = get_fuse_inod    
1812                                                  
1813         spin_lock(&fi->lock);                    
1814         __fuse_release_nowrite(inode);           
1815         spin_unlock(&fi->lock);                  
1816 }                                                
1817                                                  
1818 static void fuse_setattr_fill(struct fuse_con    
1819                               struct inode *i    
1820                               struct fuse_set    
1821                               struct fuse_att    
1822 {                                                
1823         args->opcode = FUSE_SETATTR;             
1824         args->nodeid = get_node_id(inode);       
1825         args->in_numargs = 1;                    
1826         args->in_args[0].size = sizeof(*inarg    
1827         args->in_args[0].value = inarg_p;        
1828         args->out_numargs = 1;                   
1829         args->out_args[0].size = sizeof(*outa    
1830         args->out_args[0].value = outarg_p;      
1831 }                                                
1832                                                  
1833 /*                                               
1834  * Flush inode->i_mtime to the server            
1835  */                                              
1836 int fuse_flush_times(struct inode *inode, str    
1837 {                                                
1838         struct fuse_mount *fm = get_fuse_moun    
1839         FUSE_ARGS(args);                         
1840         struct fuse_setattr_in inarg;            
1841         struct fuse_attr_out outarg;             
1842                                                  
1843         memset(&inarg, 0, sizeof(inarg));        
1844         memset(&outarg, 0, sizeof(outarg));      
1845                                                  
1846         inarg.valid = FATTR_MTIME;               
1847         inarg.mtime = inode_get_mtime_sec(ino    
1848         inarg.mtimensec = inode_get_mtime_nse    
1849         if (fm->fc->minor >= 23) {               
1850                 inarg.valid |= FATTR_CTIME;      
1851                 inarg.ctime = inode_get_ctime    
1852                 inarg.ctimensec = inode_get_c    
1853         }                                        
1854         if (ff) {                                
1855                 inarg.valid |= FATTR_FH;         
1856                 inarg.fh = ff->fh;               
1857         }                                        
1858         fuse_setattr_fill(fm->fc, &args, inod    
1859                                                  
1860         return fuse_simple_request(fm, &args)    
1861 }                                                
1862                                                  
1863 /*                                               
1864  * Set attributes, and at the same time refre    
1865  *                                               
1866  * Truncation is slightly complicated, becaus    
1867  * may fail, in which case we don't want to t    
1868  * vmtruncate() doesn't allow for this case,     
1869  * and the actual truncation by hand.            
1870  */                                              
1871 int fuse_do_setattr(struct dentry *dentry, st    
1872                     struct file *file)           
1873 {                                                
1874         struct inode *inode = d_inode(dentry)    
1875         struct fuse_mount *fm = get_fuse_moun    
1876         struct fuse_conn *fc = fm->fc;           
1877         struct fuse_inode *fi = get_fuse_inod    
1878         struct address_space *mapping = inode    
1879         FUSE_ARGS(args);                         
1880         struct fuse_setattr_in inarg;            
1881         struct fuse_attr_out outarg;             
1882         bool is_truncate = false;                
1883         bool is_wb = fc->writeback_cache && S    
1884         loff_t oldsize;                          
1885         int err;                                 
1886         bool trust_local_cmtime = is_wb;         
1887         bool fault_blocked = false;              
1888                                                  
1889         if (!fc->default_permissions)            
1890                 attr->ia_valid |= ATTR_FORCE;    
1891                                                  
1892         err = setattr_prepare(&nop_mnt_idmap,    
1893         if (err)                                 
1894                 return err;                      
1895                                                  
1896         if (attr->ia_valid & ATTR_SIZE) {        
1897                 if (WARN_ON(!S_ISREG(inode->i    
1898                         return -EIO;             
1899                 is_truncate = true;              
1900         }                                        
1901                                                  
1902         if (FUSE_IS_DAX(inode) && is_truncate    
1903                 filemap_invalidate_lock(mappi    
1904                 fault_blocked = true;            
1905                 err = fuse_dax_break_layouts(    
1906                 if (err) {                       
1907                         filemap_invalidate_un    
1908                         return err;              
1909                 }                                
1910         }                                        
1911                                                  
1912         if (attr->ia_valid & ATTR_OPEN) {        
1913                 /* This is coming from open(.    
1914                 WARN_ON(!(attr->ia_valid & AT    
1915                 WARN_ON(attr->ia_size != 0);     
1916                 if (fc->atomic_o_trunc) {        
1917                         /*                       
1918                          * No need to send re    
1919                          * truncation has alr    
1920                          * need to truncate p    
1921                          */                      
1922                         i_size_write(inode, 0    
1923                         truncate_pagecache(in    
1924                         goto out;                
1925                 }                                
1926                 file = NULL;                     
1927         }                                        
1928                                                  
1929         /* Flush dirty data/metadata before n    
1930         if (is_wb &&                             
1931             attr->ia_valid &                     
1932                         (ATTR_MODE | ATTR_UID    
1933                          ATTR_TIMES_SET)) {      
1934                 err = write_inode_now(inode,     
1935                 if (err)                         
1936                         return err;              
1937                                                  
1938                 fuse_set_nowrite(inode);         
1939                 fuse_release_nowrite(inode);     
1940         }                                        
1941                                                  
1942         if (is_truncate) {                       
1943                 fuse_set_nowrite(inode);         
1944                 set_bit(FUSE_I_SIZE_UNSTABLE,    
1945                 if (trust_local_cmtime && att    
1946                         attr->ia_valid |= ATT    
1947         }                                        
1948                                                  
1949         memset(&inarg, 0, sizeof(inarg));        
1950         memset(&outarg, 0, sizeof(outarg));      
1951         iattr_to_fattr(fc, attr, &inarg, trus    
1952         if (file) {                              
1953                 struct fuse_file *ff = file->    
1954                 inarg.valid |= FATTR_FH;         
1955                 inarg.fh = ff->fh;               
1956         }                                        
1957                                                  
1958         /* Kill suid/sgid for non-directory c    
1959         if (fc->handle_killpriv_v2 && !S_ISDI    
1960             attr->ia_valid & (ATTR_UID | ATTR    
1961                 inarg.valid |= FATTR_KILL_SUI    
1962                                                  
1963         if (attr->ia_valid & ATTR_SIZE) {        
1964                 /* For mandatory locking in t    
1965                 inarg.valid |= FATTR_LOCKOWNE    
1966                 inarg.lock_owner = fuse_lock_    
1967                                                  
1968                 /* Kill suid/sgid for truncat    
1969                 if (fc->handle_killpriv_v2 &&    
1970                         inarg.valid |= FATTR_    
1971         }                                        
1972         fuse_setattr_fill(fc, &args, inode, &    
1973         err = fuse_simple_request(fm, &args);    
1974         if (err) {                               
1975                 if (err == -EINTR)               
1976                         fuse_invalidate_attr(    
1977                 goto error;                      
1978         }                                        
1979                                                  
1980         if (fuse_invalid_attr(&outarg.attr) |    
1981             inode_wrong_type(inode, outarg.at    
1982                 fuse_make_bad(inode);            
1983                 err = -EIO;                      
1984                 goto error;                      
1985         }                                        
1986                                                  
1987         spin_lock(&fi->lock);                    
1988         /* the kernel maintains i_mtime local    
1989         if (trust_local_cmtime) {                
1990                 if (attr->ia_valid & ATTR_MTI    
1991                         inode_set_mtime_to_ts    
1992                 if (attr->ia_valid & ATTR_CTI    
1993                         inode_set_ctime_to_ts    
1994                 /* FIXME: clear I_DIRTY_SYNC?    
1995         }                                        
1996                                                  
1997         fuse_change_attributes_common(inode,     
1998                                       ATTR_TI    
1999                                       fuse_ge    
2000         oldsize = inode->i_size;                 
2001         /* see the comment in fuse_change_att    
2002         if (!is_wb || is_truncate)               
2003                 i_size_write(inode, outarg.at    
2004                                                  
2005         if (is_truncate) {                       
2006                 /* NOTE: this may release/rea    
2007                 __fuse_release_nowrite(inode)    
2008         }                                        
2009         spin_unlock(&fi->lock);                  
2010                                                  
2011         /*                                       
2012          * Only call invalidate_inode_pages2(    
2013          * FUSE_NOWRITE, otherwise fuse_laund    
2014          */                                      
2015         if ((is_truncate || !is_wb) &&           
2016             S_ISREG(inode->i_mode) && oldsize    
2017                 truncate_pagecache(inode, out    
2018                 invalidate_inode_pages2(mappi    
2019         }                                        
2020                                                  
2021         clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->    
2022 out:                                             
2023         if (fault_blocked)                       
2024                 filemap_invalidate_unlock(map    
2025                                                  
2026         return 0;                                
2027                                                  
2028 error:                                           
2029         if (is_truncate)                         
2030                 fuse_release_nowrite(inode);     
2031                                                  
2032         clear_bit(FUSE_I_SIZE_UNSTABLE, &fi->    
2033                                                  
2034         if (fault_blocked)                       
2035                 filemap_invalidate_unlock(map    
2036         return err;                              
2037 }                                                
2038                                                  
2039 static int fuse_setattr(struct mnt_idmap *idm    
2040                         struct iattr *attr)      
2041 {                                                
2042         struct inode *inode = d_inode(entry);    
2043         struct fuse_conn *fc = get_fuse_conn(    
2044         struct file *file = (attr->ia_valid &    
2045         int ret;                                 
2046                                                  
2047         if (fuse_is_bad(inode))                  
2048                 return -EIO;                     
2049                                                  
2050         if (!fuse_allow_current_process(get_f    
2051                 return -EACCES;                  
2052                                                  
2053         if (attr->ia_valid & (ATTR_KILL_SUID     
2054                 attr->ia_valid &= ~(ATTR_KILL    
2055                                     ATTR_MODE    
2056                                                  
2057                 /*                               
2058                  * The only sane way to relia    
2059                  * the userspace filesystem      
2060                  *                               
2061                  * This should be done on wri    
2062                  */                              
2063                 if (!fc->handle_killpriv && !    
2064                         /*                       
2065                          * ia_mode calculatio    
2066                          * Refresh and recalc    
2067                          */                      
2068                         ret = fuse_do_getattr    
2069                         if (ret)                 
2070                                 return ret;      
2071                                                  
2072                         attr->ia_mode = inode    
2073                         if (inode->i_mode & S    
2074                                 attr->ia_vali    
2075                                 attr->ia_mode    
2076                         }                        
2077                         if ((inode->i_mode &     
2078                                 attr->ia_vali    
2079                                 attr->ia_mode    
2080                         }                        
2081                 }                                
2082         }                                        
2083         if (!attr->ia_valid)                     
2084                 return 0;                        
2085                                                  
2086         ret = fuse_do_setattr(entry, attr, fi    
2087         if (!ret) {                              
2088                 /*                               
2089                  * If filesystem supports acl    
2090                  * the filesystem, so forget     
2091                  */                              
2092                 if (fc->posix_acl)               
2093                         forget_all_cached_acl    
2094                                                  
2095                 /* Directory mode changed, ma    
2096                 if (d_is_dir(entry) && (attr-    
2097                         fuse_invalidate_entry    
2098         }                                        
2099         return ret;                              
2100 }                                                
2101                                                  
2102 static int fuse_getattr(struct mnt_idmap *idm    
2103                         const struct path *pa    
2104                         u32 request_mask, uns    
2105 {                                                
2106         struct inode *inode = d_inode(path->d    
2107         struct fuse_conn *fc = get_fuse_conn(    
2108                                                  
2109         if (fuse_is_bad(inode))                  
2110                 return -EIO;                     
2111                                                  
2112         if (!fuse_allow_current_process(fc))     
2113                 if (!request_mask) {             
2114                         /*                       
2115                          * If user explicitly    
2116                          * error out, but ret    
2117                          */                      
2118                         stat->result_mask = 0    
2119                         stat->dev = inode->i_    
2120                         return 0;                
2121                 }                                
2122                 return -EACCES;                  
2123         }                                        
2124                                                  
2125         return fuse_update_get_attr(inode, NU    
2126 }                                                
2127                                                  
2128 static const struct inode_operations fuse_dir    
2129         .lookup         = fuse_lookup,           
2130         .mkdir          = fuse_mkdir,            
2131         .symlink        = fuse_symlink,          
2132         .unlink         = fuse_unlink,           
2133         .rmdir          = fuse_rmdir,            
2134         .rename         = fuse_rename2,          
2135         .link           = fuse_link,             
2136         .setattr        = fuse_setattr,          
2137         .create         = fuse_create,           
2138         .atomic_open    = fuse_atomic_open,      
2139         .tmpfile        = fuse_tmpfile,          
2140         .mknod          = fuse_mknod,            
2141         .permission     = fuse_permission,       
2142         .getattr        = fuse_getattr,          
2143         .listxattr      = fuse_listxattr,        
2144         .get_inode_acl  = fuse_get_inode_acl,    
2145         .get_acl        = fuse_get_acl,          
2146         .set_acl        = fuse_set_acl,          
2147         .fileattr_get   = fuse_fileattr_get,     
2148         .fileattr_set   = fuse_fileattr_set,     
2149 };                                               
2150                                                  
2151 static const struct file_operations fuse_dir_    
2152         .llseek         = generic_file_llseek    
2153         .read           = generic_read_dir,      
2154         .iterate_shared = fuse_readdir,          
2155         .open           = fuse_dir_open,         
2156         .release        = fuse_dir_release,      
2157         .fsync          = fuse_dir_fsync,        
2158         .unlocked_ioctl = fuse_dir_ioctl,        
2159         .compat_ioctl   = fuse_dir_compat_ioc    
2160 };                                               
2161                                                  
2162 static const struct inode_operations fuse_com    
2163         .setattr        = fuse_setattr,          
2164         .permission     = fuse_permission,       
2165         .getattr        = fuse_getattr,          
2166         .listxattr      = fuse_listxattr,        
2167         .get_inode_acl  = fuse_get_inode_acl,    
2168         .get_acl        = fuse_get_acl,          
2169         .set_acl        = fuse_set_acl,          
2170         .fileattr_get   = fuse_fileattr_get,     
2171         .fileattr_set   = fuse_fileattr_set,     
2172 };                                               
2173                                                  
2174 static const struct inode_operations fuse_sym    
2175         .setattr        = fuse_setattr,          
2176         .get_link       = fuse_get_link,         
2177         .getattr        = fuse_getattr,          
2178         .listxattr      = fuse_listxattr,        
2179 };                                               
2180                                                  
2181 void fuse_init_common(struct inode *inode)       
2182 {                                                
2183         inode->i_op = &fuse_common_inode_oper    
2184 }                                                
2185                                                  
2186 void fuse_init_dir(struct inode *inode)          
2187 {                                                
2188         struct fuse_inode *fi = get_fuse_inod    
2189                                                  
2190         inode->i_op = &fuse_dir_inode_operati    
2191         inode->i_fop = &fuse_dir_operations;     
2192                                                  
2193         spin_lock_init(&fi->rdc.lock);           
2194         fi->rdc.cached = false;                  
2195         fi->rdc.size = 0;                        
2196         fi->rdc.pos = 0;                         
2197         fi->rdc.version = 0;                     
2198 }                                                
2199                                                  
2200 static int fuse_symlink_read_folio(struct fil    
2201 {                                                
2202         int err = fuse_readlink_page(folio->m    
2203                                                  
2204         if (!err)                                
2205                 folio_mark_uptodate(folio);      
2206                                                  
2207         folio_unlock(folio);                     
2208                                                  
2209         return err;                              
2210 }                                                
2211                                                  
2212 static const struct address_space_operations     
2213         .read_folio     = fuse_symlink_read_f    
2214 };                                               
2215                                                  
2216 void fuse_init_symlink(struct inode *inode)      
2217 {                                                
2218         inode->i_op = &fuse_symlink_inode_ope    
2219         inode->i_data.a_ops = &fuse_symlink_a    
2220         inode_nohighmem(inode);                  
2221 }                                                
2222                                                  

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