summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordmitry pervushin <dmitry.pervushin@linaro.org>2013-05-16 10:49:03 +0200
committerBernhard Rosenkränzer <bero@lindev.ch>2013-07-18 20:49:01 +0200
commit7d1aa1f97f4fdc7a4a4c815af9cfc37114b4fe19 (patch)
tree4ba6bceef2b16c383fe7b71a5893803cdbefcf12
parent85f9e306c793026773429b59bf700ed24ed3b3ed (diff)
VFAT GET_VOLUME_ID ioctl
Add VFAT_GET_VOLUME_ID ioctl, which returns the volume id via passed pointer to u32
-rw-r--r--fs/fat/dir.c22
-rw-r--r--include/uapi/linux/msdos_fs.h1
2 files changed, 20 insertions, 3 deletions
diff --git a/fs/fat/dir.c b/fs/fat/dir.c
index cb0e9b10953..9feae8c2c61 100644
--- a/fs/fat/dir.c
+++ b/fs/fat/dir.c
@@ -783,6 +783,24 @@ static int fat_ioctl_volume_id(struct inode *dir)
return sbi->vol_id;
}
+static long fat_dir_generic_ioctl(struct file *filp, unsigned int cmd,
+ unsigned long arg)
+{
+ struct inode *inode = file_inode(filp);
+ u32 id;
+
+ switch (cmd) {
+ case VFAT_IOCTL_GET_VOLUME_ID_BROKEN:
+ return fat_ioctl_volume_id(inode);
+ case VFAT_IOCTL_GET_VOLUME_ID:
+ if (inode->i_ino != MSDOS_ROOT_INO)
+ return -EINVAL;
+ id = fat_ioctl_volume_id(inode);
+ return copy_to_user((u32 *)arg, &id, sizeof(id));
+ }
+ return fat_generic_ioctl(filp, cmd, arg);
+}
+
static long fat_dir_ioctl(struct file *filp, unsigned int cmd,
unsigned long arg)
{
@@ -799,10 +817,8 @@ static long fat_dir_ioctl(struct file *filp, unsigned int cmd,
short_only = 0;
both = 1;
break;
- case VFAT_IOCTL_GET_VOLUME_ID_BROKEN:
- return fat_ioctl_volume_id(inode);
default:
- return fat_generic_ioctl(filp, cmd, arg);
+ return fat_dir_generic_ioctl(filp, cmd, arg);
}
if (!access_ok(VERIFY_WRITE, d1, sizeof(struct __fat_dirent[2])))
diff --git a/include/uapi/linux/msdos_fs.h b/include/uapi/linux/msdos_fs.h
index fddfc61418d..b322512e2b2 100644
--- a/include/uapi/linux/msdos_fs.h
+++ b/include/uapi/linux/msdos_fs.h
@@ -105,6 +105,7 @@ struct __fat_dirent {
#define FAT_IOCTL_GET_ATTRIBUTES _IOR('r', 0x10, __u32)
#define FAT_IOCTL_SET_ATTRIBUTES _IOW('r', 0x11, __u32)
#define VFAT_IOCTL_GET_VOLUME_ID_BROKEN _IOR('r', 0x12, __u32)
+#define VFAT_IOCTL_GET_VOLUME_ID _IOR('r', 0x13, __u32)
struct fat_boot_sector {
__u8 ignored[3]; /* Boot strap short or near jump */