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

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

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /fs/ufs/inode.c (Version linux-6.11.5) and /fs/ufs/inode.c (Version linux-4.10.17)


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

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