Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

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