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

TOMOYO Linux Cross Reference
Linux/fs/ufs/inode.c

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ 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/ufs/inode.c (Version linux-6.11-rc3) and /fs/ufs/inode.c (Version policy-sample)


  1 // SPDX-License-Identifier: GPL-2.0                 1 
  2 /*                                                
  3  *  linux/fs/ufs/inode.c                          
  4  *                                                
  5  * Copyright (C) 1998                             
  6  * Daniel Pirkl <daniel.pirkl@email.cz>           
  7  * Charles University, Faculty of Mathematics     
  8  *                                                
  9  *  from                                          
 10  *                                                
 11  *  linux/fs/ext2/inode.c                         
 12  *                                                
 13  * Copyright (C) 1992, 1993, 1994, 1995           
 14  * Remy Card (card@masi.ibp.fr)                   
 15  * Laboratoire MASI - Institut Blaise Pascal      
 16  * Universite Pierre et Marie Curie (Paris VI)    
 17  *                                                
 18  *  from                                          
 19  *                                                
 20  *  linux/fs/minix/inode.c                        
 21  *                                                
 22  *  Copyright (C) 1991, 1992  Linus Torvalds      
 23  *                                                
 24  *  Goal-directed block allocation by Stephen     
 25  *  Big-endian to little-endian byte-swapping/    
 26  *        David S. Miller (davem@caip.rutgers.    
 27  */                                               
 28                                                   
 29 #include <linux/uaccess.h>                        
 30                                                   
 31 #include <linux/errno.h>                          
 32 #include <linux/fs.h>                             
 33 #include <linux/time.h>                           
 34 #include <linux/stat.h>                           
 35 #include <linux/string.h>                         
 36 #include <linux/mm.h>                             
 37 #include <linux/buffer_head.h>                    
 38 #include <linux/mpage.h>                          
 39 #include <linux/writeback.h>                      
 40 #include <linux/iversion.h>                       
 41                                                   
 42 #include "ufs_fs.h"                               
 43 #include "ufs.h"                                  
 44 #include "swab.h"                                 
 45 #include "util.h"                                 
 46                                                   
 47 static int ufs_block_to_path(struct inode *ino    
 48 {                                                 
 49         struct ufs_sb_private_info *uspi = UFS    
 50         int ptrs = uspi->s_apb;                   
 51         int ptrs_bits = uspi->s_apbshift;         
 52         const long direct_blocks = UFS_NDADDR,    
 53                 indirect_blocks = ptrs,           
 54                 double_blocks = (1 << (ptrs_bi    
 55         int n = 0;                                
 56                                                   
 57                                                   
 58         UFSD("ptrs=uspi->s_apb = %d,double_blo    
 59         if (i_block < direct_blocks) {            
 60                 offsets[n++] = i_block;           
 61         } else if ((i_block -= direct_blocks)     
 62                 offsets[n++] = UFS_IND_BLOCK;     
 63                 offsets[n++] = i_block;           
 64         } else if ((i_block -= indirect_blocks    
 65                 offsets[n++] = UFS_DIND_BLOCK;    
 66                 offsets[n++] = i_block >> ptrs    
 67                 offsets[n++] = i_block & (ptrs    
 68         } else if (((i_block -= double_blocks)    
 69                 offsets[n++] = UFS_TIND_BLOCK;    
 70                 offsets[n++] = i_block >> (ptr    
 71                 offsets[n++] = (i_block >> ptr    
 72                 offsets[n++] = i_block & (ptrs    
 73         } else {                                  
 74                 ufs_warning(inode->i_sb, "ufs_    
 75         }                                         
 76         return n;                                 
 77 }                                                 
 78                                                   
 79 typedef struct {                                  
 80         void    *p;                               
 81         union {                                   
 82                 __fs32  key32;                    
 83                 __fs64  key64;                    
 84         };                                        
 85         struct buffer_head *bh;                   
 86 } Indirect;                                       
 87                                                   
 88 static inline int grow_chain32(struct ufs_inod    
 89                                struct buffer_h    
 90                                Indirect *from,    
 91 {                                                 
 92         Indirect *p;                              
 93         unsigned seq;                             
 94         to->bh = bh;                              
 95         do {                                      
 96                 seq = read_seqbegin(&ufsi->met    
 97                 to->key32 = *(__fs32 *)(to->p     
 98                 for (p = from; p <= to && p->k    
 99                         ;                         
100         } while (read_seqretry(&ufsi->meta_loc    
101         return (p > to);                          
102 }                                                 
103                                                   
104 static inline int grow_chain64(struct ufs_inod    
105                                struct buffer_h    
106                                Indirect *from,    
107 {                                                 
108         Indirect *p;                              
109         unsigned seq;                             
110         to->bh = bh;                              
111         do {                                      
112                 seq = read_seqbegin(&ufsi->met    
113                 to->key64 = *(__fs64 *)(to->p     
114                 for (p = from; p <= to && p->k    
115                         ;                         
116         } while (read_seqretry(&ufsi->meta_loc    
117         return (p > to);                          
118 }                                                 
119                                                   
120 /*                                                
121  * Returns the location of the fragment from      
122  * the beginning of the filesystem.               
123  */                                               
124                                                   
125 static u64 ufs_frag_map(struct inode *inode, u    
126 {                                                 
127         struct ufs_inode_info *ufsi = UFS_I(in    
128         struct super_block *sb = inode->i_sb;     
129         struct ufs_sb_private_info *uspi = UFS    
130         u64 mask = (u64) uspi->s_apbmask>>uspi    
131         int shift = uspi->s_apbshift-uspi->s_f    
132         Indirect chain[4], *q = chain;            
133         unsigned *p;                              
134         unsigned flags = UFS_SB(sb)->s_flags;     
135         u64 res = 0;                              
136                                                   
137         UFSD(": uspi->s_fpbshift = %d ,uspi->s    
138                 uspi->s_fpbshift, uspi->s_apbm    
139                 (unsigned long long)mask);        
140                                                   
141         if (depth == 0)                           
142                 goto no_block;                    
143                                                   
144 again:                                            
145         p = offsets;                              
146                                                   
147         if ((flags & UFS_TYPE_MASK) == UFS_TYP    
148                 goto ufs2;                        
149                                                   
150         if (!grow_chain32(ufsi, NULL, &ufsi->i    
151                 goto changed;                     
152         if (!q->key32)                            
153                 goto no_block;                    
154         while (--depth) {                         
155                 __fs32 *ptr;                      
156                 struct buffer_head *bh;           
157                 unsigned n = *p++;                
158                                                   
159                 bh = sb_bread(sb, uspi->s_sbba    
160                                   fs32_to_cpu(    
161                 if (!bh)                          
162                         goto no_block;            
163                 ptr = (__fs32 *)bh->b_data + (    
164                 if (!grow_chain32(ufsi, bh, pt    
165                         goto changed;             
166                 if (!q->key32)                    
167                         goto no_block;            
168         }                                         
169         res = fs32_to_cpu(sb, q->key32);          
170         goto found;                               
171                                                   
172 ufs2:                                             
173         if (!grow_chain64(ufsi, NULL, &ufsi->i    
174                 goto changed;                     
175         if (!q->key64)                            
176                 goto no_block;                    
177                                                   
178         while (--depth) {                         
179                 __fs64 *ptr;                      
180                 struct buffer_head *bh;           
181                 unsigned n = *p++;                
182                                                   
183                 bh = sb_bread(sb, uspi->s_sbba    
184                                   fs64_to_cpu(    
185                 if (!bh)                          
186                         goto no_block;            
187                 ptr = (__fs64 *)bh->b_data + (    
188                 if (!grow_chain64(ufsi, bh, pt    
189                         goto changed;             
190                 if (!q->key64)                    
191                         goto no_block;            
192         }                                         
193         res = fs64_to_cpu(sb, q->key64);          
194 found:                                            
195         res += uspi->s_sbbase;                    
196 no_block:                                         
197         while (q > chain) {                       
198                 brelse(q->bh);                    
199                 q--;                              
200         }                                         
201         return res;                               
202                                                   
203 changed:                                          
204         while (q > chain) {                       
205                 brelse(q->bh);                    
206                 q--;                              
207         }                                         
208         goto again;                               
209 }                                                 
210                                                   
211 /*                                                
212  * Unpacking tails: we have a file with partia    
213  * we had been asked to extend it.  If the fra    
214  * is within the same block, we need to extend    
215  * that fragment.  Otherwise the tail is exten    
216  *                                                
217  * Note that we might need to create a _new_ t    
218  * be handled elsewhere; this is strictly for     
219  * ones.                                          
220  */                                               
221 static bool                                       
222 ufs_extend_tail(struct inode *inode, u64 write    
223                   int *err, struct page *locke    
224 {                                                 
225         struct ufs_inode_info *ufsi = UFS_I(in    
226         struct super_block *sb = inode->i_sb;     
227         struct ufs_sb_private_info *uspi = UFS    
228         unsigned lastfrag = ufsi->i_lastfrag;     
229         unsigned block = ufs_fragstoblks(lastf    
230         unsigned new_size;                        
231         void *p;                                  
232         u64 tmp;                                  
233                                                   
234         if (writes_to < (lastfrag | uspi->s_fp    
235                 new_size = (writes_to & uspi->    
236         else                                      
237                 new_size = uspi->s_fpb;           
238                                                   
239         p = ufs_get_direct_data_ptr(uspi, ufsi    
240         tmp = ufs_new_fragments(inode, p, last    
241                                 new_size - (la    
242                                 locked_page);     
243         return tmp != 0;                          
244 }                                                 
245                                                   
246 /**                                               
247  * ufs_inode_getfrag() - allocate new fragment    
248  * @inode: pointer to inode                       
249  * @index: number of block pointer within the     
250  * @new_fragment: number of new allocated frag    
251  * @err: we set it if something wrong             
252  * @new: we set it if we allocate new block       
253  * @locked_page: for ufs_new_fragments()          
254  */                                               
255 static u64                                        
256 ufs_inode_getfrag(struct inode *inode, unsigne    
257                   sector_t new_fragment, int *    
258                   int *new, struct page *locke    
259 {                                                 
260         struct ufs_inode_info *ufsi = UFS_I(in    
261         struct super_block *sb = inode->i_sb;     
262         struct ufs_sb_private_info *uspi = UFS    
263         u64 tmp, goal, lastfrag;                  
264         unsigned nfrags = uspi->s_fpb;            
265         void *p;                                  
266                                                   
267         /* TODO : to be done for write support    
268         if ( (flags & UFS_TYPE_MASK) == UFS_TY    
269              goto ufs2;                           
270          */                                       
271                                                   
272         p = ufs_get_direct_data_ptr(uspi, ufsi    
273         tmp = ufs_data_ptr_to_cpu(sb, p);         
274         if (tmp)                                  
275                 goto out;                         
276                                                   
277         lastfrag = ufsi->i_lastfrag;              
278                                                   
279         /* will that be a new tail? */            
280         if (new_fragment < UFS_NDIR_FRAGMENT &    
281                 nfrags = (new_fragment & uspi-    
282                                                   
283         goal = 0;                                 
284         if (index) {                              
285                 goal = ufs_data_ptr_to_cpu(sb,    
286                                  ufs_get_direc    
287                 if (goal)                         
288                         goal += uspi->s_fpb;      
289         }                                         
290         tmp = ufs_new_fragments(inode, p, ufs_    
291                                 goal, nfrags,     
292                                                   
293         if (!tmp) {                               
294                 *err = -ENOSPC;                   
295                 return 0;                         
296         }                                         
297                                                   
298         if (new)                                  
299                 *new = 1;                         
300         inode_set_ctime_current(inode);           
301         if (IS_SYNC(inode))                       
302                 ufs_sync_inode (inode);           
303         mark_inode_dirty(inode);                  
304 out:                                              
305         return tmp + uspi->s_sbbase;              
306                                                   
307      /* This part : To be implemented ....        
308         Required only for writing, not require    
309 ufs2:                                             
310                                                   
311         u2_block = ufs_fragstoblks(fragment);     
312         u2_blockoff = ufs_fragnum(fragment);      
313         p = ufsi->i_u1.u2_i_data + block;         
314         goal = 0;                                 
315                                                   
316 repeat2:                                          
317         tmp = fs32_to_cpu(sb, *p);                
318         lastfrag = ufsi->i_lastfrag;              
319                                                   
320      */                                           
321 }                                                 
322                                                   
323 /**                                               
324  * ufs_inode_getblock() - allocate new block      
325  * @inode: pointer to inode                       
326  * @ind_block: block number of the indirect bl    
327  * @index: number of pointer within the indire    
328  * @new_fragment: number of new allocated frag    
329  *  (block will hold this fragment and also us    
330  * @err: see ufs_inode_getfrag()                  
331  * @new: see ufs_inode_getfrag()                  
332  * @locked_page: see ufs_inode_getfrag()          
333  */                                               
334 static u64                                        
335 ufs_inode_getblock(struct inode *inode, u64 in    
336                   unsigned index, sector_t new    
337                   int *new, struct page *locke    
338 {                                                 
339         struct super_block *sb = inode->i_sb;     
340         struct ufs_sb_private_info *uspi = UFS    
341         int shift = uspi->s_apbshift - uspi->s    
342         u64 tmp = 0, goal;                        
343         struct buffer_head *bh;                   
344         void *p;                                  
345                                                   
346         if (!ind_block)                           
347                 return 0;                         
348                                                   
349         bh = sb_bread(sb, ind_block + (index >    
350         if (unlikely(!bh)) {                      
351                 *err = -EIO;                      
352                 return 0;                         
353         }                                         
354                                                   
355         index &= uspi->s_apbmask >> uspi->s_fp    
356         if (uspi->fs_magic == UFS2_MAGIC)         
357                 p = (__fs64 *)bh->b_data + ind    
358         else                                      
359                 p = (__fs32 *)bh->b_data + ind    
360                                                   
361         tmp = ufs_data_ptr_to_cpu(sb, p);         
362         if (tmp)                                  
363                 goto out;                         
364                                                   
365         if (index && (uspi->fs_magic == UFS2_M    
366                       (tmp = fs64_to_cpu(sb, (    
367                       (tmp = fs32_to_cpu(sb, (    
368                 goal = tmp + uspi->s_fpb;         
369         else                                      
370                 goal = bh->b_blocknr + uspi->s    
371         tmp = ufs_new_fragments(inode, p, ufs_    
372                                 uspi->s_fpb, e    
373         if (!tmp)                                 
374                 goto out;                         
375                                                   
376         if (new)                                  
377                 *new = 1;                         
378                                                   
379         mark_buffer_dirty(bh);                    
380         if (IS_SYNC(inode))                       
381                 sync_dirty_buffer(bh);            
382         inode_set_ctime_current(inode);           
383         mark_inode_dirty(inode);                  
384 out:                                              
385         brelse (bh);                              
386         UFSD("EXIT\n");                           
387         if (tmp)                                  
388                 tmp += uspi->s_sbbase;            
389         return tmp;                               
390 }                                                 
391                                                   
392 /**                                               
393  * ufs_getfrag_block() - `get_block_t' functio    
394  * read_folio, writepages and so on               
395  */                                               
396                                                   
397 static int ufs_getfrag_block(struct inode *ino    
398 {                                                 
399         struct super_block *sb = inode->i_sb;     
400         struct ufs_sb_private_info *uspi = UFS    
401         int err = 0, new = 0;                     
402         unsigned offsets[4];                      
403         int depth = ufs_block_to_path(inode, f    
404         u64 phys64 = 0;                           
405         unsigned frag = fragment & uspi->s_fpb    
406                                                   
407         phys64 = ufs_frag_map(inode, offsets,     
408         if (!create)                              
409                 goto done;                        
410                                                   
411         if (phys64) {                             
412                 if (fragment >= UFS_NDIR_FRAGM    
413                         goto done;                
414                 read_seqlock_excl(&UFS_I(inode    
415                 if (fragment < UFS_I(inode)->i    
416                         read_sequnlock_excl(&U    
417                         goto done;                
418                 }                                 
419                 read_sequnlock_excl(&UFS_I(ino    
420         }                                         
421         /* This code entered only while writin    
422                                                   
423         mutex_lock(&UFS_I(inode)->truncate_mut    
424                                                   
425         UFSD("ENTER, ino %lu, fragment %llu\n"    
426         if (unlikely(!depth)) {                   
427                 ufs_warning(sb, "ufs_get_block    
428                 err = -EIO;                       
429                 goto out;                         
430         }                                         
431                                                   
432         if (UFS_I(inode)->i_lastfrag < UFS_NDI    
433                 unsigned lastfrag = UFS_I(inod    
434                 unsigned tailfrags = lastfrag     
435                 if (tailfrags && fragment >= l    
436                         if (!ufs_extend_tail(i    
437                                              &    
438                                 goto out;         
439                 }                                 
440         }                                         
441                                                   
442         if (depth == 1) {                         
443                 phys64 = ufs_inode_getfrag(ino    
444                                            &er    
445         } else {                                  
446                 int i;                            
447                 phys64 = ufs_inode_getfrag(ino    
448                                            &er    
449                 for (i = 1; i < depth - 1; i++    
450                         phys64 = ufs_inode_get    
451                                                   
452                 phys64 = ufs_inode_getblock(in    
453                                         fragme    
454         }                                         
455 out:                                              
456         if (phys64) {                             
457                 phys64 += frag;                   
458                 map_bh(bh_result, sb, phys64);    
459                 if (new)                          
460                         set_buffer_new(bh_resu    
461         }                                         
462         mutex_unlock(&UFS_I(inode)->truncate_m    
463         return err;                               
464                                                   
465 done:                                             
466         if (phys64)                               
467                 map_bh(bh_result, sb, phys64 +    
468         return 0;                                 
469 }                                                 
470                                                   
471 static int ufs_writepages(struct address_space    
472                 struct writeback_control *wbc)    
473 {                                                 
474         return mpage_writepages(mapping, wbc,     
475 }                                                 
476                                                   
477 static int ufs_read_folio(struct file *file, s    
478 {                                                 
479         return block_read_full_folio(folio, uf    
480 }                                                 
481                                                   
482 int ufs_prepare_chunk(struct page *page, loff_    
483 {                                                 
484         return __block_write_begin(page, pos,     
485 }                                                 
486                                                   
487 static void ufs_truncate_blocks(struct inode *    
488                                                   
489 static void ufs_write_failed(struct address_sp    
490 {                                                 
491         struct inode *inode = mapping->host;      
492                                                   
493         if (to > inode->i_size) {                 
494                 truncate_pagecache(inode, inod    
495                 ufs_truncate_blocks(inode);       
496         }                                         
497 }                                                 
498                                                   
499 static int ufs_write_begin(struct file *file,     
500                         loff_t pos, unsigned l    
501                         struct page **pagep, v    
502 {                                                 
503         int ret;                                  
504                                                   
505         ret = block_write_begin(mapping, pos,     
506         if (unlikely(ret))                        
507                 ufs_write_failed(mapping, pos     
508                                                   
509         return ret;                               
510 }                                                 
511                                                   
512 static int ufs_write_end(struct file *file, st    
513                         loff_t pos, unsigned l    
514                         struct page *page, voi    
515 {                                                 
516         int ret;                                  
517                                                   
518         ret = generic_write_end(file, mapping,    
519         if (ret < len)                            
520                 ufs_write_failed(mapping, pos     
521         return ret;                               
522 }                                                 
523                                                   
524 static sector_t ufs_bmap(struct address_space     
525 {                                                 
526         return generic_block_bmap(mapping,bloc    
527 }                                                 
528                                                   
529 const struct address_space_operations ufs_aops    
530         .dirty_folio = block_dirty_folio,         
531         .invalidate_folio = block_invalidate_f    
532         .read_folio = ufs_read_folio,             
533         .writepages = ufs_writepages,             
534         .write_begin = ufs_write_begin,           
535         .write_end = ufs_write_end,               
536         .migrate_folio = buffer_migrate_folio,    
537         .bmap = ufs_bmap                          
538 };                                                
539                                                   
540 static void ufs_set_inode_ops(struct inode *in    
541 {                                                 
542         if (S_ISREG(inode->i_mode)) {             
543                 inode->i_op = &ufs_file_inode_    
544                 inode->i_fop = &ufs_file_opera    
545                 inode->i_mapping->a_ops = &ufs    
546         } else if (S_ISDIR(inode->i_mode)) {      
547                 inode->i_op = &ufs_dir_inode_o    
548                 inode->i_fop = &ufs_dir_operat    
549                 inode->i_mapping->a_ops = &ufs    
550         } else if (S_ISLNK(inode->i_mode)) {      
551                 if (!inode->i_blocks) {           
552                         inode->i_link = (char     
553                         inode->i_op = &simple_    
554                 } else {                          
555                         inode->i_mapping->a_op    
556                         inode->i_op = &page_sy    
557                         inode_nohighmem(inode)    
558                 }                                 
559         } else                                    
560                 init_special_inode(inode, inod    
561                                    ufs_get_ino    
562 }                                                 
563                                                   
564 static int ufs1_read_inode(struct inode *inode    
565 {                                                 
566         struct ufs_inode_info *ufsi = UFS_I(in    
567         struct super_block *sb = inode->i_sb;     
568         umode_t mode;                             
569                                                   
570         /*                                        
571          * Copy data to the in-core inode.        
572          */                                       
573         inode->i_mode = mode = fs16_to_cpu(sb,    
574         set_nlink(inode, fs16_to_cpu(sb, ufs_i    
575         if (inode->i_nlink == 0)                  
576                 return -ESTALE;                   
577                                                   
578         /*                                        
579          * Linux now has 32-bit uid and gid, s    
580          */                                       
581         i_uid_write(inode, ufs_get_inode_uid(s    
582         i_gid_write(inode, ufs_get_inode_gid(s    
583                                                   
584         inode->i_size = fs64_to_cpu(sb, ufs_in    
585         inode_set_atime(inode,                    
586                         (signed)fs32_to_cpu(sb    
587                         0);                       
588         inode_set_ctime(inode,                    
589                         (signed)fs32_to_cpu(sb    
590                         0);                       
591         inode_set_mtime(inode,                    
592                         (signed)fs32_to_cpu(sb    
593                         0);                       
594         inode->i_blocks = fs32_to_cpu(sb, ufs_    
595         inode->i_generation = fs32_to_cpu(sb,     
596         ufsi->i_flags = fs32_to_cpu(sb, ufs_in    
597         ufsi->i_shadow = fs32_to_cpu(sb, ufs_i    
598         ufsi->i_oeftflag = fs32_to_cpu(sb, ufs    
599                                                   
600                                                   
601         if (S_ISCHR(mode) || S_ISBLK(mode) ||     
602                 memcpy(ufsi->i_u1.i_data, &ufs    
603                        sizeof(ufs_inode->ui_u2    
604         } else {                                  
605                 memcpy(ufsi->i_u1.i_symlink, u    
606                        sizeof(ufs_inode->ui_u2    
607                 ufsi->i_u1.i_symlink[sizeof(uf    
608         }                                         
609         return 0;                                 
610 }                                                 
611                                                   
612 static int ufs2_read_inode(struct inode *inode    
613 {                                                 
614         struct ufs_inode_info *ufsi = UFS_I(in    
615         struct super_block *sb = inode->i_sb;     
616         umode_t mode;                             
617                                                   
618         UFSD("Reading ufs2 inode, ino %lu\n",     
619         /*                                        
620          * Copy data to the in-core inode.        
621          */                                       
622         inode->i_mode = mode = fs16_to_cpu(sb,    
623         set_nlink(inode, fs16_to_cpu(sb, ufs2_    
624         if (inode->i_nlink == 0)                  
625                 return -ESTALE;                   
626                                                   
627         /*                                        
628          * Linux now has 32-bit uid and gid, s    
629          */                                       
630         i_uid_write(inode, fs32_to_cpu(sb, ufs    
631         i_gid_write(inode, fs32_to_cpu(sb, ufs    
632                                                   
633         inode->i_size = fs64_to_cpu(sb, ufs2_i    
634         inode_set_atime(inode, fs64_to_cpu(sb,    
635                         fs32_to_cpu(sb, ufs2_i    
636         inode_set_ctime(inode, fs64_to_cpu(sb,    
637                         fs32_to_cpu(sb, ufs2_i    
638         inode_set_mtime(inode, fs64_to_cpu(sb,    
639                         fs32_to_cpu(sb, ufs2_i    
640         inode->i_blocks = fs64_to_cpu(sb, ufs2    
641         inode->i_generation = fs32_to_cpu(sb,     
642         ufsi->i_flags = fs32_to_cpu(sb, ufs2_i    
643         /*                                        
644         ufsi->i_shadow = fs32_to_cpu(sb, ufs_i    
645         ufsi->i_oeftflag = fs32_to_cpu(sb, ufs    
646         */                                        
647                                                   
648         if (S_ISCHR(mode) || S_ISBLK(mode) ||     
649                 memcpy(ufsi->i_u1.u2_i_data, &    
650                        sizeof(ufs2_inode->ui_u    
651         } else {                                  
652                 memcpy(ufsi->i_u1.i_symlink, u    
653                        sizeof(ufs2_inode->ui_u    
654                 ufsi->i_u1.i_symlink[sizeof(uf    
655         }                                         
656         return 0;                                 
657 }                                                 
658                                                   
659 struct inode *ufs_iget(struct super_block *sb,    
660 {                                                 
661         struct ufs_inode_info *ufsi;              
662         struct ufs_sb_private_info *uspi = UFS    
663         struct buffer_head * bh;                  
664         struct inode *inode;                      
665         int err = -EIO;                           
666                                                   
667         UFSD("ENTER, ino %lu\n", ino);            
668                                                   
669         if (ino < UFS_ROOTINO || ino > (uspi->    
670                 ufs_warning(sb, "ufs_read_inod    
671                             ino);                 
672                 return ERR_PTR(-EIO);             
673         }                                         
674                                                   
675         inode = iget_locked(sb, ino);             
676         if (!inode)                               
677                 return ERR_PTR(-ENOMEM);          
678         if (!(inode->i_state & I_NEW))            
679                 return inode;                     
680                                                   
681         ufsi = UFS_I(inode);                      
682                                                   
683         bh = sb_bread(sb, uspi->s_sbbase + ufs    
684         if (!bh) {                                
685                 ufs_warning(sb, "ufs_read_inod    
686                             inode->i_ino);        
687                 goto bad_inode;                   
688         }                                         
689         if ((UFS_SB(sb)->s_flags & UFS_TYPE_MA    
690                 struct ufs2_inode *ufs2_inode     
691                                                   
692                 err = ufs2_read_inode(inode,      
693                                       ufs2_ino    
694         } else {                                  
695                 struct ufs_inode *ufs_inode =     
696                                                   
697                 err = ufs1_read_inode(inode,      
698                                       ufs_inod    
699         }                                         
700         brelse(bh);                               
701         if (err)                                  
702                 goto bad_inode;                   
703                                                   
704         inode_inc_iversion(inode);                
705         ufsi->i_lastfrag =                        
706                 (inode->i_size + uspi->s_fsize    
707         ufsi->i_dir_start_lookup = 0;             
708         ufsi->i_osync = 0;                        
709                                                   
710         ufs_set_inode_ops(inode);                 
711                                                   
712         UFSD("EXIT\n");                           
713         unlock_new_inode(inode);                  
714         return inode;                             
715                                                   
716 bad_inode:                                        
717         iget_failed(inode);                       
718         return ERR_PTR(err);                      
719 }                                                 
720                                                   
721 static void ufs1_update_inode(struct inode *in    
722 {                                                 
723         struct super_block *sb = inode->i_sb;     
724         struct ufs_inode_info *ufsi = UFS_I(in    
725                                                   
726         ufs_inode->ui_mode = cpu_to_fs16(sb, i    
727         ufs_inode->ui_nlink = cpu_to_fs16(sb,     
728                                                   
729         ufs_set_inode_uid(sb, ufs_inode, i_uid    
730         ufs_set_inode_gid(sb, ufs_inode, i_gid    
731                                                   
732         ufs_inode->ui_size = cpu_to_fs64(sb, i    
733         ufs_inode->ui_atime.tv_sec = cpu_to_fs    
734                                                   
735         ufs_inode->ui_atime.tv_usec = 0;          
736         ufs_inode->ui_ctime.tv_sec = cpu_to_fs    
737                                                   
738         ufs_inode->ui_ctime.tv_usec = 0;          
739         ufs_inode->ui_mtime.tv_sec = cpu_to_fs    
740                                                   
741         ufs_inode->ui_mtime.tv_usec = 0;          
742         ufs_inode->ui_blocks = cpu_to_fs32(sb,    
743         ufs_inode->ui_flags = cpu_to_fs32(sb,     
744         ufs_inode->ui_gen = cpu_to_fs32(sb, in    
745                                                   
746         if ((UFS_SB(sb)->s_flags & UFS_UID_MAS    
747                 ufs_inode->ui_u3.ui_sun.ui_sha    
748                 ufs_inode->ui_u3.ui_sun.ui_oef    
749         }                                         
750                                                   
751         if (S_ISCHR(inode->i_mode) || S_ISBLK(    
752                 /* ufs_inode->ui_u2.ui_addr.ui    
753                 ufs_inode->ui_u2.ui_addr.ui_db    
754         } else if (inode->i_blocks) {             
755                 memcpy(&ufs_inode->ui_u2.ui_ad    
756                        sizeof(ufs_inode->ui_u2    
757         }                                         
758         else {                                    
759                 memcpy(&ufs_inode->ui_u2.ui_sy    
760                        sizeof(ufs_inode->ui_u2    
761         }                                         
762                                                   
763         if (!inode->i_nlink)                      
764                 memset (ufs_inode, 0, sizeof(s    
765 }                                                 
766                                                   
767 static void ufs2_update_inode(struct inode *in    
768 {                                                 
769         struct super_block *sb = inode->i_sb;     
770         struct ufs_inode_info *ufsi = UFS_I(in    
771                                                   
772         UFSD("ENTER\n");                          
773         ufs_inode->ui_mode = cpu_to_fs16(sb, i    
774         ufs_inode->ui_nlink = cpu_to_fs16(sb,     
775                                                   
776         ufs_inode->ui_uid = cpu_to_fs32(sb, i_    
777         ufs_inode->ui_gid = cpu_to_fs32(sb, i_    
778                                                   
779         ufs_inode->ui_size = cpu_to_fs64(sb, i    
780         ufs_inode->ui_atime = cpu_to_fs64(sb,     
781         ufs_inode->ui_atimensec = cpu_to_fs32(    
782                                                   
783         ufs_inode->ui_ctime = cpu_to_fs64(sb,     
784         ufs_inode->ui_ctimensec = cpu_to_fs32(    
785                                                   
786         ufs_inode->ui_mtime = cpu_to_fs64(sb,     
787         ufs_inode->ui_mtimensec = cpu_to_fs32(    
788                                                   
789                                                   
790         ufs_inode->ui_blocks = cpu_to_fs64(sb,    
791         ufs_inode->ui_flags = cpu_to_fs32(sb,     
792         ufs_inode->ui_gen = cpu_to_fs32(sb, in    
793                                                   
794         if (S_ISCHR(inode->i_mode) || S_ISBLK(    
795                 /* ufs_inode->ui_u2.ui_addr.ui    
796                 ufs_inode->ui_u2.ui_addr.ui_db    
797         } else if (inode->i_blocks) {             
798                 memcpy(&ufs_inode->ui_u2.ui_ad    
799                        sizeof(ufs_inode->ui_u2    
800         } else {                                  
801                 memcpy(&ufs_inode->ui_u2.ui_sy    
802                        sizeof(ufs_inode->ui_u2    
803         }                                         
804                                                   
805         if (!inode->i_nlink)                      
806                 memset (ufs_inode, 0, sizeof(s    
807         UFSD("EXIT\n");                           
808 }                                                 
809                                                   
810 static int ufs_update_inode(struct inode * ino    
811 {                                                 
812         struct super_block *sb = inode->i_sb;     
813         struct ufs_sb_private_info *uspi = UFS    
814         struct buffer_head * bh;                  
815                                                   
816         UFSD("ENTER, ino %lu\n", inode->i_ino)    
817                                                   
818         if (inode->i_ino < UFS_ROOTINO ||         
819             inode->i_ino > (uspi->s_ncg * uspi    
820                 ufs_warning (sb, "ufs_read_ino    
821                 return -1;                        
822         }                                         
823                                                   
824         bh = sb_bread(sb, ufs_inotofsba(inode-    
825         if (!bh) {                                
826                 ufs_warning (sb, "ufs_read_ino    
827                 return -1;                        
828         }                                         
829         if (uspi->fs_magic == UFS2_MAGIC) {       
830                 struct ufs2_inode *ufs2_inode     
831                                                   
832                 ufs2_update_inode(inode,          
833                                   ufs2_inode +    
834         } else {                                  
835                 struct ufs_inode *ufs_inode =     
836                                                   
837                 ufs1_update_inode(inode, ufs_i    
838         }                                         
839                                                   
840         mark_buffer_dirty(bh);                    
841         if (do_sync)                              
842                 sync_dirty_buffer(bh);            
843         brelse (bh);                              
844                                                   
845         UFSD("EXIT\n");                           
846         return 0;                                 
847 }                                                 
848                                                   
849 int ufs_write_inode(struct inode *inode, struc    
850 {                                                 
851         return ufs_update_inode(inode, wbc->sy    
852 }                                                 
853                                                   
854 int ufs_sync_inode (struct inode *inode)          
855 {                                                 
856         return ufs_update_inode (inode, 1);       
857 }                                                 
858                                                   
859 void ufs_evict_inode(struct inode * inode)        
860 {                                                 
861         int want_delete = 0;                      
862                                                   
863         if (!inode->i_nlink && !is_bad_inode(i    
864                 want_delete = 1;                  
865                                                   
866         truncate_inode_pages_final(&inode->i_d    
867         if (want_delete) {                        
868                 inode->i_size = 0;                
869                 if (inode->i_blocks &&            
870                     (S_ISREG(inode->i_mode) ||    
871                      S_ISLNK(inode->i_mode)))     
872                         ufs_truncate_blocks(in    
873                 ufs_update_inode(inode, inode_    
874         }                                         
875                                                   
876         invalidate_inode_buffers(inode);          
877         clear_inode(inode);                       
878                                                   
879         if (want_delete)                          
880                 ufs_free_inode(inode);            
881 }                                                 
882                                                   
883 struct to_free {                                  
884         struct inode *inode;                      
885         u64 to;                                   
886         unsigned count;                           
887 };                                                
888                                                   
889 static inline void free_data(struct to_free *c    
890 {                                                 
891         if (ctx->count && ctx->to != from) {      
892                 ufs_free_blocks(ctx->inode, ct    
893                 ctx->count = 0;                   
894         }                                         
895         ctx->count += count;                      
896         ctx->to = from + count;                   
897 }                                                 
898                                                   
899 #define DIRECT_FRAGMENT ((inode->i_size + uspi    
900                                                   
901 static void ufs_trunc_direct(struct inode *ino    
902 {                                                 
903         struct ufs_inode_info *ufsi = UFS_I(in    
904         struct super_block * sb;                  
905         struct ufs_sb_private_info * uspi;        
906         void *p;                                  
907         u64 frag1, frag2, frag3, frag4, block1    
908         struct to_free ctx = {.inode = inode};    
909         unsigned i, tmp;                          
910                                                   
911         UFSD("ENTER: ino %lu\n", inode->i_ino)    
912                                                   
913         sb = inode->i_sb;                         
914         uspi = UFS_SB(sb)->s_uspi;                
915                                                   
916         frag1 = DIRECT_FRAGMENT;                  
917         frag4 = min_t(u64, UFS_NDIR_FRAGMENT,     
918         frag2 = ((frag1 & uspi->s_fpbmask) ? (    
919         frag3 = frag4 & ~uspi->s_fpbmask;         
920         block1 = block2 = 0;                      
921         if (frag2 > frag3) {                      
922                 frag2 = frag4;                    
923                 frag3 = frag4 = 0;                
924         } else if (frag2 < frag3) {               
925                 block1 = ufs_fragstoblks (frag    
926                 block2 = ufs_fragstoblks (frag    
927         }                                         
928                                                   
929         UFSD("ino %lu, frag1 %llu, frag2 %llu,    
930              " frag3 %llu, frag4 %llu\n", inod    
931              (unsigned long long)frag1, (unsig    
932              (unsigned long long)block1, (unsi    
933              (unsigned long long)frag3, (unsig    
934                                                   
935         if (frag1 >= frag2)                       
936                 goto next1;                       
937                                                   
938         /*                                        
939          * Free first free fragments              
940          */                                       
941         p = ufs_get_direct_data_ptr(uspi, ufsi    
942         tmp = ufs_data_ptr_to_cpu(sb, p);         
943         if (!tmp )                                
944                 ufs_panic (sb, "ufs_trunc_dire    
945         frag2 -= frag1;                           
946         frag1 = ufs_fragnum (frag1);              
947                                                   
948         ufs_free_fragments(inode, tmp + frag1,    
949                                                   
950 next1:                                            
951         /*                                        
952          * Free whole blocks                      
953          */                                       
954         for (i = block1 ; i < block2; i++) {      
955                 p = ufs_get_direct_data_ptr(us    
956                 tmp = ufs_data_ptr_to_cpu(sb,     
957                 if (!tmp)                         
958                         continue;                 
959                 write_seqlock(&ufsi->meta_lock    
960                 ufs_data_ptr_clear(uspi, p);      
961                 write_sequnlock(&ufsi->meta_lo    
962                                                   
963                 free_data(&ctx, tmp, uspi->s_f    
964         }                                         
965                                                   
966         free_data(&ctx, 0, 0);                    
967                                                   
968         if (frag3 >= frag4)                       
969                 goto next3;                       
970                                                   
971         /*                                        
972          * Free last free fragments               
973          */                                       
974         p = ufs_get_direct_data_ptr(uspi, ufsi    
975         tmp = ufs_data_ptr_to_cpu(sb, p);         
976         if (!tmp )                                
977                 ufs_panic(sb, "ufs_truncate_di    
978         frag4 = ufs_fragnum (frag4);              
979         write_seqlock(&ufsi->meta_lock);          
980         ufs_data_ptr_clear(uspi, p);              
981         write_sequnlock(&ufsi->meta_lock);        
982                                                   
983         ufs_free_fragments (inode, tmp, frag4)    
984  next3:                                           
985                                                   
986         UFSD("EXIT: ino %lu\n", inode->i_ino);    
987 }                                                 
988                                                   
989 static void free_full_branch(struct inode *ino    
990 {                                                 
991         struct super_block *sb = inode->i_sb;     
992         struct ufs_sb_private_info *uspi = UFS    
993         struct ufs_buffer_head *ubh = ubh_brea    
994         unsigned i;                               
995                                                   
996         if (!ubh)                                 
997                 return;                           
998                                                   
999         if (--depth) {                            
1000                 for (i = 0; i < uspi->s_apb;     
1001                         void *p = ubh_get_dat    
1002                         u64 block = ufs_data_    
1003                         if (block)               
1004                                 free_full_bra    
1005                 }                                
1006         } else {                                 
1007                 struct to_free ctx = {.inode     
1008                                                  
1009                 for (i = 0; i < uspi->s_apb;     
1010                         void *p = ubh_get_dat    
1011                         u64 block = ufs_data_    
1012                         if (block)               
1013                                 free_data(&ct    
1014                 }                                
1015                 free_data(&ctx, 0, 0);           
1016         }                                        
1017                                                  
1018         ubh_bforget(ubh);                        
1019         ufs_free_blocks(inode, ind_block, usp    
1020 }                                                
1021                                                  
1022 static void free_branch_tail(struct inode *in    
1023 {                                                
1024         struct super_block *sb = inode->i_sb;    
1025         struct ufs_sb_private_info *uspi = UF    
1026         unsigned i;                              
1027                                                  
1028         if (--depth) {                           
1029                 for (i = from; i < uspi->s_ap    
1030                         void *p = ubh_get_dat    
1031                         u64 block = ufs_data_    
1032                         if (block) {             
1033                                 write_seqlock    
1034                                 ufs_data_ptr_    
1035                                 write_sequnlo    
1036                                 ubh_mark_buff    
1037                                 free_full_bra    
1038                         }                        
1039                 }                                
1040         } else {                                 
1041                 struct to_free ctx = {.inode     
1042                                                  
1043                 for (i = from; i < uspi->s_ap    
1044                         void *p = ubh_get_dat    
1045                         u64 block = ufs_data_    
1046                         if (block) {             
1047                                 write_seqlock    
1048                                 ufs_data_ptr_    
1049                                 write_sequnlo    
1050                                 ubh_mark_buff    
1051                                 free_data(&ct    
1052                         }                        
1053                 }                                
1054                 free_data(&ctx, 0, 0);           
1055         }                                        
1056         if (IS_SYNC(inode) && ubh_buffer_dirt    
1057                 ubh_sync_block(ubh);             
1058         ubh_brelse(ubh);                         
1059 }                                                
1060                                                  
1061 static int ufs_alloc_lastblock(struct inode *    
1062 {                                                
1063         int err = 0;                             
1064         struct super_block *sb = inode->i_sb;    
1065         struct address_space *mapping = inode    
1066         struct ufs_sb_private_info *uspi = UF    
1067         unsigned i, end;                         
1068         sector_t lastfrag;                       
1069         struct folio *folio;                     
1070         struct buffer_head *bh;                  
1071         u64 phys64;                              
1072                                                  
1073         lastfrag = (size + uspi->s_fsize - 1)    
1074                                                  
1075         if (!lastfrag)                           
1076                 goto out;                        
1077                                                  
1078         lastfrag--;                              
1079                                                  
1080         folio = ufs_get_locked_folio(mapping,    
1081                                        (PAGE_    
1082         if (IS_ERR(folio)) {                     
1083                 err = -EIO;                      
1084                 goto out;                        
1085         }                                        
1086                                                  
1087         end = lastfrag & ((1 << (PAGE_SHIFT -    
1088         bh = folio_buffers(folio);               
1089         for (i = 0; i < end; ++i)                
1090                 bh = bh->b_this_page;            
1091                                                  
1092        err = ufs_getfrag_block(inode, lastfra    
1093                                                  
1094        if (unlikely(err))                        
1095                goto out_unlock;                  
1096                                                  
1097        if (buffer_new(bh)) {                     
1098                clear_buffer_new(bh);             
1099                clean_bdev_bh_alias(bh);          
1100                /*                                
1101                 * we do not zeroize fragment,    
1102                 * if it maped to hole, it alr    
1103                 */                               
1104                set_buffer_uptodate(bh);          
1105                mark_buffer_dirty(bh);            
1106                 folio_mark_dirty(folio);         
1107        }                                         
1108                                                  
1109        if (lastfrag >= UFS_IND_FRAGMENT) {       
1110                end = uspi->s_fpb - ufs_fragnu    
1111                phys64 = bh->b_blocknr + 1;       
1112                for (i = 0; i < end; ++i) {       
1113                        bh = sb_getblk(sb, i +    
1114                        lock_buffer(bh);          
1115                        memset(bh->b_data, 0,     
1116                        set_buffer_uptodate(bh    
1117                        mark_buffer_dirty(bh);    
1118                        unlock_buffer(bh);        
1119                        sync_dirty_buffer(bh);    
1120                        brelse(bh);               
1121                }                                 
1122        }                                         
1123 out_unlock:                                      
1124        ufs_put_locked_folio(folio);              
1125 out:                                             
1126        return err;                               
1127 }                                                
1128                                                  
1129 static void ufs_truncate_blocks(struct inode     
1130 {                                                
1131         struct ufs_inode_info *ufsi = UFS_I(i    
1132         struct super_block *sb = inode->i_sb;    
1133         struct ufs_sb_private_info *uspi = UF    
1134         unsigned offsets[4];                     
1135         int depth;                               
1136         int depth2;                              
1137         unsigned i;                              
1138         struct ufs_buffer_head *ubh[3];          
1139         void *p;                                 
1140         u64 block;                               
1141                                                  
1142         if (inode->i_size) {                     
1143                 sector_t last = (inode->i_siz    
1144                 depth = ufs_block_to_path(ino    
1145                 if (!depth)                      
1146                         return;                  
1147         } else {                                 
1148                 depth = 1;                       
1149         }                                        
1150                                                  
1151         for (depth2 = depth - 1; depth2; dept    
1152                 if (offsets[depth2] != uspi->    
1153                         break;                   
1154                                                  
1155         mutex_lock(&ufsi->truncate_mutex);       
1156         if (depth == 1) {                        
1157                 ufs_trunc_direct(inode);         
1158                 offsets[0] = UFS_IND_BLOCK;      
1159         } else {                                 
1160                 /* get the blocks that should    
1161                 p = ufs_get_direct_data_ptr(u    
1162                 for (i = 0; i < depth2; i++)     
1163                         block = ufs_data_ptr_    
1164                         if (!block)              
1165                                 break;           
1166                         ubh[i] = ubh_bread(sb    
1167                         if (!ubh[i]) {           
1168                                 write_seqlock    
1169                                 ufs_data_ptr_    
1170                                 write_sequnlo    
1171                                 break;           
1172                         }                        
1173                         p = ubh_get_data_ptr(    
1174                 }                                
1175                 while (i--)                      
1176                         free_branch_tail(inod    
1177         }                                        
1178         for (i = offsets[0]; i <= UFS_TIND_BL    
1179                 p = ufs_get_direct_data_ptr(u    
1180                 block = ufs_data_ptr_to_cpu(s    
1181                 if (block) {                     
1182                         write_seqlock(&ufsi->    
1183                         ufs_data_ptr_clear(us    
1184                         write_sequnlock(&ufsi    
1185                         free_full_branch(inod    
1186                 }                                
1187         }                                        
1188         read_seqlock_excl(&ufsi->meta_lock);     
1189         ufsi->i_lastfrag = DIRECT_FRAGMENT;      
1190         read_sequnlock_excl(&ufsi->meta_lock)    
1191         mark_inode_dirty(inode);                 
1192         mutex_unlock(&ufsi->truncate_mutex);     
1193 }                                                
1194                                                  
1195 static int ufs_truncate(struct inode *inode,     
1196 {                                                
1197         int err = 0;                             
1198                                                  
1199         UFSD("ENTER: ino %lu, i_size: %llu, o    
1200              inode->i_ino, (unsigned long lon    
1201              (unsigned long long)i_size_read(    
1202                                                  
1203         if (!(S_ISREG(inode->i_mode) || S_ISD    
1204               S_ISLNK(inode->i_mode)))           
1205                 return -EINVAL;                  
1206         if (IS_APPEND(inode) || IS_IMMUTABLE(    
1207                 return -EPERM;                   
1208                                                  
1209         err = ufs_alloc_lastblock(inode, size    
1210                                                  
1211         if (err)                                 
1212                 goto out;                        
1213                                                  
1214         block_truncate_page(inode->i_mapping,    
1215                                                  
1216         truncate_setsize(inode, size);           
1217                                                  
1218         ufs_truncate_blocks(inode);              
1219         inode_set_mtime_to_ts(inode, inode_se    
1220         mark_inode_dirty(inode);                 
1221 out:                                             
1222         UFSD("EXIT: err %d\n", err);             
1223         return err;                              
1224 }                                                
1225                                                  
1226 int ufs_setattr(struct mnt_idmap *idmap, stru    
1227                 struct iattr *attr)              
1228 {                                                
1229         struct inode *inode = d_inode(dentry)    
1230         unsigned int ia_valid = attr->ia_vali    
1231         int error;                               
1232                                                  
1233         error = setattr_prepare(&nop_mnt_idma    
1234         if (error)                               
1235                 return error;                    
1236                                                  
1237         if (ia_valid & ATTR_SIZE && attr->ia_    
1238                 error = ufs_truncate(inode, a    
1239                 if (error)                       
1240                         return error;            
1241         }                                        
1242                                                  
1243         setattr_copy(&nop_mnt_idmap, inode, a    
1244         mark_inode_dirty(inode);                 
1245         return 0;                                
1246 }                                                
1247                                                  
1248 const struct inode_operations ufs_file_inode_    
1249         .setattr = ufs_setattr,                  
1250 };                                               
1251                                                  

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