nilfs2: add support for FS_IOC_GETFSLABEL

Implement support for FS_IOC_GETFSLABEL ioctl to read filesystem label.

Link: https://lkml.kernel.org/r/20240815074408.5550-4-konishi.ryusuke@gmail.com
Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
Ryusuke Konishi 2024-08-15 16:44:07 +09:00 committed by Andrew Morton
parent 8d1dba2e7c
commit 4b901256a7
2 changed files with 39 additions and 0 deletions

View File

@ -17,6 +17,7 @@
#include <linux/mount.h> /* mnt_want_write_file(), mnt_drop_write_file() */
#include <linux/buffer_head.h>
#include <linux/fileattr.h>
#include <linux/string.h>
#include "nilfs.h"
#include "segment.h"
#include "bmap.h"
@ -1266,6 +1267,29 @@ static int nilfs_ioctl_set_suinfo(struct inode *inode, struct file *filp,
return ret;
}
/**
* nilfs_ioctl_get_fslabel - get the volume name of the file system
* @sb: super block instance
* @argp: pointer to userspace memory where the volume name should be stored
*
* Return: 0 on success, %-EFAULT if copying to userspace memory fails.
*/
static int nilfs_ioctl_get_fslabel(struct super_block *sb, void __user *argp)
{
struct the_nilfs *nilfs = sb->s_fs_info;
char label[NILFS_MAX_VOLUME_NAME + 1];
BUILD_BUG_ON(NILFS_MAX_VOLUME_NAME >= FSLABEL_MAX);
down_read(&nilfs->ns_sem);
memtostr_pad(label, nilfs->ns_sbp[0]->s_volume_name);
up_read(&nilfs->ns_sem);
if (copy_to_user(argp, label, sizeof(label)))
return -EFAULT;
return 0;
}
long nilfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
struct inode *inode = file_inode(filp);
@ -1308,6 +1332,8 @@ long nilfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
return nilfs_ioctl_set_alloc_range(inode, argp);
case FITRIM:
return nilfs_ioctl_trim_fs(inode, argp);
case FS_IOC_GETFSLABEL:
return nilfs_ioctl_get_fslabel(inode->i_sb, argp);
default:
return -ENOTTY;
}
@ -1334,6 +1360,7 @@ long nilfs_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
case NILFS_IOCTL_RESIZE:
case NILFS_IOCTL_SET_ALLOC_RANGE:
case FITRIM:
case FS_IOC_GETFSLABEL:
break;
default:
return -ENOIOCTLCMD;

View File

@ -103,6 +103,18 @@ enum {
NILFS_SB_COMMIT_ALL /* Commit both super blocks */
};
/**
* define NILFS_MAX_VOLUME_NAME - maximum number of characters (bytes) in a
* file system volume name
*
* Defined by the size of the volume name field in the on-disk superblocks.
* This volume name does not include the terminating NULL byte if the string
* length matches the field size, so use (NILFS_MAX_VOLUME_NAME + 1) for the
* size of the buffer that requires a NULL byte termination.
*/
#define NILFS_MAX_VOLUME_NAME \
sizeof_field(struct nilfs_super_block, s_volume_name)
/*
* Macros to check inode numbers
*/