47ae32d6a5
Add "relatime" (relative atime) support. Relative atime only updates the atime if the previous atime is older than the mtime or ctime. Like noatime, but useful for applications like mutt that need to know when a file has been read since it was last modified. A corresponding patch against mount(8) is available at http://userweb.kernel.org/~akpm/mount-relative-atime.txt Signed-off-by: Valerie Henson <val_henson@linux.intel.com> Cc: Mark Fasheh <mark.fasheh@oracle.com> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Christoph Hellwig <hch@lst.de> Cc: Karel Zak <kzak@redhat.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
102 lines
2.9 KiB
C
102 lines
2.9 KiB
C
/*
|
|
*
|
|
* Definitions for mount interface. This describes the in the kernel build
|
|
* linkedlist with mounted filesystems.
|
|
*
|
|
* Author: Marco van Wieringen <mvw@planets.elm.net>
|
|
*
|
|
* Version: $Id: mount.h,v 2.0 1996/11/17 16:48:14 mvw Exp mvw $
|
|
*
|
|
*/
|
|
#ifndef _LINUX_MOUNT_H
|
|
#define _LINUX_MOUNT_H
|
|
#ifdef __KERNEL__
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/list.h>
|
|
#include <linux/spinlock.h>
|
|
#include <asm/atomic.h>
|
|
|
|
struct super_block;
|
|
struct vfsmount;
|
|
struct dentry;
|
|
struct mnt_namespace;
|
|
|
|
#define MNT_NOSUID 0x01
|
|
#define MNT_NODEV 0x02
|
|
#define MNT_NOEXEC 0x04
|
|
#define MNT_NOATIME 0x08
|
|
#define MNT_NODIRATIME 0x10
|
|
#define MNT_RELATIME 0x20
|
|
|
|
#define MNT_SHRINKABLE 0x100
|
|
|
|
#define MNT_SHARED 0x1000 /* if the vfsmount is a shared mount */
|
|
#define MNT_UNBINDABLE 0x2000 /* if the vfsmount is a unbindable mount */
|
|
#define MNT_PNODE_MASK 0x3000 /* propogation flag mask */
|
|
|
|
struct vfsmount {
|
|
struct list_head mnt_hash;
|
|
struct vfsmount *mnt_parent; /* fs we are mounted on */
|
|
struct dentry *mnt_mountpoint; /* dentry of mountpoint */
|
|
struct dentry *mnt_root; /* root of the mounted tree */
|
|
struct super_block *mnt_sb; /* pointer to superblock */
|
|
struct list_head mnt_mounts; /* list of children, anchored here */
|
|
struct list_head mnt_child; /* and going through their mnt_child */
|
|
atomic_t mnt_count;
|
|
int mnt_flags;
|
|
int mnt_expiry_mark; /* true if marked for expiry */
|
|
char *mnt_devname; /* Name of device e.g. /dev/dsk/hda1 */
|
|
struct list_head mnt_list;
|
|
struct list_head mnt_expire; /* link in fs-specific expiry list */
|
|
struct list_head mnt_share; /* circular list of shared mounts */
|
|
struct list_head mnt_slave_list;/* list of slave mounts */
|
|
struct list_head mnt_slave; /* slave list entry */
|
|
struct vfsmount *mnt_master; /* slave is on master->mnt_slave_list */
|
|
struct mnt_namespace *mnt_ns; /* containing namespace */
|
|
int mnt_pinned;
|
|
};
|
|
|
|
static inline struct vfsmount *mntget(struct vfsmount *mnt)
|
|
{
|
|
if (mnt)
|
|
atomic_inc(&mnt->mnt_count);
|
|
return mnt;
|
|
}
|
|
|
|
extern void mntput_no_expire(struct vfsmount *mnt);
|
|
extern void mnt_pin(struct vfsmount *mnt);
|
|
extern void mnt_unpin(struct vfsmount *mnt);
|
|
|
|
static inline void mntput(struct vfsmount *mnt)
|
|
{
|
|
if (mnt) {
|
|
mnt->mnt_expiry_mark = 0;
|
|
mntput_no_expire(mnt);
|
|
}
|
|
}
|
|
|
|
extern void free_vfsmnt(struct vfsmount *mnt);
|
|
extern struct vfsmount *alloc_vfsmnt(const char *name);
|
|
extern struct vfsmount *do_kern_mount(const char *fstype, int flags,
|
|
const char *name, void *data);
|
|
|
|
struct file_system_type;
|
|
extern struct vfsmount *vfs_kern_mount(struct file_system_type *type,
|
|
int flags, const char *name,
|
|
void *data);
|
|
|
|
struct nameidata;
|
|
|
|
extern int do_add_mount(struct vfsmount *newmnt, struct nameidata *nd,
|
|
int mnt_flags, struct list_head *fslist);
|
|
|
|
extern void mark_mounts_for_expiry(struct list_head *mounts);
|
|
extern void shrink_submounts(struct vfsmount *mountpoint, struct list_head *mounts);
|
|
|
|
extern spinlock_t vfsmount_lock;
|
|
extern dev_t name_to_dev_t(char *name);
|
|
|
|
#endif
|
|
#endif /* _LINUX_MOUNT_H */
|