aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2009-06-13 10:09:48 -0400
committerTheodore Ts'o <tytso@mit.edu>2009-06-13 10:09:48 -0400
commitbc0b0d6d69ee9022f18ae264e62beb30ddeb322a (patch)
treefb1d04af657b6de21fa441c1d14fc296f32c723e /fs/ext4
parent7f4520cc6242780ce720aa440ad4b391f998b558 (diff)
ext4: update the s_last_mounted field in the superblock
This field can be very helpful when a system administrator is trying to sort through large numbers of block devices or filesystem images. What is stored in this field can be ambiguous if multiple filesystem namespaces are in play; what we store in practice is the mountpoint interpreted by the process's namespace which first opens a file in the filesystem. Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4')
-rw-r--r--fs/ext4/ext4.h7
-rw-r--r--fs/ext4/file.c36
2 files changed, 42 insertions, 1 deletions
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 569f527080bf..9e268c97eeca 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -834,6 +834,12 @@ struct ext4_super_block {
834}; 834};
835 835
836#ifdef __KERNEL__ 836#ifdef __KERNEL__
837
838/*
839 * Mount flags
840 */
841#define EXT4_MF_MNTDIR_SAMPLED 0x0001
842
837/* 843/*
838 * fourth extended-fs super-block data in memory 844 * fourth extended-fs super-block data in memory
839 */ 845 */
@@ -853,6 +859,7 @@ struct ext4_sb_info {
853 struct ext4_super_block *s_es; /* Pointer to the super block in the buffer */ 859 struct ext4_super_block *s_es; /* Pointer to the super block in the buffer */
854 struct buffer_head **s_group_desc; 860 struct buffer_head **s_group_desc;
855 unsigned int s_mount_opt; 861 unsigned int s_mount_opt;
862 unsigned int s_mount_flags;
856 ext4_fsblk_t s_sb_block; 863 ext4_fsblk_t s_sb_block;
857 uid_t s_resuid; 864 uid_t s_resuid;
858 gid_t s_resgid; 865 gid_t s_resgid;
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
150static 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
148const struct file_operations ext4_file_operations = { 182const 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,