7336d0e654f7a fs/gfs2/file.c (Thomas Gleixner 2019-05-31 01:09:56 -0700 1) // SPDX-License-Identifier: GPL-2.0-only
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 2) /*
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 3) * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
3a8a9a1034813 fs/gfs2/ops_file.c (Steven Whitehouse 2006-05-18 15:09:15 -0400 4) * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved.
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 5) */
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 6)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 7) #include <linux/slab.h>
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 8) #include <linux/spinlock.h>
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 9) #include <linux/compat.h>
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 10) #include <linux/completion.h>
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 11) #include <linux/buffer_head.h>
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 12) #include <linux/pagemap.h>
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 13) #include <linux/uio.h>
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 14) #include <linux/blkdev.h>
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 15) #include <linux/mm.h>
f58ba889106af fs/gfs2/ops_file.c (Miklos Szeredi 2008-07-02 21:12:01 +0200 16) #include <linux/mount.h>
18ec7d5c3f434 fs/gfs2/ops_file.c (Steven Whitehouse 2006-02-08 11:50:51 +0000 17) #include <linux/fs.h>
5c676f6d359b0 fs/gfs2/ops_file.c (Steven Whitehouse 2006-02-27 17:23:27 -0500 18) #include <linux/gfs2_ondisk.h>
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 19) #include <linux/falloc.h>
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 20) #include <linux/swap.h>
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 21) #include <linux/crc32.h>
33c3de32872ef fs/gfs2/ops_file.c (Steven Whitehouse 2006-11-30 10:14:32 -0500 22) #include <linux/writeback.h>
7c0f6ba682b9c fs/gfs2/file.c (Linus Torvalds 2016-12-24 11:46:01 -0800 23) #include <linux/uaccess.h>
f057f6cdf6417 fs/gfs2/ops_file.c (Steven Whitehouse 2009-01-12 10:43:39 +0000 24) #include <linux/dlm.h>
f057f6cdf6417 fs/gfs2/ops_file.c (Steven Whitehouse 2009-01-12 10:43:39 +0000 25) #include <linux/dlm_plock.h>
2ddfbdd6848d4 fs/gfs2/file.c (Bob Peterson 2014-08-20 12:44:45 -0400 26) #include <linux/delay.h>
64bc06bb32ee9 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-24 15:04:04 +0100 27) #include <linux/backing-dev.h>
88b631cbfbeb4 fs/gfs2/file.c (Miklos Szeredi 2021-04-07 14:36:43 +0200 28) #include <linux/fileattr.h>
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 29)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 30) #include "gfs2.h"
5c676f6d359b0 fs/gfs2/ops_file.c (Steven Whitehouse 2006-02-27 17:23:27 -0500 31) #include "incore.h"
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 32) #include "bmap.h"
64bc06bb32ee9 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-24 15:04:04 +0100 33) #include "aops.h"
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 34) #include "dir.h"
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 35) #include "glock.h"
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 36) #include "glops.h"
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 37) #include "inode.h"
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 38) #include "log.h"
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 39) #include "meta_io.h"
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 40) #include "quota.h"
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 41) #include "rgrp.h"
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 42) #include "trans.h"
5c676f6d359b0 fs/gfs2/ops_file.c (Steven Whitehouse 2006-02-27 17:23:27 -0500 43) #include "util.h"
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 44)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 45) /**
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 46) * gfs2_llseek - seek to a location in a file
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 47) * @file: the file
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 48) * @offset: the offset
965c8e59cfcf8 fs/gfs2/file.c (Andrew Morton 2012-12-17 15:59:39 -0800 49) * @whence: Where to seek from (SEEK_SET, SEEK_CUR, or SEEK_END)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 50) *
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 51) * SEEK_END requires the glock for the file because it references the
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 52) * file's size.
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 53) *
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 54) * Returns: The new offset, or errno
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 55) */
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 56)
965c8e59cfcf8 fs/gfs2/file.c (Andrew Morton 2012-12-17 15:59:39 -0800 57) static loff_t gfs2_llseek(struct file *file, loff_t offset, int whence)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 58) {
feaa7bba026c1 fs/gfs2/ops_file.c (Steven Whitehouse 2006-06-14 15:32:57 -0400 59) struct gfs2_inode *ip = GFS2_I(file->f_mapping->host);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 60) struct gfs2_holder i_gh;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 61) loff_t error;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 62)
965c8e59cfcf8 fs/gfs2/file.c (Andrew Morton 2012-12-17 15:59:39 -0800 63) switch (whence) {
3a27411cb4bc3 fs/gfs2/file.c (Andreas Gruenbacher 2017-03-15 19:12:59 +0100 64) case SEEK_END:
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 65) error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY,
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 66) &i_gh);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 67) if (!error) {
965c8e59cfcf8 fs/gfs2/file.c (Andrew Morton 2012-12-17 15:59:39 -0800 68) error = generic_file_llseek(file, offset, whence);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 69) gfs2_glock_dq_uninit(&i_gh);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 70) }
9453615a1a7ef fs/gfs2/file.c (Steven Whitehouse 2011-08-23 10:19:25 +0100 71) break;
3a27411cb4bc3 fs/gfs2/file.c (Andreas Gruenbacher 2017-03-15 19:12:59 +0100 72)
3a27411cb4bc3 fs/gfs2/file.c (Andreas Gruenbacher 2017-03-15 19:12:59 +0100 73) case SEEK_DATA:
3a27411cb4bc3 fs/gfs2/file.c (Andreas Gruenbacher 2017-03-15 19:12:59 +0100 74) error = gfs2_seek_data(file, offset);
3a27411cb4bc3 fs/gfs2/file.c (Andreas Gruenbacher 2017-03-15 19:12:59 +0100 75) break;
3a27411cb4bc3 fs/gfs2/file.c (Andreas Gruenbacher 2017-03-15 19:12:59 +0100 76)
3a27411cb4bc3 fs/gfs2/file.c (Andreas Gruenbacher 2017-03-15 19:12:59 +0100 77) case SEEK_HOLE:
3a27411cb4bc3 fs/gfs2/file.c (Andreas Gruenbacher 2017-03-15 19:12:59 +0100 78) error = gfs2_seek_hole(file, offset);
3a27411cb4bc3 fs/gfs2/file.c (Andreas Gruenbacher 2017-03-15 19:12:59 +0100 79) break;
3a27411cb4bc3 fs/gfs2/file.c (Andreas Gruenbacher 2017-03-15 19:12:59 +0100 80)
9453615a1a7ef fs/gfs2/file.c (Steven Whitehouse 2011-08-23 10:19:25 +0100 81) case SEEK_CUR:
9453615a1a7ef fs/gfs2/file.c (Steven Whitehouse 2011-08-23 10:19:25 +0100 82) case SEEK_SET:
3a27411cb4bc3 fs/gfs2/file.c (Andreas Gruenbacher 2017-03-15 19:12:59 +0100 83) /*
3a27411cb4bc3 fs/gfs2/file.c (Andreas Gruenbacher 2017-03-15 19:12:59 +0100 84) * These don't reference inode->i_size and don't depend on the
3a27411cb4bc3 fs/gfs2/file.c (Andreas Gruenbacher 2017-03-15 19:12:59 +0100 85) * block mapping, so we don't need the glock.
3a27411cb4bc3 fs/gfs2/file.c (Andreas Gruenbacher 2017-03-15 19:12:59 +0100 86) */
965c8e59cfcf8 fs/gfs2/file.c (Andrew Morton 2012-12-17 15:59:39 -0800 87) error = generic_file_llseek(file, offset, whence);
9453615a1a7ef fs/gfs2/file.c (Steven Whitehouse 2011-08-23 10:19:25 +0100 88) break;
9453615a1a7ef fs/gfs2/file.c (Steven Whitehouse 2011-08-23 10:19:25 +0100 89) default:
9453615a1a7ef fs/gfs2/file.c (Steven Whitehouse 2011-08-23 10:19:25 +0100 90) error = -EINVAL;
9453615a1a7ef fs/gfs2/file.c (Steven Whitehouse 2011-08-23 10:19:25 +0100 91) }
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 92)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 93) return error;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 94) }
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 95)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 96) /**
d81a8ef59802d fs/gfs2/file.c (Al Viro 2013-05-16 14:14:48 -0400 97) * gfs2_readdir - Iterator for a directory
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 98) * @file: The directory to read from
d81a8ef59802d fs/gfs2/file.c (Al Viro 2013-05-16 14:14:48 -0400 99) * @ctx: What to feed directory entries to
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 100) *
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 101) * Returns: errno
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 102) */
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 103)
d81a8ef59802d fs/gfs2/file.c (Al Viro 2013-05-16 14:14:48 -0400 104) static int gfs2_readdir(struct file *file, struct dir_context *ctx)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 105) {
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 106) struct inode *dir = file->f_mapping->host;
feaa7bba026c1 fs/gfs2/ops_file.c (Steven Whitehouse 2006-06-14 15:32:57 -0400 107) struct gfs2_inode *dip = GFS2_I(dir);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 108) struct gfs2_holder d_gh;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 109) int error;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 110)
d81a8ef59802d fs/gfs2/file.c (Al Viro 2013-05-16 14:14:48 -0400 111) error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0, &d_gh);
d81a8ef59802d fs/gfs2/file.c (Al Viro 2013-05-16 14:14:48 -0400 112) if (error)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 113) return error;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 114)
d81a8ef59802d fs/gfs2/file.c (Al Viro 2013-05-16 14:14:48 -0400 115) error = gfs2_dir_read(dir, ctx, &file->f_ra);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 116)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 117) gfs2_glock_dq_uninit(&d_gh);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 118)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 119) return error;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 120) }
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 121)
c551f66c5dfef fs/gfs2/file.c (Lee Jones 2021-03-30 17:44:29 +0100 122) /*
c551f66c5dfef fs/gfs2/file.c (Lee Jones 2021-03-30 17:44:29 +0100 123) * struct fsflag_gfs2flag
128e5ebaf8abb fs/gfs2/ops_file.c (Steven Whitehouse 2006-10-02 11:24:43 -0400 124) *
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 125) * The FS_JOURNAL_DATA_FL flag maps to GFS2_DIF_INHERIT_JDATA for directories,
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 126) * and to GFS2_DIF_JDATA for non-directories.
128e5ebaf8abb fs/gfs2/ops_file.c (Steven Whitehouse 2006-10-02 11:24:43 -0400 127) */
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 128) static struct {
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 129) u32 fsflag;
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 130) u32 gfsflag;
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 131) } fsflag_gfs2flag[] = {
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 132) {FS_SYNC_FL, GFS2_DIF_SYNC},
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 133) {FS_IMMUTABLE_FL, GFS2_DIF_IMMUTABLE},
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 134) {FS_APPEND_FL, GFS2_DIF_APPENDONLY},
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 135) {FS_NOATIME_FL, GFS2_DIF_NOATIME},
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 136) {FS_INDEX_FL, GFS2_DIF_EXHASH},
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 137) {FS_TOPDIR_FL, GFS2_DIF_TOPDIR},
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 138) {FS_JOURNAL_DATA_FL, GFS2_DIF_JDATA | GFS2_DIF_INHERIT_JDATA},
7ea9ea832212c fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-31 15:01:28 -0500 139) };
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 140)
5aca284210ce8 fs/gfs2/file.c (Darrick J. Wong 2019-07-01 08:25:34 -0700 141) static inline u32 gfs2_gfsflags_to_fsflags(struct inode *inode, u32 gfsflags)
5aca284210ce8 fs/gfs2/file.c (Darrick J. Wong 2019-07-01 08:25:34 -0700 142) {
5aca284210ce8 fs/gfs2/file.c (Darrick J. Wong 2019-07-01 08:25:34 -0700 143) int i;
5aca284210ce8 fs/gfs2/file.c (Darrick J. Wong 2019-07-01 08:25:34 -0700 144) u32 fsflags = 0;
5aca284210ce8 fs/gfs2/file.c (Darrick J. Wong 2019-07-01 08:25:34 -0700 145)
5aca284210ce8 fs/gfs2/file.c (Darrick J. Wong 2019-07-01 08:25:34 -0700 146) if (S_ISDIR(inode->i_mode))
5aca284210ce8 fs/gfs2/file.c (Darrick J. Wong 2019-07-01 08:25:34 -0700 147) gfsflags &= ~GFS2_DIF_JDATA;
5aca284210ce8 fs/gfs2/file.c (Darrick J. Wong 2019-07-01 08:25:34 -0700 148) else
5aca284210ce8 fs/gfs2/file.c (Darrick J. Wong 2019-07-01 08:25:34 -0700 149) gfsflags &= ~GFS2_DIF_INHERIT_JDATA;
5aca284210ce8 fs/gfs2/file.c (Darrick J. Wong 2019-07-01 08:25:34 -0700 150)
5aca284210ce8 fs/gfs2/file.c (Darrick J. Wong 2019-07-01 08:25:34 -0700 151) for (i = 0; i < ARRAY_SIZE(fsflag_gfs2flag); i++)
5aca284210ce8 fs/gfs2/file.c (Darrick J. Wong 2019-07-01 08:25:34 -0700 152) if (gfsflags & fsflag_gfs2flag[i].gfsflag)
5aca284210ce8 fs/gfs2/file.c (Darrick J. Wong 2019-07-01 08:25:34 -0700 153) fsflags |= fsflag_gfs2flag[i].fsflag;
5aca284210ce8 fs/gfs2/file.c (Darrick J. Wong 2019-07-01 08:25:34 -0700 154) return fsflags;
5aca284210ce8 fs/gfs2/file.c (Darrick J. Wong 2019-07-01 08:25:34 -0700 155) }
5aca284210ce8 fs/gfs2/file.c (Darrick J. Wong 2019-07-01 08:25:34 -0700 156)
88b631cbfbeb4 fs/gfs2/file.c (Miklos Szeredi 2021-04-07 14:36:43 +0200 157) int gfs2_fileattr_get(struct dentry *dentry, struct fileattr *fa)
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 158) {
88b631cbfbeb4 fs/gfs2/file.c (Miklos Szeredi 2021-04-07 14:36:43 +0200 159) struct inode *inode = d_inode(dentry);
feaa7bba026c1 fs/gfs2/ops_file.c (Steven Whitehouse 2006-06-14 15:32:57 -0400 160) struct gfs2_inode *ip = GFS2_I(inode);
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 161) struct gfs2_holder gh;
5aca284210ce8 fs/gfs2/file.c (Darrick J. Wong 2019-07-01 08:25:34 -0700 162) int error;
5aca284210ce8 fs/gfs2/file.c (Darrick J. Wong 2019-07-01 08:25:34 -0700 163) u32 fsflags;
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 164)
88b631cbfbeb4 fs/gfs2/file.c (Miklos Szeredi 2021-04-07 14:36:43 +0200 165) if (d_is_special(dentry))
88b631cbfbeb4 fs/gfs2/file.c (Miklos Szeredi 2021-04-07 14:36:43 +0200 166) return -ENOTTY;
88b631cbfbeb4 fs/gfs2/file.c (Miklos Szeredi 2021-04-07 14:36:43 +0200 167)
719ee344675c2 fs/gfs2/ops_file.c (Steven Whitehouse 2008-09-18 13:53:59 +0100 168) gfs2_holder_init(ip->i_gl, LM_ST_SHARED, 0, &gh);
719ee344675c2 fs/gfs2/ops_file.c (Steven Whitehouse 2008-09-18 13:53:59 +0100 169) error = gfs2_glock_nq(&gh);
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 170) if (error)
9c7fe83530a35 fs/gfs2/file.c (Daniel DeFreez 2016-04-19 19:57:45 -0400 171) goto out_uninit;
907b9bceb41fa fs/gfs2/ops_file.c (Steven Whitehouse 2006-09-25 09:26:04 -0400 172)
5aca284210ce8 fs/gfs2/file.c (Darrick J. Wong 2019-07-01 08:25:34 -0700 173) fsflags = gfs2_gfsflags_to_fsflags(inode, ip->i_diskflags);
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 174)
88b631cbfbeb4 fs/gfs2/file.c (Miklos Szeredi 2021-04-07 14:36:43 +0200 175) fileattr_fill_flags(fa, fsflags);
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 176)
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 177) gfs2_glock_dq(&gh);
9c7fe83530a35 fs/gfs2/file.c (Daniel DeFreez 2016-04-19 19:57:45 -0400 178) out_uninit:
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 179) gfs2_holder_uninit(&gh);
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 180) return error;
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 181) }
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 182)
6b124d8dba1f4 fs/gfs2/ops_file.c (Steven Whitehouse 2006-11-08 12:51:06 -0500 183) void gfs2_set_inode_flags(struct inode *inode)
6b124d8dba1f4 fs/gfs2/ops_file.c (Steven Whitehouse 2006-11-08 12:51:06 -0500 184) {
6b124d8dba1f4 fs/gfs2/ops_file.c (Steven Whitehouse 2006-11-08 12:51:06 -0500 185) struct gfs2_inode *ip = GFS2_I(inode);
6b124d8dba1f4 fs/gfs2/ops_file.c (Steven Whitehouse 2006-11-08 12:51:06 -0500 186) unsigned int flags = inode->i_flags;
6b124d8dba1f4 fs/gfs2/ops_file.c (Steven Whitehouse 2006-11-08 12:51:06 -0500 187)
9964afbb79732 fs/gfs2/file.c (Steven Whitehouse 2011-06-16 14:06:55 +0100 188) flags &= ~(S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME|S_DIRSYNC|S_NOSEC);
9964afbb79732 fs/gfs2/file.c (Steven Whitehouse 2011-06-16 14:06:55 +0100 189) if ((ip->i_eattr == 0) && !is_sxid(inode->i_mode))
01e64ee40ad74 fs/gfs2/file.c (Benjamin Marzinski 2015-05-05 12:25:48 -0500 190) flags |= S_NOSEC;
383f01fbf4a70 fs/gfs2/ops_file.c (Steven Whitehouse 2008-11-04 10:05:22 +0000 191) if (ip->i_diskflags & GFS2_DIF_IMMUTABLE)
6b124d8dba1f4 fs/gfs2/ops_file.c (Steven Whitehouse 2006-11-08 12:51:06 -0500 192) flags |= S_IMMUTABLE;
383f01fbf4a70 fs/gfs2/ops_file.c (Steven Whitehouse 2008-11-04 10:05:22 +0000 193) if (ip->i_diskflags & GFS2_DIF_APPENDONLY)
6b124d8dba1f4 fs/gfs2/ops_file.c (Steven Whitehouse 2006-11-08 12:51:06 -0500 194) flags |= S_APPEND;
383f01fbf4a70 fs/gfs2/ops_file.c (Steven Whitehouse 2008-11-04 10:05:22 +0000 195) if (ip->i_diskflags & GFS2_DIF_NOATIME)
6b124d8dba1f4 fs/gfs2/ops_file.c (Steven Whitehouse 2006-11-08 12:51:06 -0500 196) flags |= S_NOATIME;
383f01fbf4a70 fs/gfs2/ops_file.c (Steven Whitehouse 2008-11-04 10:05:22 +0000 197) if (ip->i_diskflags & GFS2_DIF_SYNC)
6b124d8dba1f4 fs/gfs2/ops_file.c (Steven Whitehouse 2006-11-08 12:51:06 -0500 198) flags |= S_SYNC;
6b124d8dba1f4 fs/gfs2/ops_file.c (Steven Whitehouse 2006-11-08 12:51:06 -0500 199) inode->i_flags = flags;
6b124d8dba1f4 fs/gfs2/ops_file.c (Steven Whitehouse 2006-11-08 12:51:06 -0500 200) }
6b124d8dba1f4 fs/gfs2/ops_file.c (Steven Whitehouse 2006-11-08 12:51:06 -0500 201)
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 202) /* Flags that can be set by user space */
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 203) #define GFS2_FLAGS_USER_SET (GFS2_DIF_JDATA| \
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 204) GFS2_DIF_IMMUTABLE| \
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 205) GFS2_DIF_APPENDONLY| \
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 206) GFS2_DIF_NOATIME| \
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 207) GFS2_DIF_SYNC| \
23d0bb834e264 fs/gfs2/file.c (Steven Whitehouse 2012-05-28 15:26:56 +0100 208) GFS2_DIF_TOPDIR| \
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 209) GFS2_DIF_INHERIT_JDATA)
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 210)
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 211) /**
9dd868e1c009f fs/gfs2/file.c (Fabian Frederick 2014-05-15 18:57:08 +0200 212) * do_gfs2_set_flags - set flags on an inode
9dd868e1c009f fs/gfs2/file.c (Fabian Frederick 2014-05-15 18:57:08 +0200 213) * @filp: file pointer
9dd868e1c009f fs/gfs2/file.c (Fabian Frederick 2014-05-15 18:57:08 +0200 214) * @reqflags: The flags to set
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 215) * @mask: Indicates which flags are valid
5aca284210ce8 fs/gfs2/file.c (Darrick J. Wong 2019-07-01 08:25:34 -0700 216) * @fsflags: The FS_* inode flags passed in
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 217) *
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 218) */
88b631cbfbeb4 fs/gfs2/file.c (Miklos Szeredi 2021-04-07 14:36:43 +0200 219) static int do_gfs2_set_flags(struct inode *inode, u32 reqflags, u32 mask,
5aca284210ce8 fs/gfs2/file.c (Darrick J. Wong 2019-07-01 08:25:34 -0700 220) const u32 fsflags)
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 221) {
feaa7bba026c1 fs/gfs2/ops_file.c (Steven Whitehouse 2006-06-14 15:32:57 -0400 222) struct gfs2_inode *ip = GFS2_I(inode);
feaa7bba026c1 fs/gfs2/ops_file.c (Steven Whitehouse 2006-06-14 15:32:57 -0400 223) struct gfs2_sbd *sdp = GFS2_SB(inode);
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 224) struct buffer_head *bh;
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 225) struct gfs2_holder gh;
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 226) int error;
88b631cbfbeb4 fs/gfs2/file.c (Miklos Szeredi 2021-04-07 14:36:43 +0200 227) u32 new_flags, flags;
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 228)
f58ba889106af fs/gfs2/ops_file.c (Miklos Szeredi 2008-07-02 21:12:01 +0200 229) error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
f58ba889106af fs/gfs2/ops_file.c (Miklos Szeredi 2008-07-02 21:12:01 +0200 230) if (error)
88b631cbfbeb4 fs/gfs2/file.c (Miklos Szeredi 2021-04-07 14:36:43 +0200 231) return error;
7df0e0397b9a1 fs/gfs2/file.c (Steven Whitehouse 2010-05-24 14:36:48 +0100 232)
7df0e0397b9a1 fs/gfs2/file.c (Steven Whitehouse 2010-05-24 14:36:48 +0100 233) error = 0;
383f01fbf4a70 fs/gfs2/ops_file.c (Steven Whitehouse 2008-11-04 10:05:22 +0000 234) flags = ip->i_diskflags;
55eccc6d00cea fs/gfs2/ops_file.c (Steven Whitehouse 2006-04-04 14:29:30 -0400 235) new_flags = (flags & ~mask) | (reqflags & mask);
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 236) if ((new_flags ^ flags) == 0)
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 237) goto out;
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 238)
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 239) error = -EPERM;
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 240) if (IS_IMMUTABLE(inode) && (new_flags & GFS2_DIF_IMMUTABLE))
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 241) goto out;
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 242) if (IS_APPEND(inode) && (new_flags & GFS2_DIF_APPENDONLY))
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 243) goto out;
b9cb981310bc2 fs/gfs2/ops_file.c (Steven Whitehouse 2006-05-12 17:07:56 -0400 244) if (!IS_IMMUTABLE(inode)) {
549c7297717c3 fs/gfs2/file.c (Christian Brauner 2021-01-21 14:19:43 +0100 245) error = gfs2_permission(&init_user_ns, inode, MAY_WRITE);
b9cb981310bc2 fs/gfs2/ops_file.c (Steven Whitehouse 2006-05-12 17:07:56 -0400 246) if (error)
b9cb981310bc2 fs/gfs2/ops_file.c (Steven Whitehouse 2006-05-12 17:07:56 -0400 247) goto out;
b9cb981310bc2 fs/gfs2/ops_file.c (Steven Whitehouse 2006-05-12 17:07:56 -0400 248) }
5561093e2cac9 fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-17 08:47:38 +0100 249) if ((flags ^ new_flags) & GFS2_DIF_JDATA) {
cc555b09d8c38 fs/gfs2/file.c (Bob Peterson 2017-09-20 08:30:04 -0500 250) if (new_flags & GFS2_DIF_JDATA)
c1696fb85d331 fs/gfs2/file.c (Bob Peterson 2018-01-17 00:01:33 +0100 251) gfs2_log_flush(sdp, ip->i_gl,
805c090750a31 fs/gfs2/file.c (Bob Peterson 2018-01-08 10:34:17 -0500 252) GFS2_LOG_HEAD_FLUSH_NORMAL |
805c090750a31 fs/gfs2/file.c (Bob Peterson 2018-01-08 10:34:17 -0500 253) GFS2_LFC_SET_FLAGS);
5561093e2cac9 fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-17 08:47:38 +0100 254) error = filemap_fdatawrite(inode->i_mapping);
5561093e2cac9 fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-17 08:47:38 +0100 255) if (error)
5561093e2cac9 fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-17 08:47:38 +0100 256) goto out;
5561093e2cac9 fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-17 08:47:38 +0100 257) error = filemap_fdatawait(inode->i_mapping);
5561093e2cac9 fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-17 08:47:38 +0100 258) if (error)
5561093e2cac9 fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-17 08:47:38 +0100 259) goto out;
cc555b09d8c38 fs/gfs2/file.c (Bob Peterson 2017-09-20 08:30:04 -0500 260) if (new_flags & GFS2_DIF_JDATA)
cc555b09d8c38 fs/gfs2/file.c (Bob Peterson 2017-09-20 08:30:04 -0500 261) gfs2_ordered_del_inode(ip);
5561093e2cac9 fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-17 08:47:38 +0100 262) }
55eccc6d00cea fs/gfs2/ops_file.c (Steven Whitehouse 2006-04-04 14:29:30 -0400 263) error = gfs2_trans_begin(sdp, RES_DINODE, 0);
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 264) if (error)
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 265) goto out;
55eccc6d00cea fs/gfs2/ops_file.c (Steven Whitehouse 2006-04-04 14:29:30 -0400 266) error = gfs2_meta_inode_buffer(ip, &bh);
55eccc6d00cea fs/gfs2/ops_file.c (Steven Whitehouse 2006-04-04 14:29:30 -0400 267) if (error)
55eccc6d00cea fs/gfs2/ops_file.c (Steven Whitehouse 2006-04-04 14:29:30 -0400 268) goto out_trans_end;
9b7c2ddb453e0 fs/gfs2/file.c (Andreas Gruenbacher 2017-09-22 08:29:19 -0500 269) inode->i_ctime = current_time(inode);
350a9b0a7269c fs/gfs2/file.c (Steven Whitehouse 2012-12-14 12:36:02 +0000 270) gfs2_trans_add_meta(ip->i_gl, bh);
383f01fbf4a70 fs/gfs2/ops_file.c (Steven Whitehouse 2008-11-04 10:05:22 +0000 271) ip->i_diskflags = new_flags;
539e5d6b7ae86 fs/gfs2/ops_file.c (Steven Whitehouse 2006-10-31 15:07:05 -0500 272) gfs2_dinode_out(ip, bh->b_data);
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 273) brelse(bh);
6b124d8dba1f4 fs/gfs2/ops_file.c (Steven Whitehouse 2006-11-08 12:51:06 -0500 274) gfs2_set_inode_flags(inode);
5561093e2cac9 fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-17 08:47:38 +0100 275) gfs2_set_aops(inode);
55eccc6d00cea fs/gfs2/ops_file.c (Steven Whitehouse 2006-04-04 14:29:30 -0400 276) out_trans_end:
55eccc6d00cea fs/gfs2/ops_file.c (Steven Whitehouse 2006-04-04 14:29:30 -0400 277) gfs2_trans_end(sdp);
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 278) out:
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 279) gfs2_glock_dq_uninit(&gh);
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 280) return error;
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 281) }
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 282)
88b631cbfbeb4 fs/gfs2/file.c (Miklos Szeredi 2021-04-07 14:36:43 +0200 283) int gfs2_fileattr_set(struct user_namespace *mnt_userns,
88b631cbfbeb4 fs/gfs2/file.c (Miklos Szeredi 2021-04-07 14:36:43 +0200 284) struct dentry *dentry, struct fileattr *fa)
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 285) {
88b631cbfbeb4 fs/gfs2/file.c (Miklos Szeredi 2021-04-07 14:36:43 +0200 286) struct inode *inode = d_inode(dentry);
88b631cbfbeb4 fs/gfs2/file.c (Miklos Szeredi 2021-04-07 14:36:43 +0200 287) u32 fsflags = fa->flags, gfsflags = 0;
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 288) u32 mask;
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 289) int i;
7df0e0397b9a1 fs/gfs2/file.c (Steven Whitehouse 2010-05-24 14:36:48 +0100 290)
88b631cbfbeb4 fs/gfs2/file.c (Miklos Szeredi 2021-04-07 14:36:43 +0200 291) if (d_is_special(dentry))
88b631cbfbeb4 fs/gfs2/file.c (Miklos Szeredi 2021-04-07 14:36:43 +0200 292) return -ENOTTY;
88b631cbfbeb4 fs/gfs2/file.c (Miklos Szeredi 2021-04-07 14:36:43 +0200 293)
88b631cbfbeb4 fs/gfs2/file.c (Miklos Szeredi 2021-04-07 14:36:43 +0200 294) if (fileattr_has_fsx(fa))
88b631cbfbeb4 fs/gfs2/file.c (Miklos Szeredi 2021-04-07 14:36:43 +0200 295) return -EOPNOTSUPP;
7df0e0397b9a1 fs/gfs2/file.c (Steven Whitehouse 2010-05-24 14:36:48 +0100 296)
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 297) for (i = 0; i < ARRAY_SIZE(fsflag_gfs2flag); i++) {
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 298) if (fsflags & fsflag_gfs2flag[i].fsflag) {
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 299) fsflags &= ~fsflag_gfs2flag[i].fsflag;
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 300) gfsflags |= fsflag_gfs2flag[i].gfsflag;
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 301) }
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 302) }
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 303) if (fsflags || gfsflags & ~GFS2_FLAGS_USER_SET)
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 304) return -EINVAL;
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 305)
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 306) mask = GFS2_FLAGS_USER_SET;
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 307) if (S_ISDIR(inode->i_mode)) {
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 308) mask &= ~GFS2_DIF_JDATA;
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 309) } else {
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 310) /* The GFS2_DIF_TOPDIR flag is only valid for directories. */
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 311) if (gfsflags & GFS2_DIF_TOPDIR)
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 312) return -EINVAL;
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 313) mask &= ~(GFS2_DIF_TOPDIR | GFS2_DIF_INHERIT_JDATA);
b9af7ca6d37d5 fs/gfs2/ops_file.c (Steven Whitehouse 2007-07-18 11:40:06 +0100 314) }
b16f7e57b7811 fs/gfs2/file.c (Andreas Gruenbacher 2017-10-09 16:15:30 +0200 315)
88b631cbfbeb4 fs/gfs2/file.c (Miklos Szeredi 2021-04-07 14:36:43 +0200 316) return do_gfs2_set_flags(inode, gfsflags, mask, fsflags);
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 317) }
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 318)
6ddc5c3ddf256 fs/gfs2/file.c (Steve Whitehouse 2018-10-08 14:32:35 -0500 319) static int gfs2_getlabel(struct file *filp, char __user *label)
6ddc5c3ddf256 fs/gfs2/file.c (Steve Whitehouse 2018-10-08 14:32:35 -0500 320) {
6ddc5c3ddf256 fs/gfs2/file.c (Steve Whitehouse 2018-10-08 14:32:35 -0500 321) struct inode *inode = file_inode(filp);
6ddc5c3ddf256 fs/gfs2/file.c (Steve Whitehouse 2018-10-08 14:32:35 -0500 322) struct gfs2_sbd *sdp = GFS2_SB(inode);
6ddc5c3ddf256 fs/gfs2/file.c (Steve Whitehouse 2018-10-08 14:32:35 -0500 323)
6ddc5c3ddf256 fs/gfs2/file.c (Steve Whitehouse 2018-10-08 14:32:35 -0500 324) if (copy_to_user(label, sdp->sd_sb.sb_locktable, GFS2_LOCKNAME_LEN))
6ddc5c3ddf256 fs/gfs2/file.c (Steve Whitehouse 2018-10-08 14:32:35 -0500 325) return -EFAULT;
6ddc5c3ddf256 fs/gfs2/file.c (Steve Whitehouse 2018-10-08 14:32:35 -0500 326)
6ddc5c3ddf256 fs/gfs2/file.c (Steve Whitehouse 2018-10-08 14:32:35 -0500 327) return 0;
6ddc5c3ddf256 fs/gfs2/file.c (Steve Whitehouse 2018-10-08 14:32:35 -0500 328) }
6ddc5c3ddf256 fs/gfs2/file.c (Steve Whitehouse 2018-10-08 14:32:35 -0500 329)
b09e593d79956 fs/gfs2/ops_file.c (Steven Whitehouse 2006-04-07 11:17:32 -0400 330) static long gfs2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 331) {
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 332) switch(cmd) {
66fc061bda352 fs/gfs2/file.c (Steven Whitehouse 2012-02-08 12:58:32 +0000 333) case FITRIM:
66fc061bda352 fs/gfs2/file.c (Steven Whitehouse 2012-02-08 12:58:32 +0000 334) return gfs2_fitrim(filp, (void __user *)arg);
6ddc5c3ddf256 fs/gfs2/file.c (Steve Whitehouse 2018-10-08 14:32:35 -0500 335) case FS_IOC_GETFSLABEL:
6ddc5c3ddf256 fs/gfs2/file.c (Steve Whitehouse 2018-10-08 14:32:35 -0500 336) return gfs2_getlabel(filp, (char __user *)arg);
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 337) }
6ddc5c3ddf256 fs/gfs2/file.c (Steve Whitehouse 2018-10-08 14:32:35 -0500 338)
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 339) return -ENOTTY;
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 340) }
71b86f562b5eb fs/gfs2/ops_file.c (Steven Whitehouse 2006-03-28 14:14:04 -0500 341)
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 342) #ifdef CONFIG_COMPAT
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 343) static long gfs2_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 344) {
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 345) switch(cmd) {
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 346) /* Keep this list in sync with gfs2_ioctl */
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 347) case FITRIM:
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 348) case FS_IOC_GETFSLABEL:
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 349) break;
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 350) default:
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 351) return -ENOIOCTLCMD;
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 352) }
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 353)
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 354) return gfs2_ioctl(filp, cmd, (unsigned long)compat_ptr(arg));
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 355) }
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 356) #else
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 357) #define gfs2_compat_ioctl NULL
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 358) #endif
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 359)
da1dfb6af849c fs/gfs2/file.c (Steven Whitehouse 2012-07-26 11:30:54 +0100 360) /**
da1dfb6af849c fs/gfs2/file.c (Steven Whitehouse 2012-07-26 11:30:54 +0100 361) * gfs2_size_hint - Give a hint to the size of a write request
9dd868e1c009f fs/gfs2/file.c (Fabian Frederick 2014-05-15 18:57:08 +0200 362) * @filep: The struct file
da1dfb6af849c fs/gfs2/file.c (Steven Whitehouse 2012-07-26 11:30:54 +0100 363) * @offset: The file offset of the write
da1dfb6af849c fs/gfs2/file.c (Steven Whitehouse 2012-07-26 11:30:54 +0100 364) * @size: The length of the write
da1dfb6af849c fs/gfs2/file.c (Steven Whitehouse 2012-07-26 11:30:54 +0100 365) *
da1dfb6af849c fs/gfs2/file.c (Steven Whitehouse 2012-07-26 11:30:54 +0100 366) * When we are about to do a write, this function records the total
da1dfb6af849c fs/gfs2/file.c (Steven Whitehouse 2012-07-26 11:30:54 +0100 367) * write size in order to provide a suitable hint to the lower layers
da1dfb6af849c fs/gfs2/file.c (Steven Whitehouse 2012-07-26 11:30:54 +0100 368) * about how many blocks will be required.
da1dfb6af849c fs/gfs2/file.c (Steven Whitehouse 2012-07-26 11:30:54 +0100 369) *
da1dfb6af849c fs/gfs2/file.c (Steven Whitehouse 2012-07-26 11:30:54 +0100 370) */
da1dfb6af849c fs/gfs2/file.c (Steven Whitehouse 2012-07-26 11:30:54 +0100 371)
da1dfb6af849c fs/gfs2/file.c (Steven Whitehouse 2012-07-26 11:30:54 +0100 372) static void gfs2_size_hint(struct file *filep, loff_t offset, size_t size)
da1dfb6af849c fs/gfs2/file.c (Steven Whitehouse 2012-07-26 11:30:54 +0100 373) {
496ad9aa8ef44 fs/gfs2/file.c (Al Viro 2013-01-23 17:07:38 -0500 374) struct inode *inode = file_inode(filep);
da1dfb6af849c fs/gfs2/file.c (Steven Whitehouse 2012-07-26 11:30:54 +0100 375) struct gfs2_sbd *sdp = GFS2_SB(inode);
da1dfb6af849c fs/gfs2/file.c (Steven Whitehouse 2012-07-26 11:30:54 +0100 376) struct gfs2_inode *ip = GFS2_I(inode);
da1dfb6af849c fs/gfs2/file.c (Steven Whitehouse 2012-07-26 11:30:54 +0100 377) size_t blks = (size + sdp->sd_sb.sb_bsize - 1) >> sdp->sd_sb.sb_bsize_shift;
da1dfb6af849c fs/gfs2/file.c (Steven Whitehouse 2012-07-26 11:30:54 +0100 378) int hint = min_t(size_t, INT_MAX, blks);
da1dfb6af849c fs/gfs2/file.c (Steven Whitehouse 2012-07-26 11:30:54 +0100 379)
21f09c4395c95 fs/gfs2/file.c (Andreas Gruenbacher 2018-08-30 16:01:50 +0100 380) if (hint > atomic_read(&ip->i_sizehint))
21f09c4395c95 fs/gfs2/file.c (Andreas Gruenbacher 2018-08-30 16:01:50 +0100 381) atomic_set(&ip->i_sizehint, hint);
da1dfb6af849c fs/gfs2/file.c (Steven Whitehouse 2012-07-26 11:30:54 +0100 382) }
da1dfb6af849c fs/gfs2/file.c (Steven Whitehouse 2012-07-26 11:30:54 +0100 383)
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 384) /**
35af80aef99b3 fs/gfs2/file.c (Christoph Hellwig 2019-07-01 23:54:38 +0200 385) * gfs2_allocate_page_backing - Allocate blocks for a write fault
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 386) * @page: The (locked) page to allocate backing for
f53056c430632 fs/gfs2/file.c (Andreas Gruenbacher 2019-11-07 18:06:14 +0000 387) * @length: Size of the allocation
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 388) *
35af80aef99b3 fs/gfs2/file.c (Christoph Hellwig 2019-07-01 23:54:38 +0200 389) * We try to allocate all the blocks required for the page in one go. This
35af80aef99b3 fs/gfs2/file.c (Christoph Hellwig 2019-07-01 23:54:38 +0200 390) * might fail for various reasons, so we keep trying until all the blocks to
35af80aef99b3 fs/gfs2/file.c (Christoph Hellwig 2019-07-01 23:54:38 +0200 391) * back this page are allocated. If some of the blocks are already allocated,
35af80aef99b3 fs/gfs2/file.c (Christoph Hellwig 2019-07-01 23:54:38 +0200 392) * that is ok too.
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 393) */
f53056c430632 fs/gfs2/file.c (Andreas Gruenbacher 2019-11-07 18:06:14 +0000 394) static int gfs2_allocate_page_backing(struct page *page, unsigned int length)
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 395) {
35af80aef99b3 fs/gfs2/file.c (Christoph Hellwig 2019-07-01 23:54:38 +0200 396) u64 pos = page_offset(page);
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 397)
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 398) do {
35af80aef99b3 fs/gfs2/file.c (Christoph Hellwig 2019-07-01 23:54:38 +0200 399) struct iomap iomap = { };
35af80aef99b3 fs/gfs2/file.c (Christoph Hellwig 2019-07-01 23:54:38 +0200 400)
54992257fe4bb fs/gfs2/file.c (Andreas Gruenbacher 2021-03-27 21:56:40 +0100 401) if (gfs2_iomap_alloc(page->mapping->host, pos, length, &iomap))
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 402) return -EIO;
35af80aef99b3 fs/gfs2/file.c (Christoph Hellwig 2019-07-01 23:54:38 +0200 403)
f53056c430632 fs/gfs2/file.c (Andreas Gruenbacher 2019-11-07 18:06:14 +0000 404) if (length < iomap.length)
f53056c430632 fs/gfs2/file.c (Andreas Gruenbacher 2019-11-07 18:06:14 +0000 405) iomap.length = length;
f53056c430632 fs/gfs2/file.c (Andreas Gruenbacher 2019-11-07 18:06:14 +0000 406) length -= iomap.length;
35af80aef99b3 fs/gfs2/file.c (Christoph Hellwig 2019-07-01 23:54:38 +0200 407) pos += iomap.length;
f53056c430632 fs/gfs2/file.c (Andreas Gruenbacher 2019-11-07 18:06:14 +0000 408) } while (length > 0);
35af80aef99b3 fs/gfs2/file.c (Christoph Hellwig 2019-07-01 23:54:38 +0200 409)
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 410) return 0;
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 411) }
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 412)
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 413) /**
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 414) * gfs2_page_mkwrite - Make a shared, mmap()ed, page writable
9dd868e1c009f fs/gfs2/file.c (Fabian Frederick 2014-05-15 18:57:08 +0200 415) * @vmf: The virtual memory fault containing the page to become writable
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 416) *
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 417) * When the page becomes writable, we need to ensure that we have
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 418) * blocks allocated on disk to back that page.
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 419) */
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 420)
109dbb1e6f27f fs/gfs2/file.c (Souptick Joarder 2018-07-02 22:16:13 +0530 421) static vm_fault_t gfs2_page_mkwrite(struct vm_fault *vmf)
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 422) {
c2ec175c39f62 fs/gfs2/ops_file.c (Nicholas Piggin 2009-03-31 15:23:21 -0700 423) struct page *page = vmf->page;
11bac80004499 fs/gfs2/file.c (Dave Jiang 2017-02-24 14:56:41 -0800 424) struct inode *inode = file_inode(vmf->vma->vm_file);
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 425) struct gfs2_inode *ip = GFS2_I(inode);
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 426) struct gfs2_sbd *sdp = GFS2_SB(inode);
7b9cff467144c fs/gfs2/file.c (Steven Whitehouse 2013-10-02 11:13:25 +0100 427) struct gfs2_alloc_parms ap = { .aflags = 0, };
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 428) u64 offset = page_offset(page);
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 429) unsigned int data_blocks, ind_blocks, rblocks;
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 430) struct gfs2_holder gh;
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 431) unsigned int length;
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 432) loff_t size;
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 433) int ret;
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 434)
39263d5e71d0f fs/gfs2/file.c (Jan Kara 2012-06-12 16:20:41 +0200 435) sb_start_pagefault(inode->i_sb);
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 436)
719ee344675c2 fs/gfs2/ops_file.c (Steven Whitehouse 2008-09-18 13:53:59 +0100 437) gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
719ee344675c2 fs/gfs2/ops_file.c (Steven Whitehouse 2008-09-18 13:53:59 +0100 438) ret = gfs2_glock_nq(&gh);
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 439) if (ret)
2b3dcf35810ff fs/gfs2/file.c (Bob Peterson 2013-05-28 10:04:44 -0400 440) goto out_uninit;
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 441)
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 442) /* Check page index against inode size */
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 443) size = i_size_read(inode);
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 444) if (offset >= size) {
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 445) ret = -EINVAL;
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 446) goto out_unlock;
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 447) }
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 448)
d7c436cd605eb fs/gfs2/file.c (Andreas Gruenbacher 2016-09-26 13:20:19 -0500 449) /* Update file times before taking page lock */
11bac80004499 fs/gfs2/file.c (Dave Jiang 2017-02-24 14:56:41 -0800 450) file_update_time(vmf->vma->vm_file);
d7c436cd605eb fs/gfs2/file.c (Andreas Gruenbacher 2016-09-26 13:20:19 -0500 451)
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 452) /* page is wholly or partially inside EOF */
396a707096cec fs/gfs2/file.c (Andreas Gruenbacher 2021-06-21 22:28:50 +0200 453) if (size - offset < PAGE_SIZE)
396a707096cec fs/gfs2/file.c (Andreas Gruenbacher 2021-06-21 22:28:50 +0200 454) length = size - offset;
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 455) else
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 456) length = PAGE_SIZE;
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 457)
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 458) gfs2_size_hint(vmf->vma->vm_file, offset, length);
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 459)
9c538837d8445 fs/gfs2/ops_file.c (Steven Whitehouse 2009-03-19 13:15:44 +0000 460) set_bit(GLF_DIRTY, &ip->i_gl->gl_flags);
9c538837d8445 fs/gfs2/ops_file.c (Steven Whitehouse 2009-03-19 13:15:44 +0000 461) set_bit(GIF_SW_PAGED, &ip->i_flags);
9c538837d8445 fs/gfs2/ops_file.c (Steven Whitehouse 2009-03-19 13:15:44 +0000 462)
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 463) /*
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 464) * iomap_writepage / iomap_writepages currently don't support inline
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 465) * files, so always unstuff here.
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 466) */
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 467)
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 468) if (!gfs2_is_stuffed(ip) &&
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 469) !gfs2_write_alloc_required(ip, offset, length)) {
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 470) lock_page(page);
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 471) if (!PageUptodate(page) || page->mapping != inode->i_mapping) {
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 472) ret = -EAGAIN;
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 473) unlock_page(page);
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 474) }
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 475) goto out_unlock;
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 476) }
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 477)
5407e24229408 fs/gfs2/file.c (Bob Peterson 2012-05-18 09:28:23 -0400 478) ret = gfs2_rindex_update(sdp);
5407e24229408 fs/gfs2/file.c (Bob Peterson 2012-05-18 09:28:23 -0400 479) if (ret)
6dbd822487d0a fs/gfs2/ops_file.c (Steven Whitehouse 2008-01-10 15:18:55 +0000 480) goto out_unlock;
6dbd822487d0a fs/gfs2/ops_file.c (Steven Whitehouse 2008-01-10 15:18:55 +0000 481)
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 482) gfs2_write_calc_reserv(ip, length, &data_blocks, &ind_blocks);
7b9cff467144c fs/gfs2/file.c (Steven Whitehouse 2013-10-02 11:13:25 +0100 483) ap.target = data_blocks + ind_blocks;
b8fbf471edb3d fs/gfs2/file.c (Abhi Das 2015-03-18 12:03:41 -0500 484) ret = gfs2_quota_lock_check(ip, &ap);
b8fbf471edb3d fs/gfs2/file.c (Abhi Das 2015-03-18 12:03:41 -0500 485) if (ret)
b8fbf471edb3d fs/gfs2/file.c (Abhi Das 2015-03-18 12:03:41 -0500 486) goto out_unlock;
7b9cff467144c fs/gfs2/file.c (Steven Whitehouse 2013-10-02 11:13:25 +0100 487) ret = gfs2_inplace_reserve(ip, &ap);
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 488) if (ret)
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 489) goto out_quota_unlock;
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 490)
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 491) rblocks = RES_DINODE + ind_blocks;
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 492) if (gfs2_is_jdata(ip))
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 493) rblocks += data_blocks ? data_blocks : 1;
bf97b6734e027 fs/gfs2/file.c (Benjamin Marzinski 2010-09-27 16:00:04 -0500 494) if (ind_blocks || data_blocks) {
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 495) rblocks += RES_STATFS + RES_QUOTA;
71f890f7f758f fs/gfs2/file.c (Steven Whitehouse 2012-07-30 14:53:19 +0100 496) rblocks += gfs2_rg_blocks(ip, data_blocks + ind_blocks);
bf97b6734e027 fs/gfs2/file.c (Benjamin Marzinski 2010-09-27 16:00:04 -0500 497) }
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 498) ret = gfs2_trans_begin(sdp, rblocks, 0);
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 499) if (ret)
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 500) goto out_trans_fail;
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 501)
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 502) lock_page(page);
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 503) ret = -EAGAIN;
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 504) /* If truncated, we must retry the operation, we may have raced
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 505) * with the glock demotion code.
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 506) */
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 507) if (!PageUptodate(page) || page->mapping != inode->i_mapping)
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 508) goto out_trans_end;
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 509)
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 510) /* Unstuff, if required, and allocate backing blocks for page */
b7fe2e391ee7b fs/gfs2/ops_file.c (Steven Whitehouse 2008-01-17 15:12:03 +0000 511) ret = 0;
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 512) if (gfs2_is_stuffed(ip))
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 513) ret = gfs2_unstuff_dinode(ip, page);
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 514) if (ret == 0)
184b4e60853df fs/gfs2/file.c (Andreas Gruenbacher 2019-11-06 14:09:25 +0000 515) ret = gfs2_allocate_page_backing(page, length);
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 516)
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 517) out_trans_end:
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 518) if (ret)
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 519) unlock_page(page);
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 520) gfs2_trans_end(sdp);
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 521) out_trans_fail:
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 522) gfs2_inplace_release(ip);
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 523) out_quota_unlock:
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 524) gfs2_quota_unlock(ip);
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 525) out_unlock:
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 526) gfs2_glock_dq(&gh);
2b3dcf35810ff fs/gfs2/file.c (Bob Peterson 2013-05-28 10:04:44 -0400 527) out_uninit:
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 528) gfs2_holder_uninit(&gh);
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 529) if (ret == 0) {
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 530) set_page_dirty(page);
1d1d1a767206f fs/gfs2/file.c (Darrick J. Wong 2013-02-21 16:42:51 -0800 531) wait_for_stable_page(page);
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 532) }
39263d5e71d0f fs/gfs2/file.c (Jan Kara 2012-06-12 16:20:41 +0200 533) sb_end_pagefault(inode->i_sb);
13d921e37174e fs/gfs2/file.c (Steven Whitehouse 2011-09-07 15:12:51 +0100 534) return block_page_mkwrite_return(ret);
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 535) }
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 536)
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 537) static vm_fault_t gfs2_fault(struct vm_fault *vmf)
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 538) {
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 539) struct inode *inode = file_inode(vmf->vma->vm_file);
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 540) struct gfs2_inode *ip = GFS2_I(inode);
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 541) struct gfs2_holder gh;
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 542) vm_fault_t ret;
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 543) int err;
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 544)
d5b8145455c62 fs/gfs2/file.c (Andreas Gruenbacher 2021-06-01 22:53:27 +0200 545) gfs2_holder_init(ip->i_gl, LM_ST_SHARED, 0, &gh);
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 546) err = gfs2_glock_nq(&gh);
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 547) if (err) {
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 548) ret = block_page_mkwrite_return(err);
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 549) goto out_uninit;
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 550) }
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 551) ret = filemap_fault(vmf);
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 552) gfs2_glock_dq(&gh);
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 553) out_uninit:
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 554) gfs2_holder_uninit(&gh);
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 555) return ret;
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 556) }
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 557)
f0f37e2f77731 fs/gfs2/file.c (Alexey Dobriyan 2009-09-27 22:29:37 +0400 558) static const struct vm_operations_struct gfs2_vm_ops = {
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 559) .fault = gfs2_fault,
f1820361f83d5 fs/gfs2/file.c (Kirill A. Shutemov 2014-04-07 15:37:19 -0700 560) .map_pages = filemap_map_pages,
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 561) .page_mkwrite = gfs2_page_mkwrite,
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 562) };
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 563)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 564) /**
c551f66c5dfef fs/gfs2/file.c (Lee Jones 2021-03-30 17:44:29 +0100 565) * gfs2_mmap
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 566) * @file: The file to map
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 567) * @vma: The VMA which described the mapping
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 568) *
48bf2b1711dc4 fs/gfs2/ops_file.c (Steven Whitehouse 2009-04-29 13:59:35 +0100 569) * There is no need to get a lock here unless we should be updating
48bf2b1711dc4 fs/gfs2/ops_file.c (Steven Whitehouse 2009-04-29 13:59:35 +0100 570) * atime. We ignore any locking errors since the only consequence is
48bf2b1711dc4 fs/gfs2/ops_file.c (Steven Whitehouse 2009-04-29 13:59:35 +0100 571) * a missed atime update (which will just be deferred until later).
48bf2b1711dc4 fs/gfs2/ops_file.c (Steven Whitehouse 2009-04-29 13:59:35 +0100 572) *
48bf2b1711dc4 fs/gfs2/ops_file.c (Steven Whitehouse 2009-04-29 13:59:35 +0100 573) * Returns: 0
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 574) */
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 575)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 576) static int gfs2_mmap(struct file *file, struct vm_area_struct *vma)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 577) {
feaa7bba026c1 fs/gfs2/ops_file.c (Steven Whitehouse 2006-06-14 15:32:57 -0400 578) struct gfs2_inode *ip = GFS2_I(file->f_mapping->host);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 579)
b9c93bb7deadc fs/gfs2/file.c (Steven Whitehouse 2011-02-02 14:48:10 +0000 580) if (!(file->f_flags & O_NOATIME) &&
b9c93bb7deadc fs/gfs2/file.c (Steven Whitehouse 2011-02-02 14:48:10 +0000 581) !IS_NOATIME(&ip->i_inode)) {
48bf2b1711dc4 fs/gfs2/ops_file.c (Steven Whitehouse 2009-04-29 13:59:35 +0100 582) struct gfs2_holder i_gh;
48bf2b1711dc4 fs/gfs2/ops_file.c (Steven Whitehouse 2009-04-29 13:59:35 +0100 583) int error;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 584)
3d1626889a64b fs/gfs2/file.c (Benjamin Marzinski 2012-11-06 00:49:28 -0600 585) error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY,
3d1626889a64b fs/gfs2/file.c (Benjamin Marzinski 2012-11-06 00:49:28 -0600 586) &i_gh);
b9c93bb7deadc fs/gfs2/file.c (Steven Whitehouse 2011-02-02 14:48:10 +0000 587) if (error)
b9c93bb7deadc fs/gfs2/file.c (Steven Whitehouse 2011-02-02 14:48:10 +0000 588) return error;
3d1626889a64b fs/gfs2/file.c (Benjamin Marzinski 2012-11-06 00:49:28 -0600 589) /* grab lock to update inode */
3d1626889a64b fs/gfs2/file.c (Benjamin Marzinski 2012-11-06 00:49:28 -0600 590) gfs2_glock_dq_uninit(&i_gh);
3d1626889a64b fs/gfs2/file.c (Benjamin Marzinski 2012-11-06 00:49:28 -0600 591) file_accessed(file);
48bf2b1711dc4 fs/gfs2/ops_file.c (Steven Whitehouse 2009-04-29 13:59:35 +0100 592) }
3cc3f710ce0ef fs/gfs2/ops_file.c (Steven Whitehouse 2007-10-15 15:40:33 +0100 593) vma->vm_ops = &gfs2_vm_ops;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 594)
48bf2b1711dc4 fs/gfs2/ops_file.c (Steven Whitehouse 2009-04-29 13:59:35 +0100 595) return 0;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 596) }
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 597)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 598) /**
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 599) * gfs2_open_common - This is common to open and atomic_open
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 600) * @inode: The inode being opened
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 601) * @file: The file being opened
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 602) *
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 603) * This maybe called under a glock or not depending upon how it has
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 604) * been called. We must always be called under a glock for regular
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 605) * files, however. For other file types, it does not matter whether
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 606) * we hold the glock or not.
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 607) *
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 608) * Returns: Error code or 0 for success
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 609) */
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 610)
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 611) int gfs2_open_common(struct inode *inode, struct file *file)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 612) {
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 613) struct gfs2_file *fp;
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 614) int ret;
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 615)
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 616) if (S_ISREG(inode->i_mode)) {
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 617) ret = generic_file_open(inode, file);
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 618) if (ret)
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 619) return ret;
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 620) }
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 621)
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 622) fp = kzalloc(sizeof(struct gfs2_file), GFP_NOFS);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 623) if (!fp)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 624) return -ENOMEM;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 625)
f55ab26a8f92a fs/gfs2/ops_file.c (Steven Whitehouse 2006-02-21 12:51:39 +0000 626) mutex_init(&fp->f_fl_mutex);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 627)
feaa7bba026c1 fs/gfs2/ops_file.c (Steven Whitehouse 2006-06-14 15:32:57 -0400 628) gfs2_assert_warn(GFS2_SB(inode), !file->private_data);
5c676f6d359b0 fs/gfs2/ops_file.c (Steven Whitehouse 2006-02-27 17:23:27 -0500 629) file->private_data = fp;
2fba46a04c383 fs/gfs2/file.c (Bob Peterson 2020-02-27 12:47:53 -0600 630) if (file->f_mode & FMODE_WRITE) {
2fba46a04c383 fs/gfs2/file.c (Bob Peterson 2020-02-27 12:47:53 -0600 631) ret = gfs2_qa_get(GFS2_I(inode));
2fba46a04c383 fs/gfs2/file.c (Bob Peterson 2020-02-27 12:47:53 -0600 632) if (ret)
2fba46a04c383 fs/gfs2/file.c (Bob Peterson 2020-02-27 12:47:53 -0600 633) goto fail;
2fba46a04c383 fs/gfs2/file.c (Bob Peterson 2020-02-27 12:47:53 -0600 634) }
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 635) return 0;
2fba46a04c383 fs/gfs2/file.c (Bob Peterson 2020-02-27 12:47:53 -0600 636)
2fba46a04c383 fs/gfs2/file.c (Bob Peterson 2020-02-27 12:47:53 -0600 637) fail:
2fba46a04c383 fs/gfs2/file.c (Bob Peterson 2020-02-27 12:47:53 -0600 638) kfree(file->private_data);
2fba46a04c383 fs/gfs2/file.c (Bob Peterson 2020-02-27 12:47:53 -0600 639) file->private_data = NULL;
2fba46a04c383 fs/gfs2/file.c (Bob Peterson 2020-02-27 12:47:53 -0600 640) return ret;
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 641) }
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 642)
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 643) /**
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 644) * gfs2_open - open a file
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 645) * @inode: the inode to open
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 646) * @file: the struct file for this opening
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 647) *
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 648) * After atomic_open, this function is only used for opening files
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 649) * which are already cached. We must still get the glock for regular
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 650) * files to ensure that we have the file size uptodate for the large
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 651) * file check which is in the common code. That is only an issue for
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 652) * regular files though.
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 653) *
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 654) * Returns: errno
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 655) */
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 656)
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 657) static int gfs2_open(struct inode *inode, struct file *file)
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 658) {
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 659) struct gfs2_inode *ip = GFS2_I(inode);
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 660) struct gfs2_holder i_gh;
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 661) int error;
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 662) bool need_unlock = false;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 663)
b60623c238b6a fs/gfs2/ops_file.c (Steven Whitehouse 2006-11-01 12:22:46 -0500 664) if (S_ISREG(ip->i_inode.i_mode)) {
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 665) error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, LM_FLAG_ANY,
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 666) &i_gh);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 667) if (error)
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 668) return error;
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 669) need_unlock = true;
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 670) }
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 671)
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 672) error = gfs2_open_common(inode, file);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 673)
6d4ade986f9c8 fs/gfs2/file.c (Steven Whitehouse 2013-06-14 11:17:15 +0100 674) if (need_unlock)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 675) gfs2_glock_dq_uninit(&i_gh);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 676)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 677) return error;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 678) }
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 679)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 680) /**
df3fd117f9802 fs/gfs2/file.c (Bob Peterson 2012-04-11 12:56:41 -0400 681) * gfs2_release - called to close a struct file
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 682) * @inode: the inode the struct file belongs to
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 683) * @file: the struct file being closed
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 684) *
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 685) * Returns: errno
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 686) */
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 687)
df3fd117f9802 fs/gfs2/file.c (Bob Peterson 2012-04-11 12:56:41 -0400 688) static int gfs2_release(struct inode *inode, struct file *file)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 689) {
0a305e496059a fs/gfs2/file.c (Bob Peterson 2012-06-06 11:17:59 +0100 690) struct gfs2_inode *ip = GFS2_I(inode);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 691)
8e2e00473598d fs/gfs2/file.c (Bob Peterson 2012-07-19 08:12:40 -0400 692) kfree(file->private_data);
5c676f6d359b0 fs/gfs2/ops_file.c (Steven Whitehouse 2006-02-27 17:23:27 -0500 693) file->private_data = NULL;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 694)
0ec9b9ea4f833 fs/gfs2/file.c (Andreas Gruenbacher 2020-10-21 16:37:54 +0200 695) if (gfs2_rs_active(&ip->i_res))
1595548fe72ca fs/gfs2/file.c (Andreas Gruenbacher 2020-03-06 10:32:35 -0600 696) gfs2_rs_delete(ip, &inode->i_writecount);
0ec9b9ea4f833 fs/gfs2/file.c (Andreas Gruenbacher 2020-10-21 16:37:54 +0200 697) if (file->f_mode & FMODE_WRITE)
1595548fe72ca fs/gfs2/file.c (Andreas Gruenbacher 2020-03-06 10:32:35 -0600 698) gfs2_qa_put(ip);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 699) return 0;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 700) }
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 701)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 702) /**
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 703) * gfs2_fsync - sync the dirty data for a file (across the cluster)
02c24a82187d5 fs/gfs2/file.c (Josef Bacik 2011-07-16 20:44:56 -0400 704) * @file: the file that points to the dentry
02c24a82187d5 fs/gfs2/file.c (Josef Bacik 2011-07-16 20:44:56 -0400 705) * @start: the start position in the file to sync
02c24a82187d5 fs/gfs2/file.c (Josef Bacik 2011-07-16 20:44:56 -0400 706) * @end: the end position in the file to sync
dba898b02defa fs/gfs2/file.c (Steven Whitehouse 2011-04-14 09:54:02 +0100 707) * @datasync: set if we can ignore timestamp changes
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 708) *
2f0264d592e34 fs/gfs2/file.c (Steven Whitehouse 2011-07-27 10:58:48 +0100 709) * We split the data flushing here so that we don't wait for the data
2f0264d592e34 fs/gfs2/file.c (Steven Whitehouse 2011-07-27 10:58:48 +0100 710) * until after we've also sent the metadata to disk. Note that for
2f0264d592e34 fs/gfs2/file.c (Steven Whitehouse 2011-07-27 10:58:48 +0100 711) * data=ordered, we will write & wait for the data at the log flush
2f0264d592e34 fs/gfs2/file.c (Steven Whitehouse 2011-07-27 10:58:48 +0100 712) * stage anyway, so this is unlikely to make much of a difference
2f0264d592e34 fs/gfs2/file.c (Steven Whitehouse 2011-07-27 10:58:48 +0100 713) * except in the data=writeback case.
2f0264d592e34 fs/gfs2/file.c (Steven Whitehouse 2011-07-27 10:58:48 +0100 714) *
2f0264d592e34 fs/gfs2/file.c (Steven Whitehouse 2011-07-27 10:58:48 +0100 715) * If the fdatawrite fails due to any reason except -EIO, we will
2f0264d592e34 fs/gfs2/file.c (Steven Whitehouse 2011-07-27 10:58:48 +0100 716) * continue the remainder of the fsync, although we'll still report
2f0264d592e34 fs/gfs2/file.c (Steven Whitehouse 2011-07-27 10:58:48 +0100 717) * the error at the end. This is to match filemap_write_and_wait_range()
2f0264d592e34 fs/gfs2/file.c (Steven Whitehouse 2011-07-27 10:58:48 +0100 718) * behaviour.
34126f9f41901 fs/gfs2/ops_file.c (Steven Whitehouse 2006-12-07 09:13:14 -0500 719) *
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 720) * Returns: errno
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 721) */
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 722)
02c24a82187d5 fs/gfs2/file.c (Josef Bacik 2011-07-16 20:44:56 -0400 723) static int gfs2_fsync(struct file *file, loff_t start, loff_t end,
02c24a82187d5 fs/gfs2/file.c (Josef Bacik 2011-07-16 20:44:56 -0400 724) int datasync)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 725) {
2f0264d592e34 fs/gfs2/file.c (Steven Whitehouse 2011-07-27 10:58:48 +0100 726) struct address_space *mapping = file->f_mapping;
2f0264d592e34 fs/gfs2/file.c (Steven Whitehouse 2011-07-27 10:58:48 +0100 727) struct inode *inode = mapping->host;
3aac630b5ce18 fs/gfs2/file.c (Eric Biggers 2021-01-12 11:02:52 -0800 728) int sync_state = inode->i_state & I_DIRTY;
dba898b02defa fs/gfs2/file.c (Steven Whitehouse 2011-04-14 09:54:02 +0100 729) struct gfs2_inode *ip = GFS2_I(inode);
87654896ca619 fs/gfs2/file.c (Steven Whitehouse 2011-11-08 14:04:20 +0000 730) int ret = 0, ret1 = 0;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 731)
2f0264d592e34 fs/gfs2/file.c (Steven Whitehouse 2011-07-27 10:58:48 +0100 732) if (mapping->nrpages) {
2f0264d592e34 fs/gfs2/file.c (Steven Whitehouse 2011-07-27 10:58:48 +0100 733) ret1 = filemap_fdatawrite_range(mapping, start, end);
2f0264d592e34 fs/gfs2/file.c (Steven Whitehouse 2011-07-27 10:58:48 +0100 734) if (ret1 == -EIO)
2f0264d592e34 fs/gfs2/file.c (Steven Whitehouse 2011-07-27 10:58:48 +0100 735) return ret1;
2f0264d592e34 fs/gfs2/file.c (Steven Whitehouse 2011-07-27 10:58:48 +0100 736) }
02c24a82187d5 fs/gfs2/file.c (Josef Bacik 2011-07-16 20:44:56 -0400 737)
0c9018097fe29 fs/gfs2/file.c (Benjamin Marzinski 2013-09-03 16:59:42 -0500 738) if (!gfs2_is_jdata(ip))
0c9018097fe29 fs/gfs2/file.c (Benjamin Marzinski 2013-09-03 16:59:42 -0500 739) sync_state &= ~I_DIRTY_PAGES;
dba898b02defa fs/gfs2/file.c (Steven Whitehouse 2011-04-14 09:54:02 +0100 740) if (datasync)
3aac630b5ce18 fs/gfs2/file.c (Eric Biggers 2021-01-12 11:02:52 -0800 741) sync_state &= ~I_DIRTY_SYNC;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 742)
dba898b02defa fs/gfs2/file.c (Steven Whitehouse 2011-04-14 09:54:02 +0100 743) if (sync_state) {
dba898b02defa fs/gfs2/file.c (Steven Whitehouse 2011-04-14 09:54:02 +0100 744) ret = sync_inode_metadata(inode, 1);
b5b24d7aeb960 fs/gfs2/file.c (Steven Whitehouse 2011-09-07 10:33:25 +0100 745) if (ret)
dba898b02defa fs/gfs2/file.c (Steven Whitehouse 2011-04-14 09:54:02 +0100 746) return ret;
f18185291d605 fs/gfs2/file.c (Steven Whitehouse 2011-08-05 10:12:47 +0100 747) if (gfs2_is_jdata(ip))
d07a6ac7b6f87 fs/gfs2/file.c (Jeff Layton 2017-07-07 15:20:53 -0400 748) ret = file_write_and_wait(file);
d07a6ac7b6f87 fs/gfs2/file.c (Jeff Layton 2017-07-07 15:20:53 -0400 749) if (ret)
d07a6ac7b6f87 fs/gfs2/file.c (Jeff Layton 2017-07-07 15:20:53 -0400 750) return ret;
b5b24d7aeb960 fs/gfs2/file.c (Steven Whitehouse 2011-09-07 10:33:25 +0100 751) gfs2_ail_flush(ip->i_gl, 1);
33c3de32872ef fs/gfs2/ops_file.c (Steven Whitehouse 2006-11-30 10:14:32 -0500 752) }
33c3de32872ef fs/gfs2/ops_file.c (Steven Whitehouse 2006-11-30 10:14:32 -0500 753)
2f0264d592e34 fs/gfs2/file.c (Steven Whitehouse 2011-07-27 10:58:48 +0100 754) if (mapping->nrpages)
d07a6ac7b6f87 fs/gfs2/file.c (Jeff Layton 2017-07-07 15:20:53 -0400 755) ret = file_fdatawait_range(file, start, end);
2f0264d592e34 fs/gfs2/file.c (Steven Whitehouse 2011-07-27 10:58:48 +0100 756)
2f0264d592e34 fs/gfs2/file.c (Steven Whitehouse 2011-07-27 10:58:48 +0100 757) return ret ? ret : ret1;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 758) }
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 759)
4c5c3010408d8 fs/gfs2/file.c (Andreas Gruenbacher 2020-06-29 17:47:15 -0500 760) static ssize_t gfs2_file_direct_read(struct kiocb *iocb, struct iov_iter *to,
4c5c3010408d8 fs/gfs2/file.c (Andreas Gruenbacher 2020-06-29 17:47:15 -0500 761) struct gfs2_holder *gh)
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 762) {
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 763) struct file *file = iocb->ki_filp;
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 764) struct gfs2_inode *ip = GFS2_I(file->f_mapping->host);
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 765) size_t count = iov_iter_count(to);
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 766) ssize_t ret;
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 767)
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 768) if (!count)
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 769) return 0; /* skip atime */
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 770)
4c5c3010408d8 fs/gfs2/file.c (Andreas Gruenbacher 2020-06-29 17:47:15 -0500 771) gfs2_holder_init(ip->i_gl, LM_ST_DEFERRED, 0, gh);
4c5c3010408d8 fs/gfs2/file.c (Andreas Gruenbacher 2020-06-29 17:47:15 -0500 772) ret = gfs2_glock_nq(gh);
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 773) if (ret)
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 774) goto out_uninit;
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 775)
2f63296578cad fs/gfs2/file.c (Christoph Hellwig 2021-01-23 10:06:09 -0800 776) ret = iomap_dio_rw(iocb, to, &gfs2_iomap_ops, NULL, 0);
4c5c3010408d8 fs/gfs2/file.c (Andreas Gruenbacher 2020-06-29 17:47:15 -0500 777) gfs2_glock_dq(gh);
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 778) out_uninit:
4c5c3010408d8 fs/gfs2/file.c (Andreas Gruenbacher 2020-06-29 17:47:15 -0500 779) gfs2_holder_uninit(gh);
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 780) return ret;
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 781) }
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 782)
4c5c3010408d8 fs/gfs2/file.c (Andreas Gruenbacher 2020-06-29 17:47:15 -0500 783) static ssize_t gfs2_file_direct_write(struct kiocb *iocb, struct iov_iter *from,
4c5c3010408d8 fs/gfs2/file.c (Andreas Gruenbacher 2020-06-29 17:47:15 -0500 784) struct gfs2_holder *gh)
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 785) {
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 786) struct file *file = iocb->ki_filp;
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 787) struct inode *inode = file->f_mapping->host;
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 788) struct gfs2_inode *ip = GFS2_I(inode);
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 789) size_t len = iov_iter_count(from);
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 790) loff_t offset = iocb->ki_pos;
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 791) ssize_t ret;
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 792)
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 793) /*
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 794) * Deferred lock, even if its a write, since we do no allocation on
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 795) * this path. All we need to change is the atime, and this lock mode
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 796) * ensures that other nodes have flushed their buffered read caches
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 797) * (i.e. their page cache entries for this inode). We do not,
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 798) * unfortunately, have the option of only flushing a range like the
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 799) * VFS does.
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 800) */
4c5c3010408d8 fs/gfs2/file.c (Andreas Gruenbacher 2020-06-29 17:47:15 -0500 801) gfs2_holder_init(ip->i_gl, LM_ST_DEFERRED, 0, gh);
4c5c3010408d8 fs/gfs2/file.c (Andreas Gruenbacher 2020-06-29 17:47:15 -0500 802) ret = gfs2_glock_nq(gh);
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 803) if (ret)
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 804) goto out_uninit;
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 805)
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 806) /* Silently fall back to buffered I/O when writing beyond EOF */
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 807) if (offset + len > i_size_read(&ip->i_inode))
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 808) goto out;
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 809)
2f63296578cad fs/gfs2/file.c (Christoph Hellwig 2021-01-23 10:06:09 -0800 810) ret = iomap_dio_rw(iocb, from, &gfs2_iomap_ops, NULL, 0);
60263d5889e6d fs/gfs2/file.c (Christoph Hellwig 2020-07-23 22:45:59 -0700 811) if (ret == -ENOTBLK)
60263d5889e6d fs/gfs2/file.c (Christoph Hellwig 2020-07-23 22:45:59 -0700 812) ret = 0;
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 813) out:
4c5c3010408d8 fs/gfs2/file.c (Andreas Gruenbacher 2020-06-29 17:47:15 -0500 814) gfs2_glock_dq(gh);
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 815) out_uninit:
4c5c3010408d8 fs/gfs2/file.c (Andreas Gruenbacher 2020-06-29 17:47:15 -0500 816) gfs2_holder_uninit(gh);
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 817) return ret;
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 818) }
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 819)
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 820) static ssize_t gfs2_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 821) {
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 822) struct gfs2_inode *ip;
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 823) struct gfs2_holder gh;
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 824) size_t written = 0;
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 825) ssize_t ret;
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 826)
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 827) if (iocb->ki_flags & IOCB_DIRECT) {
4c5c3010408d8 fs/gfs2/file.c (Andreas Gruenbacher 2020-06-29 17:47:15 -0500 828) ret = gfs2_file_direct_read(iocb, to, &gh);
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 829) if (likely(ret != -ENOTBLK))
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 830) return ret;
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 831) iocb->ki_flags &= ~IOCB_DIRECT;
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 832) }
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 833) iocb->ki_flags |= IOCB_NOIO;
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 834) ret = generic_file_read_iter(iocb, to);
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 835) iocb->ki_flags &= ~IOCB_NOIO;
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 836) if (ret >= 0) {
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 837) if (!iov_iter_count(to))
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 838) return ret;
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 839) written = ret;
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 840) } else {
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 841) if (ret != -EAGAIN)
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 842) return ret;
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 843) if (iocb->ki_flags & IOCB_NOWAIT)
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 844) return ret;
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 845) }
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 846) ip = GFS2_I(iocb->ki_filp->f_mapping->host);
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 847) gfs2_holder_init(ip->i_gl, LM_ST_SHARED, 0, &gh);
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 848) ret = gfs2_glock_nq(&gh);
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 849) if (ret)
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 850) goto out_uninit;
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 851) ret = generic_file_read_iter(iocb, to);
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 852) if (ret > 0)
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 853) written += ret;
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 854) gfs2_glock_dq(&gh);
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 855) out_uninit:
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 856) gfs2_holder_uninit(&gh);
20f829999c38b fs/gfs2/file.c (Andreas Gruenbacher 2020-07-01 19:25:19 +0200 857) return written ? written : ret;
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 858) }
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 859)
56aa616a03fec fs/gfs2/file.c (Steven Whitehouse 2009-12-08 10:25:33 +0000 860) /**
da56e45b6ee83 fs/gfs2/file.c (Al Viro 2014-04-03 14:11:01 -0400 861) * gfs2_file_write_iter - Perform a write to a file
56aa616a03fec fs/gfs2/file.c (Steven Whitehouse 2009-12-08 10:25:33 +0000 862) * @iocb: The io context
64bc06bb32ee9 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-24 15:04:04 +0100 863) * @from: The data to write
56aa616a03fec fs/gfs2/file.c (Steven Whitehouse 2009-12-08 10:25:33 +0000 864) *
56aa616a03fec fs/gfs2/file.c (Steven Whitehouse 2009-12-08 10:25:33 +0000 865) * We have to do a lock/unlock here to refresh the inode size for
56aa616a03fec fs/gfs2/file.c (Steven Whitehouse 2009-12-08 10:25:33 +0000 866) * O_APPEND writes, otherwise we can land up writing at the wrong
56aa616a03fec fs/gfs2/file.c (Steven Whitehouse 2009-12-08 10:25:33 +0000 867) * offset. There is still a race, but provided the app is using its
56aa616a03fec fs/gfs2/file.c (Steven Whitehouse 2009-12-08 10:25:33 +0000 868) * own file locking, this will make O_APPEND work as expected.
56aa616a03fec fs/gfs2/file.c (Steven Whitehouse 2009-12-08 10:25:33 +0000 869) *
56aa616a03fec fs/gfs2/file.c (Steven Whitehouse 2009-12-08 10:25:33 +0000 870) */
56aa616a03fec fs/gfs2/file.c (Steven Whitehouse 2009-12-08 10:25:33 +0000 871)
da56e45b6ee83 fs/gfs2/file.c (Al Viro 2014-04-03 14:11:01 -0400 872) static ssize_t gfs2_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
56aa616a03fec fs/gfs2/file.c (Steven Whitehouse 2009-12-08 10:25:33 +0000 873) {
56aa616a03fec fs/gfs2/file.c (Steven Whitehouse 2009-12-08 10:25:33 +0000 874) struct file *file = iocb->ki_filp;
64bc06bb32ee9 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-24 15:04:04 +0100 875) struct inode *inode = file_inode(file);
64bc06bb32ee9 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-24 15:04:04 +0100 876) struct gfs2_inode *ip = GFS2_I(inode);
4c5c3010408d8 fs/gfs2/file.c (Andreas Gruenbacher 2020-06-29 17:47:15 -0500 877) struct gfs2_holder gh;
6e5e41e2dc4e4 fs/gfs2/file.c (Andreas Gruenbacher 2020-01-14 17:12:18 +0100 878) ssize_t ret;
0a305e496059a fs/gfs2/file.c (Bob Peterson 2012-06-06 11:17:59 +0100 879)
da56e45b6ee83 fs/gfs2/file.c (Al Viro 2014-04-03 14:11:01 -0400 880) gfs2_size_hint(file, iocb->ki_pos, iov_iter_count(from));
da1dfb6af849c fs/gfs2/file.c (Steven Whitehouse 2012-07-26 11:30:54 +0100 881)
2ba48ce513c4e fs/gfs2/file.c (Al Viro 2015-04-09 13:52:01 -0400 882) if (iocb->ki_flags & IOCB_APPEND) {
56aa616a03fec fs/gfs2/file.c (Steven Whitehouse 2009-12-08 10:25:33 +0000 883) ret = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, 0, &gh);
56aa616a03fec fs/gfs2/file.c (Steven Whitehouse 2009-12-08 10:25:33 +0000 884) if (ret)
4bd684bc0143b fs/gfs2/file.c (Andreas Gruenbacher 2020-03-06 10:51:41 -0600 885) return ret;
56aa616a03fec fs/gfs2/file.c (Steven Whitehouse 2009-12-08 10:25:33 +0000 886) gfs2_glock_dq_uninit(&gh);
56aa616a03fec fs/gfs2/file.c (Steven Whitehouse 2009-12-08 10:25:33 +0000 887) }
56aa616a03fec fs/gfs2/file.c (Steven Whitehouse 2009-12-08 10:25:33 +0000 888)
64bc06bb32ee9 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-24 15:04:04 +0100 889) inode_lock(inode);
64bc06bb32ee9 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-24 15:04:04 +0100 890) ret = generic_write_checks(iocb, from);
64bc06bb32ee9 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-24 15:04:04 +0100 891) if (ret <= 0)
4c0e8dda608a5 fs/gfs2/file.c (Christoph Hellwig 2020-01-15 16:38:29 +0100 892) goto out_unlock;
64bc06bb32ee9 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-24 15:04:04 +0100 893)
64bc06bb32ee9 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-24 15:04:04 +0100 894) ret = file_remove_privs(file);
64bc06bb32ee9 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-24 15:04:04 +0100 895) if (ret)
4c0e8dda608a5 fs/gfs2/file.c (Christoph Hellwig 2020-01-15 16:38:29 +0100 896) goto out_unlock;
64bc06bb32ee9 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-24 15:04:04 +0100 897)
64bc06bb32ee9 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-24 15:04:04 +0100 898) ret = file_update_time(file);
64bc06bb32ee9 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-24 15:04:04 +0100 899) if (ret)
4c0e8dda608a5 fs/gfs2/file.c (Christoph Hellwig 2020-01-15 16:38:29 +0100 900) goto out_unlock;
64bc06bb32ee9 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-24 15:04:04 +0100 901)
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 902) if (iocb->ki_flags & IOCB_DIRECT) {
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 903) struct address_space *mapping = file->f_mapping;
6e5e41e2dc4e4 fs/gfs2/file.c (Andreas Gruenbacher 2020-01-14 17:12:18 +0100 904) ssize_t buffered, ret2;
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 905)
4c5c3010408d8 fs/gfs2/file.c (Andreas Gruenbacher 2020-06-29 17:47:15 -0500 906) ret = gfs2_file_direct_write(iocb, from, &gh);
6e5e41e2dc4e4 fs/gfs2/file.c (Andreas Gruenbacher 2020-01-14 17:12:18 +0100 907) if (ret < 0 || !iov_iter_count(from))
4c0e8dda608a5 fs/gfs2/file.c (Christoph Hellwig 2020-01-15 16:38:29 +0100 908) goto out_unlock;
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 909)
6e5e41e2dc4e4 fs/gfs2/file.c (Andreas Gruenbacher 2020-01-14 17:12:18 +0100 910) iocb->ki_flags |= IOCB_DSYNC;
4c0e8dda608a5 fs/gfs2/file.c (Christoph Hellwig 2020-01-15 16:38:29 +0100 911) current->backing_dev_info = inode_to_bdi(inode);
6e5e41e2dc4e4 fs/gfs2/file.c (Andreas Gruenbacher 2020-01-14 17:12:18 +0100 912) buffered = iomap_file_buffered_write(iocb, from, &gfs2_iomap_ops);
4c0e8dda608a5 fs/gfs2/file.c (Christoph Hellwig 2020-01-15 16:38:29 +0100 913) current->backing_dev_info = NULL;
43a511c44e58e fs/gfs2/file.c (Andreas Gruenbacher 2021-05-10 12:25:59 +0200 914) if (unlikely(buffered <= 0)) {
43a511c44e58e fs/gfs2/file.c (Andreas Gruenbacher 2021-05-10 12:25:59 +0200 915) if (!ret)
43a511c44e58e fs/gfs2/file.c (Andreas Gruenbacher 2021-05-10 12:25:59 +0200 916) ret = buffered;
4c0e8dda608a5 fs/gfs2/file.c (Christoph Hellwig 2020-01-15 16:38:29 +0100 917) goto out_unlock;
43a511c44e58e fs/gfs2/file.c (Andreas Gruenbacher 2021-05-10 12:25:59 +0200 918) }
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 919)
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 920) /*
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 921) * We need to ensure that the page cache pages are written to
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 922) * disk and invalidated to preserve the expected O_DIRECT
6e5e41e2dc4e4 fs/gfs2/file.c (Andreas Gruenbacher 2020-01-14 17:12:18 +0100 923) * semantics. If the writeback or invalidate fails, only report
6e5e41e2dc4e4 fs/gfs2/file.c (Andreas Gruenbacher 2020-01-14 17:12:18 +0100 924) * the direct I/O range as we don't know if the buffered pages
6e5e41e2dc4e4 fs/gfs2/file.c (Andreas Gruenbacher 2020-01-14 17:12:18 +0100 925) * made it to disk.
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 926) */
6e5e41e2dc4e4 fs/gfs2/file.c (Andreas Gruenbacher 2020-01-14 17:12:18 +0100 927) iocb->ki_pos += buffered;
6e5e41e2dc4e4 fs/gfs2/file.c (Andreas Gruenbacher 2020-01-14 17:12:18 +0100 928) ret2 = generic_write_sync(iocb, buffered);
6e5e41e2dc4e4 fs/gfs2/file.c (Andreas Gruenbacher 2020-01-14 17:12:18 +0100 929) invalidate_mapping_pages(mapping,
6e5e41e2dc4e4 fs/gfs2/file.c (Andreas Gruenbacher 2020-01-14 17:12:18 +0100 930) (iocb->ki_pos - buffered) >> PAGE_SHIFT,
6e5e41e2dc4e4 fs/gfs2/file.c (Andreas Gruenbacher 2020-01-14 17:12:18 +0100 931) (iocb->ki_pos - 1) >> PAGE_SHIFT);
6e5e41e2dc4e4 fs/gfs2/file.c (Andreas Gruenbacher 2020-01-14 17:12:18 +0100 932) if (!ret || ret2 > 0)
6e5e41e2dc4e4 fs/gfs2/file.c (Andreas Gruenbacher 2020-01-14 17:12:18 +0100 933) ret += ret2;
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 934) } else {
4c0e8dda608a5 fs/gfs2/file.c (Christoph Hellwig 2020-01-15 16:38:29 +0100 935) current->backing_dev_info = inode_to_bdi(inode);
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 936) ret = iomap_file_buffered_write(iocb, from, &gfs2_iomap_ops);
4c0e8dda608a5 fs/gfs2/file.c (Christoph Hellwig 2020-01-15 16:38:29 +0100 937) current->backing_dev_info = NULL;
6e5e41e2dc4e4 fs/gfs2/file.c (Andreas Gruenbacher 2020-01-14 17:12:18 +0100 938) if (likely(ret > 0)) {
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 939) iocb->ki_pos += ret;
6e5e41e2dc4e4 fs/gfs2/file.c (Andreas Gruenbacher 2020-01-14 17:12:18 +0100 940) ret = generic_write_sync(iocb, ret);
6e5e41e2dc4e4 fs/gfs2/file.c (Andreas Gruenbacher 2020-01-14 17:12:18 +0100 941) }
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 942) }
64bc06bb32ee9 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-24 15:04:04 +0100 943)
4c0e8dda608a5 fs/gfs2/file.c (Christoph Hellwig 2020-01-15 16:38:29 +0100 944) out_unlock:
64bc06bb32ee9 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-24 15:04:04 +0100 945) inode_unlock(inode);
6e5e41e2dc4e4 fs/gfs2/file.c (Andreas Gruenbacher 2020-01-14 17:12:18 +0100 946) return ret;
56aa616a03fec fs/gfs2/file.c (Steven Whitehouse 2009-12-08 10:25:33 +0000 947) }
56aa616a03fec fs/gfs2/file.c (Steven Whitehouse 2009-12-08 10:25:33 +0000 948)
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 949) static int fallocate_chunk(struct inode *inode, loff_t offset, loff_t len,
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 950) int mode)
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 951) {
fffb64127adc3 fs/gfs2/file.c (Andreas Gruenbacher 2018-03-29 06:50:32 -0700 952) struct super_block *sb = inode->i_sb;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 953) struct gfs2_inode *ip = GFS2_I(inode);
fffb64127adc3 fs/gfs2/file.c (Andreas Gruenbacher 2018-03-29 06:50:32 -0700 954) loff_t end = offset + len;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 955) struct buffer_head *dibh;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 956) int error;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 957)
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 958) error = gfs2_meta_inode_buffer(ip, &dibh);
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 959) if (unlikely(error))
64dd153c83743 fs/gfs2/file.c (Benjamin Marzinski 2011-09-12 18:15:24 -0500 960) return error;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 961)
350a9b0a7269c fs/gfs2/file.c (Steven Whitehouse 2012-12-14 12:36:02 +0000 962) gfs2_trans_add_meta(ip->i_gl, dibh);
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 963)
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 964) if (gfs2_is_stuffed(ip)) {
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 965) error = gfs2_unstuff_dinode(ip, NULL);
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 966) if (unlikely(error))
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 967) goto out;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 968) }
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 969)
fffb64127adc3 fs/gfs2/file.c (Andreas Gruenbacher 2018-03-29 06:50:32 -0700 970) while (offset < end) {
c25892827c799 fs/gfs2/file.c (Andreas Gruenbacher 2018-07-06 23:05:41 +0100 971) struct iomap iomap = { };
c25892827c799 fs/gfs2/file.c (Andreas Gruenbacher 2018-07-06 23:05:41 +0100 972)
54992257fe4bb fs/gfs2/file.c (Andreas Gruenbacher 2021-03-27 21:56:40 +0100 973) error = gfs2_iomap_alloc(inode, offset, end - offset, &iomap);
fffb64127adc3 fs/gfs2/file.c (Andreas Gruenbacher 2018-03-29 06:50:32 -0700 974) if (error)
64dd153c83743 fs/gfs2/file.c (Benjamin Marzinski 2011-09-12 18:15:24 -0500 975) goto out;
fffb64127adc3 fs/gfs2/file.c (Andreas Gruenbacher 2018-03-29 06:50:32 -0700 976) offset = iomap.offset + iomap.length;
d505a96a3b16f fs/gfs2/file.c (Andreas Gruenbacher 2018-06-24 10:43:49 +0100 977) if (!(iomap.flags & IOMAP_F_NEW))
64dd153c83743 fs/gfs2/file.c (Benjamin Marzinski 2011-09-12 18:15:24 -0500 978) continue;
fffb64127adc3 fs/gfs2/file.c (Andreas Gruenbacher 2018-03-29 06:50:32 -0700 979) error = sb_issue_zeroout(sb, iomap.addr >> inode->i_blkbits,
fffb64127adc3 fs/gfs2/file.c (Andreas Gruenbacher 2018-03-29 06:50:32 -0700 980) iomap.length >> inode->i_blkbits,
fffb64127adc3 fs/gfs2/file.c (Andreas Gruenbacher 2018-03-29 06:50:32 -0700 981) GFP_NOFS);
fffb64127adc3 fs/gfs2/file.c (Andreas Gruenbacher 2018-03-29 06:50:32 -0700 982) if (error) {
fffb64127adc3 fs/gfs2/file.c (Andreas Gruenbacher 2018-03-29 06:50:32 -0700 983) fs_err(GFS2_SB(inode), "Failed to zero data buffers\n");
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 984) goto out;
64dd153c83743 fs/gfs2/file.c (Benjamin Marzinski 2011-09-12 18:15:24 -0500 985) }
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 986) }
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 987) out:
64dd153c83743 fs/gfs2/file.c (Benjamin Marzinski 2011-09-12 18:15:24 -0500 988) brelse(dibh);
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 989) return error;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 990) }
f3b64b57c044f fs/gfs2/file.c (Andreas Gruenbacher 2019-08-31 21:29:12 +0100 991)
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 992) /**
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 993) * calc_max_reserv() - Reverse of write_calc_reserv. Given a number of
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 994) * blocks, determine how many bytes can be written.
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 995) * @ip: The inode in question.
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 996) * @len: Max cap of bytes. What we return in *len must be <= this.
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 997) * @data_blocks: Compute and return the number of data blocks needed
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 998) * @ind_blocks: Compute and return the number of indirect blocks needed
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 999) * @max_blocks: The total blocks available to work with.
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1000) *
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1001) * Returns: void, but @len, @data_blocks and @ind_blocks are filled in.
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1002) */
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1003) static void calc_max_reserv(struct gfs2_inode *ip, loff_t *len,
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1004) unsigned int *data_blocks, unsigned int *ind_blocks,
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1005) unsigned int max_blocks)
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1006) {
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1007) loff_t max = *len;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1008) const struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1009) unsigned int tmp, max_data = max_blocks - 3 * (sdp->sd_max_height - 1);
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1010)
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1011) for (tmp = max_data; tmp > sdp->sd_diptrs;) {
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1012) tmp = DIV_ROUND_UP(tmp, sdp->sd_inptrs);
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1013) max_data -= tmp;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1014) }
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1015)
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1016) *data_blocks = max_data;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1017) *ind_blocks = max_blocks - max_data;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1018) *len = ((loff_t)max_data - 3) << sdp->sd_sb.sb_bsize_shift;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1019) if (*len > max) {
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1020) *len = max;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1021) gfs2_write_calc_reserv(ip, max, data_blocks, ind_blocks);
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1022) }
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1023) }
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1024)
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1025) static long __gfs2_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1026) {
496ad9aa8ef44 fs/gfs2/file.c (Al Viro 2013-01-23 17:07:38 -0500 1027) struct inode *inode = file_inode(file);
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1028) struct gfs2_sbd *sdp = GFS2_SB(inode);
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1029) struct gfs2_inode *ip = GFS2_I(inode);
7b9cff467144c fs/gfs2/file.c (Steven Whitehouse 2013-10-02 11:13:25 +0100 1030) struct gfs2_alloc_parms ap = { .aflags = 0, };
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1031) unsigned int data_blocks = 0, ind_blocks = 0, rblocks;
174d1232ebc84 fs/gfs2/file.c (Andreas Gruenbacher 2018-02-20 08:03:24 -0700 1032) loff_t bytes, max_bytes, max_blks;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1033) int error;
4442f2e03ed96 fs/gfs2/file.c (Steven Whitehouse 2011-11-21 10:01:25 +0000 1034) const loff_t pos = offset;
4442f2e03ed96 fs/gfs2/file.c (Steven Whitehouse 2011-11-21 10:01:25 +0000 1035) const loff_t count = len;
6905d9e4dda61 fs/gfs2/file.c (Benjamin Marzinski 2011-04-26 01:13:24 -0500 1036) loff_t bsize_mask = ~((loff_t)sdp->sd_sb.sb_bsize - 1);
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1037) loff_t next = (offset + len - 1) >> sdp->sd_sb.sb_bsize_shift;
64dd153c83743 fs/gfs2/file.c (Benjamin Marzinski 2011-09-12 18:15:24 -0500 1038) loff_t max_chunk_size = UINT_MAX & bsize_mask;
a0846a534c5fb fs/gfs2/file.c (Bob Peterson 2014-02-06 10:43:50 -0500 1039)
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1040) next = (next + 1) << sdp->sd_sb.sb_bsize_shift;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1041)
6905d9e4dda61 fs/gfs2/file.c (Benjamin Marzinski 2011-04-26 01:13:24 -0500 1042) offset &= bsize_mask;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1043)
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1044) len = next - offset;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1045) bytes = sdp->sd_max_rg_data * sdp->sd_sb.sb_bsize / 2;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1046) if (!bytes)
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1047) bytes = UINT_MAX;
6905d9e4dda61 fs/gfs2/file.c (Benjamin Marzinski 2011-04-26 01:13:24 -0500 1048) bytes &= bsize_mask;
6905d9e4dda61 fs/gfs2/file.c (Benjamin Marzinski 2011-04-26 01:13:24 -0500 1049) if (bytes == 0)
6905d9e4dda61 fs/gfs2/file.c (Benjamin Marzinski 2011-04-26 01:13:24 -0500 1050) bytes = sdp->sd_sb.sb_bsize;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1051)
da1dfb6af849c fs/gfs2/file.c (Steven Whitehouse 2012-07-26 11:30:54 +0100 1052) gfs2_size_hint(file, offset, len);
8e2e00473598d fs/gfs2/file.c (Bob Peterson 2012-07-19 08:12:40 -0400 1053)
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1054) gfs2_write_calc_reserv(ip, PAGE_SIZE, &data_blocks, &ind_blocks);
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1055) ap.min_target = data_blocks + ind_blocks;
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1056)
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1057) while (len > 0) {
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1058) if (len < bytes)
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1059) bytes = len;
58a7d5fb8e312 fs/gfs2/file.c (Benjamin Marzinski 2012-03-08 13:16:32 -0600 1060) if (!gfs2_write_alloc_required(ip, offset, bytes)) {
58a7d5fb8e312 fs/gfs2/file.c (Benjamin Marzinski 2012-03-08 13:16:32 -0600 1061) len -= bytes;
58a7d5fb8e312 fs/gfs2/file.c (Benjamin Marzinski 2012-03-08 13:16:32 -0600 1062) offset += bytes;
58a7d5fb8e312 fs/gfs2/file.c (Benjamin Marzinski 2012-03-08 13:16:32 -0600 1063) continue;
58a7d5fb8e312 fs/gfs2/file.c (Benjamin Marzinski 2012-03-08 13:16:32 -0600 1064) }
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1065)
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1066) /* We need to determine how many bytes we can actually
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1067) * fallocate without exceeding quota or going over the
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1068) * end of the fs. We start off optimistically by assuming
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1069) * we can write max_bytes */
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1070) max_bytes = (len > max_chunk_size) ? max_chunk_size : len;
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1071)
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1072) /* Since max_bytes is most likely a theoretical max, we
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1073) * calculate a more realistic 'bytes' to serve as a good
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1074) * starting point for the number of bytes we may be able
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1075) * to write */
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1076) gfs2_write_calc_reserv(ip, bytes, &data_blocks, &ind_blocks);
7b9cff467144c fs/gfs2/file.c (Steven Whitehouse 2013-10-02 11:13:25 +0100 1077) ap.target = data_blocks + ind_blocks;
b8fbf471edb3d fs/gfs2/file.c (Abhi Das 2015-03-18 12:03:41 -0500 1078)
b8fbf471edb3d fs/gfs2/file.c (Abhi Das 2015-03-18 12:03:41 -0500 1079) error = gfs2_quota_lock_check(ip, &ap);
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1080) if (error)
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1081) return error;
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1082) /* ap.allowed tells us how many blocks quota will allow
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1083) * us to write. Check if this reduces max_blks */
174d1232ebc84 fs/gfs2/file.c (Andreas Gruenbacher 2018-02-20 08:03:24 -0700 1084) max_blks = UINT_MAX;
174d1232ebc84 fs/gfs2/file.c (Andreas Gruenbacher 2018-02-20 08:03:24 -0700 1085) if (ap.allowed)
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1086) max_blks = ap.allowed;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1087)
7b9cff467144c fs/gfs2/file.c (Steven Whitehouse 2013-10-02 11:13:25 +0100 1088) error = gfs2_inplace_reserve(ip, &ap);
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1089) if (error)
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1090) goto out_qunlock;
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1091)
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1092) /* check if the selected rgrp limits our max_blks further */
725d0e9d464d5 fs/gfs2/file.c (Andreas Gruenbacher 2018-10-02 14:59:54 +0100 1093) if (ip->i_res.rs_reserved < max_blks)
725d0e9d464d5 fs/gfs2/file.c (Andreas Gruenbacher 2018-10-02 14:59:54 +0100 1094) max_blks = ip->i_res.rs_reserved;
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1095)
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1096) /* Almost done. Calculate bytes that can be written using
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1097) * max_blks. We also recompute max_bytes, data_blocks and
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1098) * ind_blocks */
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1099) calc_max_reserv(ip, &max_bytes, &data_blocks,
d9be0cda774e7 fs/gfs2/file.c (Abhi Das 2015-03-18 12:05:15 -0500 1100) &ind_blocks, max_blks);
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1101)
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1102) rblocks = RES_DINODE + ind_blocks + RES_STATFS + RES_QUOTA +
71f890f7f758f fs/gfs2/file.c (Steven Whitehouse 2012-07-30 14:53:19 +0100 1103) RES_RG_HDR + gfs2_rg_blocks(ip, data_blocks + ind_blocks);
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1104) if (gfs2_is_jdata(ip))
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1105) rblocks += data_blocks ? data_blocks : 1;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1106)
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1107) error = gfs2_trans_begin(sdp, rblocks,
45eb05042d566 fs/gfs2/file.c (Andreas Gruenbacher 2019-09-02 17:31:06 +0100 1108) PAGE_SIZE >> inode->i_blkbits);
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1109) if (error)
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1110) goto out_trans_fail;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1111)
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1112) error = fallocate_chunk(inode, offset, max_bytes, mode);
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1113) gfs2_trans_end(sdp);
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1114)
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1115) if (error)
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1116) goto out_trans_fail;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1117)
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1118) len -= max_bytes;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1119) offset += max_bytes;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1120) gfs2_inplace_release(ip);
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1121) gfs2_quota_unlock(ip);
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1122) }
4442f2e03ed96 fs/gfs2/file.c (Steven Whitehouse 2011-11-21 10:01:25 +0000 1123)
0a6a4abc84668 fs/gfs2/file.c (Andreas Gruenbacher 2019-08-08 19:29:54 +0100 1124) if (!(mode & FALLOC_FL_KEEP_SIZE) && (pos + count) > inode->i_size)
1885867b84d58 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:04 +0000 1125) i_size_write(inode, pos + count);
0a6a4abc84668 fs/gfs2/file.c (Andreas Gruenbacher 2019-08-08 19:29:54 +0100 1126) file_update_time(file);
0a6a4abc84668 fs/gfs2/file.c (Andreas Gruenbacher 2019-08-08 19:29:54 +0100 1127) mark_inode_dirty(inode);
1885867b84d58 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:04 +0000 1128)
dde0c2e798482 fs/gfs2/file.c (Christoph Hellwig 2016-04-07 08:52:00 -0700 1129) if ((file->f_flags & O_DSYNC) || IS_SYNC(file->f_mapping->host))
dde0c2e798482 fs/gfs2/file.c (Christoph Hellwig 2016-04-07 08:52:00 -0700 1130) return vfs_fsync_range(file, pos, pos + count - 1,
dde0c2e798482 fs/gfs2/file.c (Christoph Hellwig 2016-04-07 08:52:00 -0700 1131) (file->f_flags & __O_SYNC) ? 0 : 1);
dde0c2e798482 fs/gfs2/file.c (Christoph Hellwig 2016-04-07 08:52:00 -0700 1132) return 0;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1133)
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1134) out_trans_fail:
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1135) gfs2_inplace_release(ip);
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1136) out_qunlock:
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1137) gfs2_quota_unlock(ip);
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1138) return error;
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1139) }
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1140)
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1141) static long gfs2_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1142) {
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1143) struct inode *inode = file_inode(file);
d4d7fc12b642a fs/gfs2/file.c (Andrew Price 2017-04-05 11:45:26 -0400 1144) struct gfs2_sbd *sdp = GFS2_SB(inode);
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1145) struct gfs2_inode *ip = GFS2_I(inode);
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1146) struct gfs2_holder gh;
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1147) int ret;
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1148)
4e56a6411fbce fs/gfs2/file.c (Andreas Gruenbacher 2017-12-14 17:11:03 +0100 1149) if (mode & ~(FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE))
d4d7fc12b642a fs/gfs2/file.c (Andrew Price 2017-04-05 11:45:26 -0400 1150) return -EOPNOTSUPP;
d4d7fc12b642a fs/gfs2/file.c (Andrew Price 2017-04-05 11:45:26 -0400 1151) /* fallocate is needed by gfs2_grow to reserve space in the rindex */
d4d7fc12b642a fs/gfs2/file.c (Andrew Price 2017-04-05 11:45:26 -0400 1152) if (gfs2_is_jdata(ip) && inode != sdp->sd_rindex)
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1153) return -EOPNOTSUPP;
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1154)
5955102c9984f fs/gfs2/file.c (Al Viro 2016-01-22 15:40:57 -0500 1155) inode_lock(inode);
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1156)
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1157) gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &gh);
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1158) ret = gfs2_glock_nq(&gh);
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1159) if (ret)
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1160) goto out_uninit;
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1161)
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1162) if (!(mode & FALLOC_FL_KEEP_SIZE) &&
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1163) (offset + len) > inode->i_size) {
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1164) ret = inode_newsize_ok(inode, offset + len);
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1165) if (ret)
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1166) goto out_unlock;
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1167) }
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1168)
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1169) ret = get_write_access(inode);
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1170) if (ret)
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1171) goto out_unlock;
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1172)
4e56a6411fbce fs/gfs2/file.c (Andreas Gruenbacher 2017-12-14 17:11:03 +0100 1173) if (mode & FALLOC_FL_PUNCH_HOLE) {
4e56a6411fbce fs/gfs2/file.c (Andreas Gruenbacher 2017-12-14 17:11:03 +0100 1174) ret = __gfs2_punch_hole(file, offset, len);
4e56a6411fbce fs/gfs2/file.c (Andreas Gruenbacher 2017-12-14 17:11:03 +0100 1175) } else {
4e56a6411fbce fs/gfs2/file.c (Andreas Gruenbacher 2017-12-14 17:11:03 +0100 1176) ret = __gfs2_fallocate(file, mode, offset, len);
4e56a6411fbce fs/gfs2/file.c (Andreas Gruenbacher 2017-12-14 17:11:03 +0100 1177) if (ret)
4e56a6411fbce fs/gfs2/file.c (Andreas Gruenbacher 2017-12-14 17:11:03 +0100 1178) gfs2_rs_deltree(&ip->i_res);
4e56a6411fbce fs/gfs2/file.c (Andreas Gruenbacher 2017-12-14 17:11:03 +0100 1179) }
a097dc7e24cba fs/gfs2/file.c (Bob Peterson 2015-07-16 08:28:04 -0500 1180)
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1181) put_write_access(inode);
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1182) out_unlock:
a0846a534c5fb fs/gfs2/file.c (Bob Peterson 2014-02-06 10:43:50 -0500 1183) gfs2_glock_dq(&gh);
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1184) out_uninit:
a0846a534c5fb fs/gfs2/file.c (Bob Peterson 2014-02-06 10:43:50 -0500 1185) gfs2_holder_uninit(&gh);
5955102c9984f fs/gfs2/file.c (Al Viro 2016-01-22 15:40:57 -0500 1186) inode_unlock(inode);
9c9f1159a54c6 fs/gfs2/file.c (Andrew Price 2014-11-12 17:24:03 +0000 1187) return ret;
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1188) }
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1189)
f1ea6f4ec0a48 fs/gfs2/file.c (Bob Peterson 2015-02-24 07:22:28 -0600 1190) static ssize_t gfs2_file_splice_write(struct pipe_inode_info *pipe,
f1ea6f4ec0a48 fs/gfs2/file.c (Bob Peterson 2015-02-24 07:22:28 -0600 1191) struct file *out, loff_t *ppos,
f1ea6f4ec0a48 fs/gfs2/file.c (Bob Peterson 2015-02-24 07:22:28 -0600 1192) size_t len, unsigned int flags)
f1ea6f4ec0a48 fs/gfs2/file.c (Bob Peterson 2015-02-24 07:22:28 -0600 1193) {
2fba46a04c383 fs/gfs2/file.c (Bob Peterson 2020-02-27 12:47:53 -0600 1194) ssize_t ret;
f1ea6f4ec0a48 fs/gfs2/file.c (Bob Peterson 2015-02-24 07:22:28 -0600 1195)
f1ea6f4ec0a48 fs/gfs2/file.c (Bob Peterson 2015-02-24 07:22:28 -0600 1196) gfs2_size_hint(out, *ppos, len);
f1ea6f4ec0a48 fs/gfs2/file.c (Bob Peterson 2015-02-24 07:22:28 -0600 1197)
2fba46a04c383 fs/gfs2/file.c (Bob Peterson 2020-02-27 12:47:53 -0600 1198) ret = iter_file_splice_write(pipe, out, ppos, len, flags);
2fba46a04c383 fs/gfs2/file.c (Bob Peterson 2020-02-27 12:47:53 -0600 1199) return ret;
f1ea6f4ec0a48 fs/gfs2/file.c (Bob Peterson 2015-02-24 07:22:28 -0600 1200) }
f1ea6f4ec0a48 fs/gfs2/file.c (Bob Peterson 2015-02-24 07:22:28 -0600 1201)
f057f6cdf6417 fs/gfs2/ops_file.c (Steven Whitehouse 2009-01-12 10:43:39 +0000 1202) #ifdef CONFIG_GFS2_FS_LOCKING_DLM
f057f6cdf6417 fs/gfs2/ops_file.c (Steven Whitehouse 2009-01-12 10:43:39 +0000 1203)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1204) /**
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1205) * gfs2_lock - acquire/release a posix lock on a file
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1206) * @file: the file pointer
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1207) * @cmd: either modify or retrieve lock state, possibly wait
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1208) * @fl: type and range of lock
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1209) *
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1210) * Returns: errno
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1211) */
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1212)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1213) static int gfs2_lock(struct file *file, int cmd, struct file_lock *fl)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1214) {
feaa7bba026c1 fs/gfs2/ops_file.c (Steven Whitehouse 2006-06-14 15:32:57 -0400 1215) struct gfs2_inode *ip = GFS2_I(file->f_mapping->host);
feaa7bba026c1 fs/gfs2/ops_file.c (Steven Whitehouse 2006-06-14 15:32:57 -0400 1216) struct gfs2_sbd *sdp = GFS2_SB(file->f_mapping->host);
f057f6cdf6417 fs/gfs2/ops_file.c (Steven Whitehouse 2009-01-12 10:43:39 +0000 1217) struct lm_lockstruct *ls = &sdp->sd_lockstruct;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1218)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1219) if (!(fl->fl_flags & FL_POSIX))
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1220) return -ENOLCK;
720e7749279bd fs/gfs2/file.c (Sachin Prabhu 2010-03-11 12:24:45 -0500 1221) if (__mandatory_lock(&ip->i_inode) && fl->fl_type != F_UNLCK)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1222) return -ENOLCK;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1223)
586759f03e2e9 fs/gfs2/ops_file.c (Marc Eshel 2006-11-14 16:37:25 -0500 1224) if (cmd == F_CANCELLK) {
586759f03e2e9 fs/gfs2/ops_file.c (Marc Eshel 2006-11-14 16:37:25 -0500 1225) /* Hack: */
586759f03e2e9 fs/gfs2/ops_file.c (Marc Eshel 2006-11-14 16:37:25 -0500 1226) cmd = F_SETLK;
586759f03e2e9 fs/gfs2/ops_file.c (Marc Eshel 2006-11-14 16:37:25 -0500 1227) fl->fl_type = F_UNLCK;
586759f03e2e9 fs/gfs2/ops_file.c (Marc Eshel 2006-11-14 16:37:25 -0500 1228) }
eb43e660c0940 fs/gfs2/file.c (Bob Peterson 2019-11-14 09:52:15 -0500 1229) if (unlikely(gfs2_withdrawn(sdp))) {
c2952d202f710 fs/gfs2/file.c (Steven Whitehouse 2013-03-14 15:49:59 +0000 1230) if (fl->fl_type == F_UNLCK)
4f6563677ae83 fs/gfs2/file.c (Benjamin Coddington 2015-10-22 13:38:14 -0400 1231) locks_lock_file_wait(file, fl);
f057f6cdf6417 fs/gfs2/ops_file.c (Steven Whitehouse 2009-01-12 10:43:39 +0000 1232) return -EIO;
c2952d202f710 fs/gfs2/file.c (Steven Whitehouse 2013-03-14 15:49:59 +0000 1233) }
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1234) if (IS_GETLK(cmd))
f057f6cdf6417 fs/gfs2/ops_file.c (Steven Whitehouse 2009-01-12 10:43:39 +0000 1235) return dlm_posix_get(ls->ls_dlm, ip->i_no_addr, file, fl);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1236) else if (fl->fl_type == F_UNLCK)
f057f6cdf6417 fs/gfs2/ops_file.c (Steven Whitehouse 2009-01-12 10:43:39 +0000 1237) return dlm_posix_unlock(ls->ls_dlm, ip->i_no_addr, file, fl);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1238) else
f057f6cdf6417 fs/gfs2/ops_file.c (Steven Whitehouse 2009-01-12 10:43:39 +0000 1239) return dlm_posix_lock(ls->ls_dlm, ip->i_no_addr, file, cmd, fl);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1240) }
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1241)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1242) static int do_flock(struct file *file, int cmd, struct file_lock *fl)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1243) {
5c676f6d359b0 fs/gfs2/ops_file.c (Steven Whitehouse 2006-02-27 17:23:27 -0500 1244) struct gfs2_file *fp = file->private_data;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1245) struct gfs2_holder *fl_gh = &fp->f_fl_gh;
496ad9aa8ef44 fs/gfs2/file.c (Al Viro 2013-01-23 17:07:38 -0500 1246) struct gfs2_inode *ip = GFS2_I(file_inode(file));
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1247) struct gfs2_glock *gl;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1248) unsigned int state;
b58bf407ca466 fs/gfs2/file.c (Bob Peterson 2015-07-24 09:45:43 -0500 1249) u16 flags;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1250) int error = 0;
2ddfbdd6848d4 fs/gfs2/file.c (Bob Peterson 2014-08-20 12:44:45 -0400 1251) int sleeptime;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1252)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1253) state = (fl->fl_type == F_WRLCK) ? LM_ST_EXCLUSIVE : LM_ST_SHARED;
2ddfbdd6848d4 fs/gfs2/file.c (Bob Peterson 2014-08-20 12:44:45 -0400 1254) flags = (IS_SETLKW(cmd) ? 0 : LM_FLAG_TRY_1CB) | GL_EXACT;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1255)
f55ab26a8f92a fs/gfs2/ops_file.c (Steven Whitehouse 2006-02-21 12:51:39 +0000 1256) mutex_lock(&fp->f_fl_mutex);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1257)
283c9a97be1d7 fs/gfs2/file.c (Andreas Gruenbacher 2017-07-17 13:39:15 -0500 1258) if (gfs2_holder_initialized(fl_gh)) {
4d62d3f70b9b2 fs/gfs2/file.c (NeilBrown 2018-11-30 10:04:08 +1100 1259) struct file_lock request;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1260) if (fl_gh->gh_state == state)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1261) goto out;
4d62d3f70b9b2 fs/gfs2/file.c (NeilBrown 2018-11-30 10:04:08 +1100 1262) locks_init_lock(&request);
4d62d3f70b9b2 fs/gfs2/file.c (NeilBrown 2018-11-30 10:04:08 +1100 1263) request.fl_type = F_UNLCK;
4d62d3f70b9b2 fs/gfs2/file.c (NeilBrown 2018-11-30 10:04:08 +1100 1264) request.fl_flags = FL_FLOCK;
4d62d3f70b9b2 fs/gfs2/file.c (NeilBrown 2018-11-30 10:04:08 +1100 1265) locks_lock_file_wait(file, &request);
5bef3e7cf18c5 fs/gfs2/file.c (Bob Peterson 2014-06-26 10:46:25 -0400 1266) gfs2_glock_dq(fl_gh);
b4c20166dcfca fs/gfs2/ops_file.c (Abhijith Das 2007-09-13 23:35:27 -0500 1267) gfs2_holder_reinit(state, flags, fl_gh);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1268) } else {
6802e3400ff45 fs/gfs2/ops_file.c (Steven Whitehouse 2008-05-21 17:03:22 +0100 1269) error = gfs2_glock_get(GFS2_SB(&ip->i_inode), ip->i_no_addr,
6802e3400ff45 fs/gfs2/ops_file.c (Steven Whitehouse 2008-05-21 17:03:22 +0100 1270) &gfs2_flock_glops, CREATE, &gl);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1271) if (error)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1272) goto out;
b4c20166dcfca fs/gfs2/ops_file.c (Abhijith Das 2007-09-13 23:35:27 -0500 1273) gfs2_holder_init(gl, state, flags, fl_gh);
b4c20166dcfca fs/gfs2/ops_file.c (Abhijith Das 2007-09-13 23:35:27 -0500 1274) gfs2_glock_put(gl);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1275) }
2ddfbdd6848d4 fs/gfs2/file.c (Bob Peterson 2014-08-20 12:44:45 -0400 1276) for (sleeptime = 1; sleeptime <= 4; sleeptime <<= 1) {
2ddfbdd6848d4 fs/gfs2/file.c (Bob Peterson 2014-08-20 12:44:45 -0400 1277) error = gfs2_glock_nq(fl_gh);
2ddfbdd6848d4 fs/gfs2/file.c (Bob Peterson 2014-08-20 12:44:45 -0400 1278) if (error != GLR_TRYFAILED)
2ddfbdd6848d4 fs/gfs2/file.c (Bob Peterson 2014-08-20 12:44:45 -0400 1279) break;
2ddfbdd6848d4 fs/gfs2/file.c (Bob Peterson 2014-08-20 12:44:45 -0400 1280) fl_gh->gh_flags = LM_FLAG_TRY | GL_EXACT;
2ddfbdd6848d4 fs/gfs2/file.c (Bob Peterson 2014-08-20 12:44:45 -0400 1281) fl_gh->gh_error = 0;
2ddfbdd6848d4 fs/gfs2/file.c (Bob Peterson 2014-08-20 12:44:45 -0400 1282) msleep(sleeptime);
2ddfbdd6848d4 fs/gfs2/file.c (Bob Peterson 2014-08-20 12:44:45 -0400 1283) }
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1284) if (error) {
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1285) gfs2_holder_uninit(fl_gh);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1286) if (error == GLR_TRYFAILED)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1287) error = -EAGAIN;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1288) } else {
4f6563677ae83 fs/gfs2/file.c (Benjamin Coddington 2015-10-22 13:38:14 -0400 1289) error = locks_lock_file_wait(file, fl);
feaa7bba026c1 fs/gfs2/ops_file.c (Steven Whitehouse 2006-06-14 15:32:57 -0400 1290) gfs2_assert_warn(GFS2_SB(&ip->i_inode), !error);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1291) }
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1292)
420b9e5e45d33 fs/gfs2/ops_file.c (Steven Whitehouse 2006-07-31 15:42:17 -0400 1293) out:
f55ab26a8f92a fs/gfs2/ops_file.c (Steven Whitehouse 2006-02-21 12:51:39 +0000 1294) mutex_unlock(&fp->f_fl_mutex);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1295) return error;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1296) }
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1297)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1298) static void do_unflock(struct file *file, struct file_lock *fl)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1299) {
5c676f6d359b0 fs/gfs2/ops_file.c (Steven Whitehouse 2006-02-27 17:23:27 -0500 1300) struct gfs2_file *fp = file->private_data;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1301) struct gfs2_holder *fl_gh = &fp->f_fl_gh;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1302)
f55ab26a8f92a fs/gfs2/ops_file.c (Steven Whitehouse 2006-02-21 12:51:39 +0000 1303) mutex_lock(&fp->f_fl_mutex);
4f6563677ae83 fs/gfs2/file.c (Benjamin Coddington 2015-10-22 13:38:14 -0400 1304) locks_lock_file_wait(file, fl);
6df9f9a253c7d fs/gfs2/file.c (Andreas Gruenbacher 2016-06-17 07:31:27 -0500 1305) if (gfs2_holder_initialized(fl_gh)) {
2ddfbdd6848d4 fs/gfs2/file.c (Bob Peterson 2014-08-20 12:44:45 -0400 1306) gfs2_glock_dq(fl_gh);
0a33443b38746 fs/gfs2/file.c (Steven Whitehouse 2011-03-09 11:14:32 +0000 1307) gfs2_holder_uninit(fl_gh);
0a33443b38746 fs/gfs2/file.c (Steven Whitehouse 2011-03-09 11:14:32 +0000 1308) }
f55ab26a8f92a fs/gfs2/ops_file.c (Steven Whitehouse 2006-02-21 12:51:39 +0000 1309) mutex_unlock(&fp->f_fl_mutex);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1310) }
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1311)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1312) /**
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1313) * gfs2_flock - acquire/release a flock lock on a file
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1314) * @file: the file pointer
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1315) * @cmd: either modify or retrieve lock state, possibly wait
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1316) * @fl: type and range of lock
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1317) *
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1318) * Returns: errno
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1319) */
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1320)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1321) static int gfs2_flock(struct file *file, int cmd, struct file_lock *fl)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1322) {
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1323) if (!(fl->fl_flags & FL_FLOCK))
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1324) return -ENOLCK;
a12af1ebe675e fs/gfs2/file.c (Abhijith Das 2009-06-01 12:30:03 -0500 1325) if (fl->fl_type & LOCK_MAND)
a12af1ebe675e fs/gfs2/file.c (Abhijith Das 2009-06-01 12:30:03 -0500 1326) return -EOPNOTSUPP;
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1327)
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1328) if (fl->fl_type == F_UNLCK) {
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1329) do_unflock(file, fl);
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1330) return 0;
d00223f169317 fs/gfs2/ops_file.c (Steven Whitehouse 2006-10-02 10:28:05 -0400 1331) } else {
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1332) return do_flock(file, cmd, fl);
d00223f169317 fs/gfs2/ops_file.c (Steven Whitehouse 2006-10-02 10:28:05 -0400 1333) }
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1334) }
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1335)
10d2198805d7f fs/gfs2/ops_file.c (Christoph Hellwig 2009-04-07 19:42:17 +0200 1336) const struct file_operations gfs2_file_fops = {
26c1a57412b59 fs/gfs2/ops_file.c (Steven Whitehouse 2006-09-04 15:32:10 -0400 1337) .llseek = gfs2_llseek,
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 1338) .read_iter = gfs2_file_read_iter,
da56e45b6ee83 fs/gfs2/file.c (Al Viro 2014-04-03 14:11:01 -0400 1339) .write_iter = gfs2_file_write_iter,
81214bab582ee fs/gfs2/file.c (Christoph Hellwig 2018-12-04 11:12:08 -0700 1340) .iopoll = iomap_dio_iopoll,
26c1a57412b59 fs/gfs2/ops_file.c (Steven Whitehouse 2006-09-04 15:32:10 -0400 1341) .unlocked_ioctl = gfs2_ioctl,
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 1342) .compat_ioctl = gfs2_compat_ioctl,
26c1a57412b59 fs/gfs2/ops_file.c (Steven Whitehouse 2006-09-04 15:32:10 -0400 1343) .mmap = gfs2_mmap,
26c1a57412b59 fs/gfs2/ops_file.c (Steven Whitehouse 2006-09-04 15:32:10 -0400 1344) .open = gfs2_open,
df3fd117f9802 fs/gfs2/file.c (Bob Peterson 2012-04-11 12:56:41 -0400 1345) .release = gfs2_release,
26c1a57412b59 fs/gfs2/ops_file.c (Steven Whitehouse 2006-09-04 15:32:10 -0400 1346) .fsync = gfs2_fsync,
26c1a57412b59 fs/gfs2/ops_file.c (Steven Whitehouse 2006-09-04 15:32:10 -0400 1347) .lock = gfs2_lock,
26c1a57412b59 fs/gfs2/ops_file.c (Steven Whitehouse 2006-09-04 15:32:10 -0400 1348) .flock = gfs2_flock,
82c156f853840 fs/gfs2/file.c (Al Viro 2016-09-22 23:35:42 -0400 1349) .splice_read = generic_file_splice_read,
f42a69fadc4b9 fs/gfs2/file.c (Bob Peterson 2015-02-19 08:02:16 -0600 1350) .splice_write = gfs2_file_splice_write,
1c994a0909a55 fs/gfs2/file.c (Jeff Layton 2014-08-27 06:49:41 -0400 1351) .setlease = simple_nosetlease,
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1352) .fallocate = gfs2_fallocate,
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1353) };
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1354)
10d2198805d7f fs/gfs2/ops_file.c (Christoph Hellwig 2009-04-07 19:42:17 +0200 1355) const struct file_operations gfs2_dir_fops = {
1d1bb236bc2ff fs/gfs2/file.c (Al Viro 2016-05-12 17:00:20 -0400 1356) .iterate_shared = gfs2_readdir,
26c1a57412b59 fs/gfs2/ops_file.c (Steven Whitehouse 2006-09-04 15:32:10 -0400 1357) .unlocked_ioctl = gfs2_ioctl,
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 1358) .compat_ioctl = gfs2_compat_ioctl,
26c1a57412b59 fs/gfs2/ops_file.c (Steven Whitehouse 2006-09-04 15:32:10 -0400 1359) .open = gfs2_open,
df3fd117f9802 fs/gfs2/file.c (Bob Peterson 2012-04-11 12:56:41 -0400 1360) .release = gfs2_release,
26c1a57412b59 fs/gfs2/ops_file.c (Steven Whitehouse 2006-09-04 15:32:10 -0400 1361) .fsync = gfs2_fsync,
26c1a57412b59 fs/gfs2/ops_file.c (Steven Whitehouse 2006-09-04 15:32:10 -0400 1362) .lock = gfs2_lock,
26c1a57412b59 fs/gfs2/ops_file.c (Steven Whitehouse 2006-09-04 15:32:10 -0400 1363) .flock = gfs2_flock,
6038f373a3dc1 fs/gfs2/file.c (Arnd Bergmann 2010-08-15 18:52:59 +0200 1364) .llseek = default_llseek,
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1365) };
b3b94faa5fe59 fs/gfs2/ops_file.c (David Teigland 2006-01-16 16:50:04 +0000 1366)
f057f6cdf6417 fs/gfs2/ops_file.c (Steven Whitehouse 2009-01-12 10:43:39 +0000 1367) #endif /* CONFIG_GFS2_FS_LOCKING_DLM */
f057f6cdf6417 fs/gfs2/ops_file.c (Steven Whitehouse 2009-01-12 10:43:39 +0000 1368)
10d2198805d7f fs/gfs2/ops_file.c (Christoph Hellwig 2009-04-07 19:42:17 +0200 1369) const struct file_operations gfs2_file_fops_nolock = {
c97bfe4351771 fs/gfs2/ops_file.c (Wendy Cheng 2007-11-29 17:56:51 -0500 1370) .llseek = gfs2_llseek,
967bcc91b0449 fs/gfs2/file.c (Andreas Gruenbacher 2018-06-19 15:08:02 +0100 1371) .read_iter = gfs2_file_read_iter,
da56e45b6ee83 fs/gfs2/file.c (Al Viro 2014-04-03 14:11:01 -0400 1372) .write_iter = gfs2_file_write_iter,
81214bab582ee fs/gfs2/file.c (Christoph Hellwig 2018-12-04 11:12:08 -0700 1373) .iopoll = iomap_dio_iopoll,
c97bfe4351771 fs/gfs2/ops_file.c (Wendy Cheng 2007-11-29 17:56:51 -0500 1374) .unlocked_ioctl = gfs2_ioctl,
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 1375) .compat_ioctl = gfs2_compat_ioctl,
c97bfe4351771 fs/gfs2/ops_file.c (Wendy Cheng 2007-11-29 17:56:51 -0500 1376) .mmap = gfs2_mmap,
c97bfe4351771 fs/gfs2/ops_file.c (Wendy Cheng 2007-11-29 17:56:51 -0500 1377) .open = gfs2_open,
df3fd117f9802 fs/gfs2/file.c (Bob Peterson 2012-04-11 12:56:41 -0400 1378) .release = gfs2_release,
c97bfe4351771 fs/gfs2/ops_file.c (Wendy Cheng 2007-11-29 17:56:51 -0500 1379) .fsync = gfs2_fsync,
82c156f853840 fs/gfs2/file.c (Al Viro 2016-09-22 23:35:42 -0400 1380) .splice_read = generic_file_splice_read,
f42a69fadc4b9 fs/gfs2/file.c (Bob Peterson 2015-02-19 08:02:16 -0600 1381) .splice_write = gfs2_file_splice_write,
f057f6cdf6417 fs/gfs2/ops_file.c (Steven Whitehouse 2009-01-12 10:43:39 +0000 1382) .setlease = generic_setlease,
2fe17c1075836 fs/gfs2/file.c (Christoph Hellwig 2011-01-14 13:07:43 +0100 1383) .fallocate = gfs2_fallocate,
c97bfe4351771 fs/gfs2/ops_file.c (Wendy Cheng 2007-11-29 17:56:51 -0500 1384) };
c97bfe4351771 fs/gfs2/ops_file.c (Wendy Cheng 2007-11-29 17:56:51 -0500 1385)
10d2198805d7f fs/gfs2/ops_file.c (Christoph Hellwig 2009-04-07 19:42:17 +0200 1386) const struct file_operations gfs2_dir_fops_nolock = {
1d1bb236bc2ff fs/gfs2/file.c (Al Viro 2016-05-12 17:00:20 -0400 1387) .iterate_shared = gfs2_readdir,
c97bfe4351771 fs/gfs2/ops_file.c (Wendy Cheng 2007-11-29 17:56:51 -0500 1388) .unlocked_ioctl = gfs2_ioctl,
8d0980704842e fs/gfs2/file.c (Arnd Bergmann 2019-06-03 13:40:01 +0200 1389) .compat_ioctl = gfs2_compat_ioctl,
c97bfe4351771 fs/gfs2/ops_file.c (Wendy Cheng 2007-11-29 17:56:51 -0500 1390) .open = gfs2_open,
df3fd117f9802 fs/gfs2/file.c (Bob Peterson 2012-04-11 12:56:41 -0400 1391) .release = gfs2_release,
c97bfe4351771 fs/gfs2/ops_file.c (Wendy Cheng 2007-11-29 17:56:51 -0500 1392) .fsync = gfs2_fsync,
6038f373a3dc1 fs/gfs2/file.c (Arnd Bergmann 2010-08-15 18:52:59 +0200 1393) .llseek = default_llseek,
c97bfe4351771 fs/gfs2/ops_file.c (Wendy Cheng 2007-11-29 17:56:51 -0500 1394) };
c97bfe4351771 fs/gfs2/ops_file.c (Wendy Cheng 2007-11-29 17:56:51 -0500 1395)