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

TOMOYO Linux Cross Reference
Linux/fs/ocfs2/dcache.c

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

Diff markup

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


** Warning: Cannot open xref database.

  1 // SPDX-License-Identifier: GPL-2.0-or-later        1 
  2 /*                                                
  3  * dcache.c                                       
  4  *                                                
  5  * dentry cache handling code                     
  6  *                                                
  7  * Copyright (C) 2002, 2004 Oracle.  All right    
  8  */                                               
  9                                                   
 10 #include <linux/fs.h>                             
 11 #include <linux/types.h>                          
 12 #include <linux/slab.h>                           
 13 #include <linux/namei.h>                          
 14                                                   
 15 #include <cluster/masklog.h>                      
 16                                                   
 17 #include "ocfs2.h"                                
 18                                                   
 19 #include "alloc.h"                                
 20 #include "dcache.h"                               
 21 #include "dlmglue.h"                              
 22 #include "file.h"                                 
 23 #include "inode.h"                                
 24 #include "ocfs2_trace.h"                          
 25                                                   
 26 void ocfs2_dentry_attach_gen(struct dentry *de    
 27 {                                                 
 28         unsigned long gen =                       
 29                 OCFS2_I(d_inode(dentry->d_pare    
 30         BUG_ON(d_inode(dentry));                  
 31         dentry->d_fsdata = (void *)gen;           
 32 }                                                 
 33                                                   
 34                                                   
 35 static int ocfs2_dentry_revalidate(struct dent    
 36 {                                                 
 37         struct inode *inode;                      
 38         int ret = 0;    /* if all else fails,     
 39         struct ocfs2_super *osb;                  
 40                                                   
 41         if (flags & LOOKUP_RCU)                   
 42                 return -ECHILD;                   
 43                                                   
 44         inode = d_inode(dentry);                  
 45         osb = OCFS2_SB(dentry->d_sb);             
 46                                                   
 47         trace_ocfs2_dentry_revalidate(dentry,     
 48                                       dentry->    
 49                                                   
 50         /* For a negative dentry -                
 51          * check the generation number of the     
 52          * one stored in the inode.               
 53          */                                       
 54         if (inode == NULL) {                      
 55                 unsigned long gen = (unsigned     
 56                 unsigned long pgen;               
 57                 spin_lock(&dentry->d_lock);       
 58                 pgen = OCFS2_I(d_inode(dentry-    
 59                 spin_unlock(&dentry->d_lock);     
 60                 trace_ocfs2_dentry_revalidate_    
 61                                                   
 62                                                   
 63                 if (gen != pgen)                  
 64                         goto bail;                
 65                 goto valid;                       
 66         }                                         
 67                                                   
 68         BUG_ON(!osb);                             
 69                                                   
 70         if (inode == osb->root_inode || is_bad    
 71                 goto bail;                        
 72                                                   
 73         spin_lock(&OCFS2_I(inode)->ip_lock);      
 74         /* did we or someone else delete this     
 75         if (OCFS2_I(inode)->ip_flags & OCFS2_I    
 76                 spin_unlock(&OCFS2_I(inode)->i    
 77                 trace_ocfs2_dentry_revalidate_    
 78                                 (unsigned long    
 79                 goto bail;                        
 80         }                                         
 81         spin_unlock(&OCFS2_I(inode)->ip_lock);    
 82                                                   
 83         /*                                        
 84          * We don't need a cluster lock to tes    
 85          * inode nlink hits zero, it never goe    
 86          */                                       
 87         if (inode->i_nlink == 0) {                
 88                 trace_ocfs2_dentry_revalidate_    
 89                         (unsigned long long)OC    
 90                         S_ISDIR(inode->i_mode)    
 91                 goto bail;                        
 92         }                                         
 93                                                   
 94         /*                                        
 95          * If the last lookup failed to create    
 96          * redo it.                               
 97          */                                       
 98         if (!dentry->d_fsdata) {                  
 99                 trace_ocfs2_dentry_revalidate_    
100                                 (unsigned long    
101                 goto bail;                        
102         }                                         
103                                                   
104 valid:                                            
105         ret = 1;                                  
106                                                   
107 bail:                                             
108         trace_ocfs2_dentry_revalidate_ret(ret)    
109         return ret;                               
110 }                                                 
111                                                   
112 static int ocfs2_match_dentry(struct dentry *d    
113                               u64 parent_blkno    
114                               int skip_unhashe    
115 {                                                 
116         struct inode *parent;                     
117                                                   
118         /*                                        
119          * ocfs2_lookup() does a d_splice_alia    
120          * to the lock data, so we skip those     
121          * ocfs2_dentry_attach_lock() will get    
122          * back.                                  
123          */                                       
124         if (!dentry->d_fsdata)                    
125                 return 0;                         
126                                                   
127         if (skip_unhashed && d_unhashed(dentry    
128                 return 0;                         
129                                                   
130         parent = d_inode(dentry->d_parent);       
131         /* Name is in a different directory. *    
132         if (OCFS2_I(parent)->ip_blkno != paren    
133                 return 0;                         
134                                                   
135         return 1;                                 
136 }                                                 
137                                                   
138 /*                                                
139  * Walk the inode alias list, and find a dentr    
140  * parent. ocfs2_dentry_attach_lock() wants to    
141  * is looking for a dentry_lock reference. The    
142  * looking to unhash aliases, so we allow it t    
143  * have that property.                            
144  */                                               
145 struct dentry *ocfs2_find_local_alias(struct i    
146                                       u64 pare    
147                                       int skip    
148 {                                                 
149         struct dentry *dentry;                    
150                                                   
151         spin_lock(&inode->i_lock);                
152         hlist_for_each_entry(dentry, &inode->i    
153                 spin_lock(&dentry->d_lock);       
154                 if (ocfs2_match_dentry(dentry,    
155                         trace_ocfs2_find_local    
156                                                   
157                                                   
158                         dget_dlock(dentry);       
159                         spin_unlock(&dentry->d    
160                         spin_unlock(&inode->i_    
161                         return dentry;            
162                 }                                 
163                 spin_unlock(&dentry->d_lock);     
164         }                                         
165         spin_unlock(&inode->i_lock);              
166         return NULL;                              
167 }                                                 
168                                                   
169 DEFINE_SPINLOCK(dentry_attach_lock);              
170                                                   
171 /*                                                
172  * Attach this dentry to a cluster lock.          
173  *                                                
174  * Dentry locks cover all links in a given dir    
175  * inode. We do this so that ocfs2 can build a    
176  * nodes in the cluster can agree on at all ti    
177  * in the cluster lock won't work due to size     
178  * links inside of a directory is a good compr    
179  * allows us to use the parent directory lock     
180  * operations.                                    
181  *                                                
182  * Call this function with the parent dir sema    
183  * cluster lock held.                             
184  *                                                
185  * The dir semaphore will protect us from havi    
186  * concurrent processes on our node trying to     
187  * same time.                                     
188  *                                                
189  * The dir cluster lock (held at either PR or     
190  * from unlink and rename on other nodes.         
191  *                                                
192  * A dput() can happen asynchronously due to p    
193  * attaching and detaching the dentry lock wit    
194  * dentry_attach_lock.                            
195  *                                                
196  * A node which has done lookup on a name reta    
197  * lock until final dput. If the user requests    
198  * the protected read is upgraded to an exclus    
199  * who have seen the dentry will then be infor    
200  * downgrade their lock, which will involve d_    
201  * dentry. This happens in ocfs2_dentry_conver    
202  */                                               
203 int ocfs2_dentry_attach_lock(struct dentry *de    
204                              struct inode *ino    
205                              u64 parent_blkno)    
206 {                                                 
207         int ret;                                  
208         struct dentry *alias;                     
209         struct ocfs2_dentry_lock *dl = dentry-    
210                                                   
211         trace_ocfs2_dentry_attach_lock(dentry-    
212                                        (unsign    
213                                                   
214         /*                                        
215          * Negative dentry. We ignore these fo    
216          *                                        
217          * XXX: Could we can improve ocfs2_den    
218          * tracking these?                        
219          */                                       
220         if (!inode)                               
221                 return 0;                         
222                                                   
223         if (d_really_is_negative(dentry) && de    
224                 /* Converting a negative dentr    
225                    Clear dentry->d_fsdata */      
226                 dentry->d_fsdata = dl = NULL;     
227         }                                         
228                                                   
229         if (dl) {                                 
230                 mlog_bug_on_msg(dl->dl_parent_    
231                                 " \"%pd\": old    
232                                 dentry,           
233                                 (unsigned long    
234                                 (unsigned long    
235                 return 0;                         
236         }                                         
237                                                   
238         alias = ocfs2_find_local_alias(inode,     
239         if (alias) {                              
240                 /*                                
241                  * Great, an alias exists, whi    
242                  * dentry lock already. We can    
243                  * the alias and add it to the    
244                  *                                
245                  * We're depending here on the    
246                  * was found and exists in the    
247                  * a reference to the dentry_l    
248                  * race creates. Final dput()     
249                  * since we have it pinned, so    
250                  */                               
251                 dl = alias->d_fsdata;             
252                 mlog_bug_on_msg(!dl, "parent %    
253                                 (unsigned long    
254                                 (unsigned long    
255                                                   
256                 mlog_bug_on_msg(dl->dl_parent_    
257                                 " \"%pd\": old    
258                                 dentry,           
259                                 (unsigned long    
260                                 (unsigned long    
261                                                   
262                 trace_ocfs2_dentry_attach_lock    
263                                 (unsigned long    
264                                 (unsigned long    
265                                                   
266                 goto out_attach;                  
267         }                                         
268                                                   
269         /*                                        
270          * There are no other aliases             
271          */                                       
272         dl = kmalloc(sizeof(*dl), GFP_NOFS);      
273         if (!dl) {                                
274                 ret = -ENOMEM;                    
275                 mlog_errno(ret);                  
276                 return ret;                       
277         }                                         
278                                                   
279         dl->dl_count = 0;                         
280         /*                                        
281          * Does this have to happen below, for    
282          * the struct inode gets blown away by    
283          */                                       
284         dl->dl_inode = igrab(inode);              
285         dl->dl_parent_blkno = parent_blkno;       
286         ocfs2_dentry_lock_res_init(dl, parent_    
287                                                   
288 out_attach:                                       
289         spin_lock(&dentry_attach_lock);           
290         if (unlikely(dentry->d_fsdata && !alia    
291                 /* d_fsdata is set by a racing    
292                  * the same thing as this thre    
293                  * thread going ahead and we r    
294                  */                               
295                 spin_unlock(&dentry_attach_loc    
296                 iput(dl->dl_inode);               
297                 ocfs2_lock_res_free(&dl->dl_lo    
298                 kfree(dl);                        
299                 return 0;                         
300         }                                         
301                                                   
302         dentry->d_fsdata = dl;                    
303         dl->dl_count++;                           
304         spin_unlock(&dentry_attach_lock);         
305                                                   
306         /*                                        
307          * This actually gets us our PRMODE le    
308          * we'll have a notification if one of    
309          * destroyed on another node.             
310          */                                       
311         ret = ocfs2_dentry_lock(dentry, 0);       
312         if (!ret)                                 
313                 ocfs2_dentry_unlock(dentry, 0)    
314         else                                      
315                 mlog_errno(ret);                  
316                                                   
317         /*                                        
318          * In case of error, manually free the    
319          * We need to do this because error he    
320          * which means iput() will not be call    
321          */                                       
322         if (ret < 0 && !alias) {                  
323                 ocfs2_lock_res_free(&dl->dl_lo    
324                 BUG_ON(dl->dl_count != 1);        
325                 spin_lock(&dentry_attach_lock)    
326                 dentry->d_fsdata = NULL;          
327                 spin_unlock(&dentry_attach_loc    
328                 kfree(dl);                        
329                 iput(inode);                      
330         }                                         
331                                                   
332         dput(alias);                              
333                                                   
334         return ret;                               
335 }                                                 
336                                                   
337 /*                                                
338  * ocfs2_dentry_iput() and friends.               
339  *                                                
340  * At this point, our particular dentry is det    
341  * alias list, so there's no way that the lock    
342  *                                                
343  * The interesting stuff happens when we deter    
344  * to go away because this is the last subdir     
345  * system. This function needs to handle a cou    
346  *                                                
347  * 1) Synchronizing lock shutdown with the dow    
348  *    is already handled for us via the lockre    
349  *    called in ocfs2_release_dentry_lock()       
350  *                                                
351  * 2) A race may occur when we're doing our lo    
352  *    another process wants to create a new de    
353  *    let them race, which means that for a ve    
354  *    node might have two locks on a lock reso    
355  *    problem though because one of them is in    
356  *    thrown out.                                 
357  */                                               
358 static void ocfs2_drop_dentry_lock(struct ocfs    
359                                    struct ocfs    
360 {                                                 
361         iput(dl->dl_inode);                       
362         ocfs2_simple_drop_lockres(osb, &dl->dl    
363         ocfs2_lock_res_free(&dl->dl_lockres);     
364         kfree(dl);                                
365 }                                                 
366                                                   
367 void ocfs2_dentry_lock_put(struct ocfs2_super     
368                            struct ocfs2_dentry    
369 {                                                 
370         int unlock = 0;                           
371                                                   
372         BUG_ON(dl->dl_count == 0);                
373                                                   
374         spin_lock(&dentry_attach_lock);           
375         dl->dl_count--;                           
376         unlock = !dl->dl_count;                   
377         spin_unlock(&dentry_attach_lock);         
378                                                   
379         if (unlock)                               
380                 ocfs2_drop_dentry_lock(osb, dl    
381 }                                                 
382                                                   
383 static void ocfs2_dentry_iput(struct dentry *d    
384 {                                                 
385         struct ocfs2_dentry_lock *dl = dentry-    
386                                                   
387         if (!dl) {                                
388                 /*                                
389                  * No dentry lock is ok if we'    
390                  * unhashed.                      
391                  */                               
392                 if (!(dentry->d_flags & DCACHE    
393                     !d_unhashed(dentry)) {        
394                         unsigned long long ino    
395                         if (inode)                
396                                 ino = (unsigne    
397                         mlog(ML_ERROR, "Dentry    
398                              "inode: %llu, d_f    
399                              ino, dentry->d_fl    
400                 }                                 
401                                                   
402                 goto out;                         
403         }                                         
404                                                   
405         mlog_bug_on_msg(dl->dl_count == 0, "de    
406                         dentry, dl->dl_count);    
407                                                   
408         ocfs2_dentry_lock_put(OCFS2_SB(dentry-    
409                                                   
410 out:                                              
411         iput(inode);                              
412 }                                                 
413                                                   
414 /*                                                
415  * d_move(), but keep the locks in sync.          
416  *                                                
417  * When we are done, "dentry" will have the pa    
418  * "target", which will be thrown away.           
419  *                                                
420  * We manually update the lock of "dentry" if     
421  *                                                
422  * "target" doesn't have it's dentry lock touc    
423  * dput() to handle this for us.                  
424  *                                                
425  * This is called during ocfs2_rename(), while    
426  * directory locks. The dentries have already     
427  * nodes via ocfs2_remote_dentry_delete().        
428  *                                                
429  * Normally, the VFS handles the d_move() for     
430  * the ->rename() callback. OCFS2 wants to han    
431  * the new lock can be created atomically with    
432  */                                               
433 void ocfs2_dentry_move(struct dentry *dentry,     
434                        struct inode *old_dir,     
435 {                                                 
436         int ret;                                  
437         struct ocfs2_super *osb = OCFS2_SB(old    
438         struct inode *inode = d_inode(dentry);    
439                                                   
440         /*                                        
441          * Move within the same directory, so     
442          * change.                                
443          *                                        
444          * XXX: Is there any advantage to drop    
445          */                                       
446         if (old_dir == new_dir)                   
447                 goto out_move;                    
448                                                   
449         ocfs2_dentry_lock_put(osb, dentry->d_f    
450                                                   
451         dentry->d_fsdata = NULL;                  
452         ret = ocfs2_dentry_attach_lock(dentry,    
453         if (ret)                                  
454                 mlog_errno(ret);                  
455                                                   
456 out_move:                                         
457         d_move(dentry, target);                   
458 }                                                 
459                                                   
460 const struct dentry_operations ocfs2_dentry_op    
461         .d_revalidate           = ocfs2_dentry    
462         .d_iput                 = ocfs2_dentry    
463 };                                                
464                                                   

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