From nobody Fri Nov 29 21:41:34 2024 Received: from mail-pl1-f169.google.com (mail-pl1-f169.google.com [209.85.214.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5BB8D156871 for ; Fri, 13 Sep 2024 21:28:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726262896; cv=none; b=kCUVCYUkpLbXXl3IZmD6g5F9XHSDgpdP9I364yXr+vTPdRRnbh96X52Kqkm6ROSlA5HLjhZ4XRiZ4E9L3cs9HUOC9mMIUwoQIQWDcvHEFOrQh/1p6XjBzpViZ5NhfPUWKglGRnfP6Yr9TvXDY6fktxRBxpbH06gIg0Xdawt7fwI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726262896; c=relaxed/simple; bh=4d+DAX5wGTlILa5cIdrqQckIweHF1ZtVvDoZtaL/06k=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=N9YGrFiFZBooUz3qCdVDoIH606wU55U8CPHw2KJGVJ6gI646n4Vm00/OE7JncInbWt8JW9Ak+QmbelX27e49Ttq1YMsQxd6X7YApiwP37Lr/8MUEka9sK0YYt/aHhDbQ7NOMuFv32wjqb/3DEQ+x9/lGOfNHaiUTYtbOgfHvyoY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=QlwkzKt0; arc=none smtp.client-ip=209.85.214.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="QlwkzKt0" Received: by mail-pl1-f169.google.com with SMTP id d9443c01a7336-2059112f0a7so13268515ad.3 for ; Fri, 13 Sep 2024 14:28:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1726262894; x=1726867694; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=KVG23AigdSEcYIckbH7L+1W8M43gDiw8Ym9/eiz52ac=; b=QlwkzKt0HWqt2zDusQ4e0twgd37IreZyGnGg4n2d6U5sjA+1KmMvxcpLPSlGuvDSfT I2LZleAT6QAKbFYC64sm2vevyEXQj1uVsk1lVNJfRzbTtPmReG/j+r41mZMljOZIxG6Q IiwtEiPr8zFohMhWxR1hQ6RFq5uCNbcYmDPeRiKjFDFoixdWRQZWs157Wgt2h69nphxb YdMiaFqC9RXHb7RAL1bhtmPfOFLsYJ3AivwWrVxDmoqWNHKkqjLRYfLEGerzqR63STQK tIrgRoom+lv0lPr7qSVbFPb2nyQiChq40LNy5M2lmFzTAmnNRJrvoEffmmdxeRmhwjK9 QY4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1726262894; x=1726867694; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=KVG23AigdSEcYIckbH7L+1W8M43gDiw8Ym9/eiz52ac=; b=CFd8l9QF9HPldPa0l/q60BhY3HvPCvqgFyrCVd7DSU2WAIE4a5E3cgyBYZNOryEXaN HyMg7fZM/T6Oxdwv35okwhNm9Fs+pxeCoLH8hNNt2pHWsqOUEM7qeVh4TlJqcEUmMezD xAWriuLZgCmt3cHJ4Unkug0i7FLDTshmdaWSXRkT0yc2VaPv0+z6YoxID4CoNvzWUOdj Pe1oSXBFvfSHi7VgsraCZIamsFgQ+pm59mJnjFeLNuaMqbp79hx/ggEHYVa6l5q2U4am bIeeWhNDnLTWJiJ85kD/Py0l77aHzYlVJKWWvejeIsFOgsrgVGR/rCbyOYX3XS3JDnuD sObw== X-Gm-Message-State: AOJu0YzsZ3xh3X5SbeSoMrPClxj5lkJfM4HufiWs70hVdEIBv3KkeASz oRHWb1UrOo2eP5UomCtkHqkAgq3zI02N0Or6s8e44deX3tFgpjlHQwVCRw== X-Google-Smtp-Source: AGHT+IFG5ywdSWIM8lFqMyfJVO7QTjsE/N+6pO9sNvpgl532ddHON9QVvRTetKx4HKu3CcUjEpMwlg== X-Received: by 2002:a17:902:f644:b0:205:4e15:54c8 with SMTP id d9443c01a7336-20782c1d497mr47685145ad.61.1726262893925; Fri, 13 Sep 2024 14:28:13 -0700 (PDT) Received: from daehojeong-desktop.mtv.corp.google.com ([2a00:79e0:2e14:7:aed:aa32:e7d7:7fa9]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-207946fcad2sm670235ad.211.2024.09.13.14.28.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Sep 2024 14:28:13 -0700 (PDT) From: Daeho Jeong To: linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, kernel-team@android.com Cc: Daeho Jeong Subject: [PATCH] f2fs: introduce device aliasing file Date: Fri, 13 Sep 2024 14:28:10 -0700 Message-ID: <20240913212810.912171-1-daeho43@gmail.com> X-Mailer: git-send-email 2.46.0.662.g92d0881bb0-goog Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Daeho Jeong F2FS should understand how the device aliasing file works and support deleting the file after use. A device aliasing file can be created by mkfs.f2fs tool and it can map the whole device with an extrent, not using node blocks. The file space should be pinned and normally used for read-only usages. Signed-off-by: Daeho Jeong --- fs/f2fs/data.c | 5 +++++ fs/f2fs/extent_cache.c | 10 ++++++++++ fs/f2fs/f2fs.h | 5 +++++ fs/f2fs/file.c | 36 ++++++++++++++++++++++++++++++++---- fs/f2fs/inode.c | 10 ++++++++-- fs/f2fs/sysfs.c | 2 ++ 6 files changed, 62 insertions(+), 6 deletions(-) diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 6457e5bca9c9..9ce92093ba1e 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -3423,6 +3423,11 @@ static int prepare_write_begin(struct f2fs_sb_info *= sbi, =20 if (!f2fs_lookup_read_extent_cache_block(inode, index, &dn.data_blkaddr)) { + if (IS_DEVICE_ALIASING(inode)) { + err =3D -ENODATA; + goto out; + } + if (locked) { err =3D f2fs_reserve_block(&dn, index); goto out; diff --git a/fs/f2fs/extent_cache.c b/fs/f2fs/extent_cache.c index fd1fc06359ee..03883963b991 100644 --- a/fs/f2fs/extent_cache.c +++ b/fs/f2fs/extent_cache.c @@ -401,6 +401,11 @@ void f2fs_init_read_extent_tree(struct inode *inode, s= truct page *ipage) if (atomic_read(&et->node_cnt) || !ei.len) goto skip; =20 + if (IS_DEVICE_ALIASING(inode)) { + et->largest =3D ei; + goto skip; + } + en =3D __attach_extent_node(sbi, et, &ei, NULL, &et->root.rb_root.rb_node, true); if (en) { @@ -463,6 +468,11 @@ static bool __lookup_extent_tree(struct inode *inode, = pgoff_t pgofs, goto out; } =20 + if (IS_DEVICE_ALIASING(inode)) { + ret =3D false; + goto out; + } + en =3D __lookup_extent_node(&et->root, et->cached_en, pgofs); if (!en) goto out; diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index ac19c61f0c3e..59179b9b3a83 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -208,6 +208,7 @@ struct f2fs_mount_info { #define F2FS_FEATURE_CASEFOLD 0x00001000 #define F2FS_FEATURE_COMPRESSION 0x00002000 #define F2FS_FEATURE_RO 0x00004000 +#define F2FS_FEATURE_DEVICE_ALIAS 0x00008000 =20 #define __F2FS_HAS_FEATURE(raw_super, mask) \ ((raw_super->feature & cpu_to_le32(mask)) !=3D 0) @@ -3001,6 +3002,7 @@ static inline void f2fs_change_bit(unsigned int nr, c= har *addr) #define F2FS_DIRSYNC_FL 0x00010000 /* dirsync behaviour (directories onl= y) */ #define F2FS_PROJINHERIT_FL 0x20000000 /* Create with parents projid */ #define F2FS_CASEFOLD_FL 0x40000000 /* Casefolded file */ +#define F2FS_DEVICE_ALIAS_FL 0x80000000 /* File for aliasing a device */ =20 #define F2FS_QUOTA_DEFAULT_FL (F2FS_NOATIME_FL | F2FS_IMMUTABLE_FL) =20 @@ -3016,6 +3018,8 @@ static inline void f2fs_change_bit(unsigned int nr, c= har *addr) /* Flags that are appropriate for non-directories/regular files. */ #define F2FS_OTHER_FLMASK (F2FS_NODUMP_FL | F2FS_NOATIME_FL) =20 +#define IS_DEVICE_ALIASING(inode) (F2FS_I(inode)->i_flags & F2FS_DEVICE_AL= IAS_FL) + static inline __u32 f2fs_mask_flags(umode_t mode, __u32 flags) { if (S_ISDIR(mode)) @@ -4478,6 +4482,7 @@ F2FS_FEATURE_FUNCS(sb_chksum, SB_CHKSUM); F2FS_FEATURE_FUNCS(casefold, CASEFOLD); F2FS_FEATURE_FUNCS(compression, COMPRESSION); F2FS_FEATURE_FUNCS(readonly, RO); +F2FS_FEATURE_FUNCS(device_alias, DEVICE_ALIAS); =20 #ifdef CONFIG_BLK_DEV_ZONED static inline bool f2fs_blkz_is_seq(struct f2fs_sb_info *sbi, int devi, diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 168f08507004..0f4af6b303ff 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -727,6 +727,11 @@ int f2fs_do_truncate_blocks(struct inode *inode, u64 f= rom, bool lock) =20 trace_f2fs_truncate_blocks_enter(inode, from); =20 + if (IS_DEVICE_ALIASING(inode) && from) { + err =3D -EINVAL; + goto out_err; + } + free_from =3D (pgoff_t)F2FS_BLK_ALIGN(from); =20 if (free_from >=3D max_file_blocks(inode)) @@ -741,6 +746,21 @@ int f2fs_do_truncate_blocks(struct inode *inode, u64 f= rom, bool lock) goto out; } =20 + if (IS_DEVICE_ALIASING(inode)) { + struct extent_tree *et =3D F2FS_I(inode)->extent_tree[EX_READ]; + struct extent_info ei =3D et->largest; + unsigned int i; + + for (i =3D 0; i < ei.len; i++) + f2fs_invalidate_blocks(sbi, ei.blk + i); + + dec_valid_block_count(sbi, inode, ei.len); + f2fs_update_time(sbi, REQ_TIME); + + f2fs_put_page(ipage, 1); + goto out; + } + if (f2fs_has_inline_data(inode)) { f2fs_truncate_inline_inode(inode, ipage, from); f2fs_put_page(ipage, 1); @@ -776,7 +796,7 @@ int f2fs_do_truncate_blocks(struct inode *inode, u64 fr= om, bool lock) /* lastly zero out the first data page */ if (!err) err =3D truncate_partial_data_page(inode, from, truncate_page); - +out_err: trace_f2fs_truncate_blocks_exit(inode, err); return err; } @@ -994,7 +1014,8 @@ int f2fs_setattr(struct mnt_idmap *idmap, struct dentr= y *dentry, return -EPERM; =20 if ((attr->ia_valid & ATTR_SIZE)) { - if (!f2fs_is_compress_backend_ready(inode)) + if (!f2fs_is_compress_backend_ready(inode) || + IS_DEVICE_ALIASING(inode)) return -EOPNOTSUPP; if (is_inode_flag_set(inode, FI_COMPRESS_RELEASED) && !IS_ALIGNED(attr->ia_size, @@ -1855,7 +1876,7 @@ static long f2fs_fallocate(struct file *file, int mod= e, return -EIO; if (!f2fs_is_checkpoint_ready(F2FS_I_SB(inode))) return -ENOSPC; - if (!f2fs_is_compress_backend_ready(inode)) + if (!f2fs_is_compress_backend_ready(inode) || IS_DEVICE_ALIASING(inode)) return -EOPNOTSUPP; =20 /* f2fs only support ->fallocate for regular file */ @@ -3264,6 +3285,9 @@ int f2fs_pin_file_control(struct inode *inode, bool i= nc) struct f2fs_inode_info *fi =3D F2FS_I(inode); struct f2fs_sb_info *sbi =3D F2FS_I_SB(inode); =20 + if (IS_DEVICE_ALIASING(inode)) + return -EINVAL; + if (fi->i_gc_failures >=3D sbi->gc_pin_file_threshold) { f2fs_warn(sbi, "%s: Enable GC =3D ino %lx after %x GC trials", __func__, inode->i_ino, fi->i_gc_failures); @@ -3294,6 +3318,9 @@ static int f2fs_ioc_set_pin_file(struct file *filp, u= nsigned long arg) if (f2fs_readonly(sbi->sb)) return -EROFS; =20 + if (!pin && IS_DEVICE_ALIASING(inode)) + return -EOPNOTSUPP; + ret =3D mnt_want_write_file(filp); if (ret) return ret; @@ -4711,7 +4738,8 @@ static int f2fs_preallocate_blocks(struct kiocb *iocb= , struct iov_iter *iter, else return 0; =20 - map.m_may_create =3D true; + if (!IS_DEVICE_ALIASING(inode)) + map.m_may_create =3D true; if (dio) { map.m_seg_type =3D f2fs_rw_hint_to_seg_type(sbi, inode->i_write_hint); diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index aef57172014f..f118e955ba88 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -367,6 +367,12 @@ static bool sanity_check_inode(struct inode *inode, st= ruct page *node_page) return false; } =20 + if ((fi->i_flags & F2FS_DEVICE_ALIAS_FL) && !f2fs_sb_has_device_alias(sbi= )) { + f2fs_warn(sbi, "%s: inode (ino=3D%lx) has device alias flag, but the fea= ture is off", + __func__, inode->i_ino); + return false; + } + return true; } =20 @@ -818,8 +824,6 @@ void f2fs_evict_inode(struct inode *inode) f2fs_bug_on(sbi, get_dirty_pages(inode)); f2fs_remove_dirty_inode(inode); =20 - f2fs_destroy_extent_tree(inode); - if (inode->i_nlink || is_bad_inode(inode)) goto no_delete; =20 @@ -874,6 +878,8 @@ void f2fs_evict_inode(struct inode *inode) goto retry; } =20 + f2fs_destroy_extent_tree(inode); + if (err) { f2fs_update_inode_page(inode); if (dquot_initialize_needed(inode)) diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c index fee7ee45ceaa..bf64f4cc3522 100644 --- a/fs/f2fs/sysfs.c +++ b/fs/f2fs/sysfs.c @@ -1281,6 +1281,7 @@ F2FS_SB_FEATURE_RO_ATTR(sb_checksum, SB_CHKSUM); F2FS_SB_FEATURE_RO_ATTR(casefold, CASEFOLD); F2FS_SB_FEATURE_RO_ATTR(compression, COMPRESSION); F2FS_SB_FEATURE_RO_ATTR(readonly, RO); +F2FS_SB_FEATURE_RO_ATTR(device_alias, DEVICE_ALIAS); =20 static struct attribute *f2fs_sb_feat_attrs[] =3D { ATTR_LIST(sb_encryption), @@ -1297,6 +1298,7 @@ static struct attribute *f2fs_sb_feat_attrs[] =3D { ATTR_LIST(sb_casefold), ATTR_LIST(sb_compression), ATTR_LIST(sb_readonly), + ATTR_LIST(sb_device_alias), NULL, }; ATTRIBUTE_GROUPS(f2fs_sb_feat); --=20 2.46.0.662.g92d0881bb0-goog