From nobody Thu Apr 2 17:22:44 2026 Received: from mail-qt1-f175.google.com (mail-qt1-f175.google.com [209.85.160.175]) (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 9FA6F306483 for ; Tue, 10 Feb 2026 22:23:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770762200; cv=none; b=b00ZJ0gWNNFHNOIGsgAf02sUNyIxl7vusN+GUf0OdRiiYrZdjluwb4eliJllHWbeKJMSEJT1TVGFB0XGQfYhMG+V/AYwqFSW5HbcO2y/jKbE83edmVC881uLaspuKyig3TMjyaEhr3Mil4wVLxKo0Mfccok/xB6UeSvny4GWKcE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770762200; c=relaxed/simple; bh=m6kuT4ru0pzsc9PoL8u98ZqQt+Y4v5WSn+QSSceV3h8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iDJUT10+LxZkxnZOYKqHWJy9BfphmafF+RfiwGbCQGfMU8QqxBzLfThA1pwY2jBQzvE2X977yoRFTvDlZk/vxZN6M8XH2CHn/CFSmAptNcuVxJO8DCPHN3iV1XsdAuw/zJlfM6xRlowzvPcHqQPxUE5YfSrS2rfuo0rEZ0v8zsE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=zetier.com; spf=pass smtp.mailfrom=zetier.com; dkim=pass (2048-bit key) header.d=zetier.com header.i=@zetier.com header.b=WjwwxfHZ; arc=none smtp.client-ip=209.85.160.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=zetier.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=zetier.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=zetier.com header.i=@zetier.com header.b="WjwwxfHZ" Received: by mail-qt1-f175.google.com with SMTP id d75a77b69052e-5033a2c4b81so52607721cf.0 for ; Tue, 10 Feb 2026 14:23:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zetier.com; s=gm; t=1770762199; x=1771366999; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=img53VqC7R04RkA7EExplxfa/I0yMn636xW9pad0/C0=; b=WjwwxfHZpFnfNu/jlAZ3RYNqn8ZFNr979TJtEc85iK5g+V2cIa4WwcIqxm7sGQUZoF YxMEUH92dY9VZiA8rkAo8XXFycFalAqrXgjwU6TVdA2Ww1A1PaFhhacmsCmAgCX3lhz4 Jhm8n10XfisEURrIMNRaphB1LvnsO8LOdk/Bkcz2wr5KoE1s/wCFqhGj9JQp9B7qpzZq S9rTO8p+BmTnr1Y9ZdFdTpI3GI+wTFLk034sC+1hXnQTbGsUidNbVmalpPFEkbExU+3Z 6YNecv2Mam0m0R95wwY0E0ZmyScrabG7Pi8DGsyGFmJ73gKW5Pfhm/CbIth7wUVEXP6b O0Vg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770762199; x=1771366999; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=img53VqC7R04RkA7EExplxfa/I0yMn636xW9pad0/C0=; b=vlKeuv5tg9arnDSQj+rheID3YBk5VfqqaiMwz6p7aYtg40OSR3C2uCnCJx6AkUdmw7 2PWtMnfCNA49Y9Td5igxGqwGLsaIx/zhFFBY3CsHDTNquPYhoRePWAAc018eqx0qhY9L 2KMNZGVOZ43Kh2MRNoXl6m+OrcwFZLMl7JhZDrqjXS13Jvl1plWEpi3kmwF0+TD6ws4c iFT/uep1gsSPW7+NuS4sUt4vFZi7v8n/8EiRXsIEZK9PJpW8cZ3LPbliKzkON6UT0zh0 +nmrC0Kygp0UrtSxBgA4ggh4YGwKAYjidoHVwrYPywN+9VjooA01eh7UDHDf2foi6hg1 3fYg== X-Forwarded-Encrypted: i=1; AJvYcCV9uR+BrgtxBgIpOBaU5Qqx51QL1IETNp1CQ74Eur//Ei5wq/xhLXfuEPSqHDx74s+/5yjwZgoIOiNmEME=@vger.kernel.org X-Gm-Message-State: AOJu0YyjSxo5wh1lWmAXyAMsBC56APB9lIfx1Y8v+dehEHzP5LVQf42Z 33HBRY7g/UDxSgAkOnEWzNg0Z4wlAmDHE+QSONdH9csStix4gYsudqCiQVV2WMX68Ns= X-Gm-Gg: AZuq6aK5oYdhH6W9+kvPPNRjSuLVBYZswI6vH0D9VOomukWGItf4X9Q1bxN0k1j5ecU rbT+ttiiqmfF1FJhf9NRearY5aWW/oPxbp9Ytl7jwXADdmz9kn662JgeVJK+eI+xBJEjsAsaWJl EO+K+oBCFAb7cyQndXJ/YLkTVO9Nf/vD/xfmBecqBzeTkGw0G5Z041A1vJVDvJEGMPQEqw+qrmY 72H033Jy6Ca/HcwLCjHw6m3MpQrO645Qb5socbLNH95aiZ/uAIS7W2V4l2dIXcVxkVW2KmAyL/2 KjgV9781RTt+2URnp6kuksZunBUhPFWQlkgZ7geNqmohKDiovRRjdqSMcpz8/QenJwXcCDnBF25 GPfyV9EIhEWtzn9DqWQwj4nDMPW0FZpyW8p1CSBB3L/K09zcl+H8qfpcL99YrAzGBSAL5mjDSkv M15/91Y1k03bDW785dEC6jVy5IKcjjSSX1vf8WZKVMqe8/I9Vv4JBmSTJBxLvEabM70c3jNTvwX y7V X-Received: by 2002:ac8:5ad6:0:b0:502:6312:8d6 with SMTP id d75a77b69052e-5068102b723mr12240941cf.12.1770762198654; Tue, 10 Feb 2026 14:23:18 -0800 (PST) Received: from warpstation.incus (243.69.21.34.bc.googleusercontent.com. [34.21.69.243]) by smtp.gmail.com with ESMTPSA id d75a77b69052e-50682edead7sm646801cf.7.2026.02.10.14.23.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Feb 2026 14:23:18 -0800 (PST) From: Ethan Ferguson To: hirofumi@mail.parknet.co.jp Cc: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, Ethan Ferguson Subject: [PATCH 2/2] fat: Add FS_IOC_SETFSLABEL ioctl Date: Tue, 10 Feb 2026 17:23:10 -0500 Message-ID: <20260210222310.357755-3-ethan.ferguson@zetier.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260210222310.357755-1-ethan.ferguson@zetier.com> References: <20260210222310.357755-1-ethan.ferguson@zetier.com> 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" Add support for writing to the volume label of a FAT filesystem via the FS_IOC_SETFSLABEL ioctl. Signed-off-by: Ethan Ferguson --- fs/fat/dir.c | 22 ++++++++++++++++++++++ fs/fat/fat.h | 1 + fs/fat/file.c | 19 +++++++++++++++++++ fs/fat/inode.c | 15 +++++++++++++++ 4 files changed, 57 insertions(+) diff --git a/fs/fat/dir.c b/fs/fat/dir.c index 92b091783966..13e87f4c6bf3 100644 --- a/fs/fat/dir.c +++ b/fs/fat/dir.c @@ -1423,3 +1423,25 @@ int fat_add_entries(struct inode *dir, void *slots, = int nr_slots, return err; } EXPORT_SYMBOL_GPL(fat_add_entries); + +int fat_rename_volume_label_dentry(struct super_block *sb, char *vol_label) +{ + struct inode *root_inode =3D sb->s_root->d_inode; + struct buffer_head *bh; + struct msdos_dir_entry *de; + loff_t cpos =3D 0; + + while (1) { + if (fat_get_entry(root_inode, &cpos, &bh, &de) =3D=3D -1) + return -ENOENT; + + if (de->attr =3D=3D ATTR_VOLUME) { + memcpy(de->name, vol_label, MSDOS_NAME); + mark_inode_dirty(root_inode); + return 0; + } + + brelse(bh); + } +} +EXPORT_SYMBOL_GPL(fat_rename_volume_label_dentry); diff --git a/fs/fat/fat.h b/fs/fat/fat.h index db9c854ddef8..5f1536c21adf 100644 --- a/fs/fat/fat.h +++ b/fs/fat/fat.h @@ -341,6 +341,7 @@ extern int fat_alloc_new_dir(struct inode *dir, struct = timespec64 *ts); extern int fat_add_entries(struct inode *dir, void *slots, int nr_slots, struct fat_slot_info *sinfo); extern int fat_remove_entries(struct inode *dir, struct fat_slot_info *sin= fo); +extern int fat_rename_volume_label_dentry(struct super_block *sb, char *vo= l_label); =20 /* fat/fatent.c */ struct fat_entry { diff --git a/fs/fat/file.c b/fs/fat/file.c index c55a99009a9c..2475a8f58596 100644 --- a/fs/fat/file.c +++ b/fs/fat/file.c @@ -160,6 +160,23 @@ static int fat_ioctl_get_volume_label(struct inode *in= ode, char __user *arg) return copy_to_user(arg, sbi->vol_label, MSDOS_NAME); } =20 +static int fat_ioctl_set_volume_label(struct inode *inode, char __user *ar= g) +{ + struct msdos_sb_info *sbi =3D MSDOS_SB(inode->i_sb); + char new_vol_label[MSDOS_NAME]; + + if (!capable(CAP_SYS_ADMIN)) + return -EPERM; + + if (copy_from_user(new_vol_label, arg, MSDOS_NAME)) + return -EFAULT; + + fat_rename_volume_label_dentry(inode->i_sb, new_vol_label); + + memcpy(sbi->vol_label, new_vol_label, MSDOS_NAME); + return 0; +} + long fat_generic_ioctl(struct file *filp, unsigned int cmd, unsigned long = arg) { struct inode *inode =3D file_inode(filp); @@ -174,6 +191,8 @@ long fat_generic_ioctl(struct file *filp, unsigned int = cmd, unsigned long arg) return fat_ioctl_get_volume_id(inode, user_attr); case FS_IOC_GETFSLABEL: return fat_ioctl_get_volume_label(inode, (char __user *) arg); + case FS_IOC_SETFSLABEL: + return fat_ioctl_set_volume_label(inode, (char __user *) arg); case FITRIM: return fat_ioctl_fitrim(inode, arg); default: diff --git a/fs/fat/inode.c b/fs/fat/inode.c index f6bd3f079e74..b40abb2b0010 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c @@ -736,6 +736,21 @@ static void delayed_free(struct rcu_head *p) static void fat_put_super(struct super_block *sb) { struct msdos_sb_info *sbi =3D MSDOS_SB(sb); + struct buffer_head *bh =3D NULL; + struct fat_boot_sector *bs; + + bh =3D sb_bread(sb, 0); + if (bh =3D=3D NULL) + fat_msg(sb, KERN_ERR, "unable to read boot sector"); + else if (!sb_rdonly(sb)) { + bs =3D (struct fat_boot_sector *)bh->b_data; + if (is_fat32(sbi)) + memcpy(bs->fat32.vol_label, sbi->vol_label, MSDOS_NAME); + else + memcpy(bs->fat16.vol_label, sbi->vol_label, MSDOS_NAME); + mark_buffer_dirty(bh); + } + brelse(bh); =20 fat_set_state(sb, 0, 0); =20 --=20 2.53.0