summaryrefslogtreecommitdiff
path: root/fs/fat/dir.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/fat/dir.c')
-rw-r--r--fs/fat/dir.c22
1 files changed, 19 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])))