file.c (585a78c1f77be305b1f6adad392f16047fb66ffd) file.c (39c1ce8eafc0ff64fb9e28536ccc7df6a8e2999d)
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd.
4 */
5
6#include <linux/slab.h>
7#include <linux/compat.h>
8#include <linux/cred.h>

--- 195 unchanged lines hidden (view full) ---

204 exfat_fs_error(sb, "tried to truncate zeroed cluster.");
205 goto write_size;
206 }
207
208 err = __exfat_truncate(inode);
209 if (err)
210 goto write_size;
211
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright (C) 2012-2013 Samsung Electronics Co., Ltd.
4 */
5
6#include <linux/slab.h>
7#include <linux/compat.h>
8#include <linux/cred.h>

--- 195 unchanged lines hidden (view full) ---

204 exfat_fs_error(sb, "tried to truncate zeroed cluster.");
205 goto write_size;
206 }
207
208 err = __exfat_truncate(inode);
209 if (err)
210 goto write_size;
211
212 inode->i_blocks = round_up(i_size_read(inode), sbi->cluster_size) >>
213 inode->i_blkbits;
212 inode->i_blocks = round_up(i_size_read(inode), sbi->cluster_size) >> 9;
214write_size:
215 aligned_size = i_size_read(inode);
216 if (aligned_size & (blocksize - 1)) {
217 aligned_size |= (blocksize - 1);
218 aligned_size++;
219 }
220
221 if (ei->i_size_ondisk > i_size_read(inode))
222 ei->i_size_ondisk = aligned_size;
223
224 if (ei->i_size_aligned > i_size_read(inode))
225 ei->i_size_aligned = aligned_size;
226 mutex_unlock(&sbi->s_lock);
227}
228
213write_size:
214 aligned_size = i_size_read(inode);
215 if (aligned_size & (blocksize - 1)) {
216 aligned_size |= (blocksize - 1);
217 aligned_size++;
218 }
219
220 if (ei->i_size_ondisk > i_size_read(inode))
221 ei->i_size_ondisk = aligned_size;
222
223 if (ei->i_size_aligned > i_size_read(inode))
224 ei->i_size_aligned = aligned_size;
225 mutex_unlock(&sbi->s_lock);
226}
227
229int exfat_getattr(struct mnt_idmap *idmap, const struct path *path,
228int exfat_getattr(struct user_namespace *mnt_uerns, const struct path *path,
230 struct kstat *stat, unsigned int request_mask,
231 unsigned int query_flags)
232{
233 struct inode *inode = d_backing_inode(path->dentry);
234 struct exfat_inode_info *ei = EXFAT_I(inode);
235
229 struct kstat *stat, unsigned int request_mask,
230 unsigned int query_flags)
231{
232 struct inode *inode = d_backing_inode(path->dentry);
233 struct exfat_inode_info *ei = EXFAT_I(inode);
234
236 generic_fillattr(&nop_mnt_idmap, inode, stat);
235 generic_fillattr(&init_user_ns, inode, stat);
237 exfat_truncate_atime(&stat->atime);
238 stat->result_mask |= STATX_BTIME;
239 stat->btime.tv_sec = ei->i_crtime.tv_sec;
240 stat->btime.tv_nsec = ei->i_crtime.tv_nsec;
241 stat->blksize = EXFAT_SB(inode->i_sb)->cluster_size;
242 return 0;
243}
244
236 exfat_truncate_atime(&stat->atime);
237 stat->result_mask |= STATX_BTIME;
238 stat->btime.tv_sec = ei->i_crtime.tv_sec;
239 stat->btime.tv_nsec = ei->i_crtime.tv_nsec;
240 stat->blksize = EXFAT_SB(inode->i_sb)->cluster_size;
241 return 0;
242}
243
245int exfat_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
244int exfat_setattr(struct user_namespace *mnt_userns, struct dentry *dentry,
246 struct iattr *attr)
247{
248 struct exfat_sb_info *sbi = EXFAT_SB(dentry->d_sb);
249 struct inode *inode = dentry->d_inode;
250 unsigned int ia_valid;
251 int error;
252
253 if ((attr->ia_valid & ATTR_SIZE) &&

--- 7 unchanged lines hidden (view full) ---

261 /* Check for setting the inode time. */
262 ia_valid = attr->ia_valid;
263 if ((ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET | ATTR_TIMES_SET)) &&
264 exfat_allow_set_time(sbi, inode)) {
265 attr->ia_valid &= ~(ATTR_MTIME_SET | ATTR_ATIME_SET |
266 ATTR_TIMES_SET);
267 }
268
245 struct iattr *attr)
246{
247 struct exfat_sb_info *sbi = EXFAT_SB(dentry->d_sb);
248 struct inode *inode = dentry->d_inode;
249 unsigned int ia_valid;
250 int error;
251
252 if ((attr->ia_valid & ATTR_SIZE) &&

--- 7 unchanged lines hidden (view full) ---

260 /* Check for setting the inode time. */
261 ia_valid = attr->ia_valid;
262 if ((ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET | ATTR_TIMES_SET)) &&
263 exfat_allow_set_time(sbi, inode)) {
264 attr->ia_valid &= ~(ATTR_MTIME_SET | ATTR_ATIME_SET |
265 ATTR_TIMES_SET);
266 }
267
269 error = setattr_prepare(&nop_mnt_idmap, dentry, attr);
268 error = setattr_prepare(&init_user_ns, dentry, attr);
270 attr->ia_valid = ia_valid;
271 if (error)
272 goto out;
273
274 if (((attr->ia_valid & ATTR_UID) &&
275 !uid_eq(attr->ia_uid, sbi->options.fs_uid)) ||
276 ((attr->ia_valid & ATTR_GID) &&
277 !gid_eq(attr->ia_gid, sbi->options.fs_gid)) ||

--- 10 unchanged lines hidden (view full) ---

288 if (attr->ia_valid & ATTR_MODE) {
289 if (exfat_sanitize_mode(sbi, inode, &attr->ia_mode) < 0)
290 attr->ia_valid &= ~ATTR_MODE;
291 }
292
293 if (attr->ia_valid & ATTR_SIZE)
294 inode->i_mtime = inode->i_ctime = current_time(inode);
295
269 attr->ia_valid = ia_valid;
270 if (error)
271 goto out;
272
273 if (((attr->ia_valid & ATTR_UID) &&
274 !uid_eq(attr->ia_uid, sbi->options.fs_uid)) ||
275 ((attr->ia_valid & ATTR_GID) &&
276 !gid_eq(attr->ia_gid, sbi->options.fs_gid)) ||

--- 10 unchanged lines hidden (view full) ---

287 if (attr->ia_valid & ATTR_MODE) {
288 if (exfat_sanitize_mode(sbi, inode, &attr->ia_mode) < 0)
289 attr->ia_valid &= ~ATTR_MODE;
290 }
291
292 if (attr->ia_valid & ATTR_SIZE)
293 inode->i_mtime = inode->i_ctime = current_time(inode);
294
296 setattr_copy(&nop_mnt_idmap, inode, attr);
295 setattr_copy(&init_user_ns, inode, attr);
297 exfat_truncate_atime(&inode->i_atime);
298
299 if (attr->ia_valid & ATTR_SIZE) {
300 error = exfat_block_truncate_page(inode, attr->ia_size);
301 if (error)
302 goto out;
303
304 down_write(&EXFAT_I(inode)->truncate_lock);

--- 96 unchanged lines hidden ---
296 exfat_truncate_atime(&inode->i_atime);
297
298 if (attr->ia_valid & ATTR_SIZE) {
299 error = exfat_block_truncate_page(inode, attr->ia_size);
300 if (error)
301 goto out;
302
303 down_write(&EXFAT_I(inode)->truncate_lock);

--- 96 unchanged lines hidden ---