diff options
Diffstat (limited to 'fs/ext4/file.c')
| -rw-r--r-- | fs/ext4/file.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 588af8c77246..3f1873fef1c6 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c | |||
| @@ -21,6 +21,8 @@ | |||
| 21 | #include <linux/time.h> | 21 | #include <linux/time.h> |
| 22 | #include <linux/fs.h> | 22 | #include <linux/fs.h> |
| 23 | #include <linux/jbd2.h> | 23 | #include <linux/jbd2.h> |
| 24 | #include <linux/mount.h> | ||
| 25 | #include <linux/path.h> | ||
| 24 | #include "ext4.h" | 26 | #include "ext4.h" |
| 25 | #include "ext4_jbd2.h" | 27 | #include "ext4_jbd2.h" |
| 26 | #include "xattr.h" | 28 | #include "xattr.h" |
| @@ -145,6 +147,38 @@ static int ext4_file_mmap(struct file *file, struct vm_area_struct *vma) | |||
| 145 | return 0; | 147 | return 0; |
| 146 | } | 148 | } |
| 147 | 149 | ||
| 150 | static int ext4_file_open(struct inode * inode, struct file * filp) | ||
| 151 | { | ||
| 152 | struct super_block *sb = inode->i_sb; | ||
| 153 | struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb); | ||
| 154 | struct vfsmount *mnt = filp->f_path.mnt; | ||
| 155 | struct path path; | ||
| 156 | char buf[64], *cp; | ||
| 157 | |||
| 158 | if (unlikely(!(sbi->s_mount_flags & EXT4_MF_MNTDIR_SAMPLED) && | ||
| 159 | !(sb->s_flags & MS_RDONLY))) { | ||
| 160 | sbi->s_mount_flags |= EXT4_MF_MNTDIR_SAMPLED; | ||
| 161 | /* | ||
| 162 | * Sample where the filesystem has been mounted and | ||
| 163 | * store it in the superblock for sysadmin convenience | ||
| 164 | * when trying to sort through large numbers of block | ||
| 165 | * devices or filesystem images. | ||
| 166 | */ | ||
| 167 | memset(buf, 0, sizeof(buf)); | ||
| 168 | path.mnt = mnt->mnt_parent; | ||
| 169 | path.dentry = mnt->mnt_mountpoint; | ||
| 170 | path_get(&path); | ||
| 171 | cp = d_path(&path, buf, sizeof(buf)); | ||
| 172 | path_put(&path); | ||
| 173 | if (!IS_ERR(cp)) { | ||
| 174 | memcpy(sbi->s_es->s_last_mounted, cp, | ||
| 175 | sizeof(sbi->s_es->s_last_mounted)); | ||
| 176 | sb->s_dirt = 1; | ||
| 177 | } | ||
| 178 | } | ||
| 179 | return generic_file_open(inode, filp); | ||
| 180 | } | ||
| 181 | |||
| 148 | const struct file_operations ext4_file_operations = { | 182 | const struct file_operations ext4_file_operations = { |
| 149 | .llseek = generic_file_llseek, | 183 | .llseek = generic_file_llseek, |
| 150 | .read = do_sync_read, | 184 | .read = do_sync_read, |
| @@ -156,7 +190,7 @@ const struct file_operations ext4_file_operations = { | |||
| 156 | .compat_ioctl = ext4_compat_ioctl, | 190 | .compat_ioctl = ext4_compat_ioctl, |
| 157 | #endif | 191 | #endif |
| 158 | .mmap = ext4_file_mmap, | 192 | .mmap = ext4_file_mmap, |
| 159 | .open = generic_file_open, | 193 | .open = ext4_file_open, |
| 160 | .release = ext4_release_file, | 194 | .release = ext4_release_file, |
| 161 | .fsync = ext4_sync_file, | 195 | .fsync = ext4_sync_file, |
| 162 | .splice_read = generic_file_splice_read, | 196 | .splice_read = generic_file_splice_read, |
