linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: David Howells <dhowells@redhat.com>
To: viro@ZenIV.linux.org.uk
Cc: dhowells@redhat.com, linux-fsdevel@vger.kernel.org,
	linux-nfs@vger.kernel.org, linux-cifs@vger.kernel.org,
	linux-kernel@vger.kernel.org, samba-technical@lists.samba.org,
	linux-ext4@vger.kernel.org
Subject: [PATCH 08/18] xstat: CIFS: Return extended attributes [ver #6]
Date: Thu, 15 Jul 2010 03:17:19 +0100	[thread overview]
Message-ID: <20100715021719.5544.80265.stgit@warthog.procyon.org.uk> (raw)
In-Reply-To: <20100715021709.5544.64506.stgit@warthog.procyon.org.uk>

Return extended attributes from the CIFS filesystem.  This includes the
following:

 (1) Return the file creation time as btime.  We assume that the creation time
     won't change over the life of the inode.

 (2) FS_AUTOMOUNT_FL on referral/submount directories.

 (3) Deasserting XSTAT_REQUEST_INO in st_result_mask if we made up the inode
     number and didn't get it from the server.

 (4) Map various Windows file attributes to FS_xxx_FL flags in st_inode_flags,
     fetching them from the server if we don't have them yet or don't have a
     current copy.

Furthermore, what cifs_getattr() does can be controlled as follows:

 (1) If AT_FORCE_ATTR_SYNC is indicated, or if the inode flags or creation time
     are requested but not yet collected, then the attributes will be reread
     unconditionally.

 (2) If the basic stats are requested or if the inode flags are requested and
     have been collected previously, then the attributes will be reread if out
     of date.

 (3) Otherwise the cached attributes will be used - even if expired - without
     reference to the server.

Note that cifs_revalidate_dentry() will issue an extra operation to get the
FILE_ALL_INFO in addition to the FILE_UNIX_BASIC_INFO if it needs to collect
creation time and attributes on behalf of cifs_getattr().

[NOTE: THIS PATCH IS UNTESTED!]

Signed-off-by: David Howells <dhowells@redhat.com>
---

 fs/cifs/cifsfs.h   |    2 +
 fs/cifs/cifsglob.h |    5 +++
 fs/cifs/dir.c      |    2 +
 fs/cifs/inode.c    |   76 ++++++++++++++++++++++++++++++++++++++++++++--------
 4 files changed, 71 insertions(+), 14 deletions(-)

diff --git a/fs/cifs/cifsfs.h b/fs/cifs/cifsfs.h
index a7eb65c..50bf70b 100644
--- a/fs/cifs/cifsfs.h
+++ b/fs/cifs/cifsfs.h
@@ -62,7 +62,7 @@ extern int cifs_rmdir(struct inode *, struct dentry *);
 extern int cifs_rename(struct inode *, struct dentry *, struct inode *,
 		       struct dentry *);
 extern int cifs_revalidate_file(struct file *filp);
-extern int cifs_revalidate_dentry(struct dentry *);
+extern int cifs_revalidate_dentry(struct dentry *, bool, bool);
 extern int cifs_getattr(struct vfsmount *, struct dentry *, struct kstat *);
 extern int cifs_setattr(struct dentry *, struct iattr *);
 
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
index a88479c..f12e78d 100644
--- a/fs/cifs/cifsglob.h
+++ b/fs/cifs/cifsglob.h
@@ -396,6 +396,9 @@ struct cifsInodeInfo {
 	bool clientCanCacheAll:1;	/* read and writebehind oplock */
 	bool delete_pending:1;		/* DELETE_ON_CLOSE is set */
 	bool invalid_mapping:1;		/* pagecache is invalid */
+	bool cifsAttrs_valid:1;		/* stored cifs attributes are valid */
+	bool btime_valid:1;		/* stored creation time is valid */
+	struct timespec btime;		/* creation time */
 	u64  server_eof;		/* current file size on server */
 	u64  uniqueid;			/* server inode number */
 	struct inode vfs_inode;
@@ -508,6 +511,7 @@ struct dfs_info3_param {
 #define CIFS_FATTR_DELETE_PENDING	0x2
 #define CIFS_FATTR_NEED_REVAL		0x4
 #define CIFS_FATTR_INO_COLLISION	0x8
+#define CIFS_FATTR_WINATTRS_VALID	0x10	/* T if cf_btime and cf_cifsattrs valid */
 
 struct cifs_fattr {
 	u32		cf_flags;
@@ -524,6 +528,7 @@ struct cifs_fattr {
 	struct timespec	cf_atime;
 	struct timespec	cf_mtime;
 	struct timespec	cf_ctime;
+	struct timespec	cf_btime;
 };
 
 static inline void free_dfs_info_param(struct dfs_info3_param *param)
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c
index e7ae78b..65da30e 100644
--- a/fs/cifs/dir.c
+++ b/fs/cifs/dir.c
@@ -778,7 +778,7 @@ cifs_d_revalidate(struct dentry *direntry, struct nameidata *nd)
 	int isValid = 1;
 
 	if (direntry->d_inode) {
-		if (cifs_revalidate_dentry(direntry))
+		if (cifs_revalidate_dentry(direntry, false, false))
 			return 0;
 	} else {
 		cFYI(1, "neg dentry 0x%p name = %s",
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
index 6f0683c..ff4a62f 100644
--- a/fs/cifs/inode.c
+++ b/fs/cifs/inode.c
@@ -136,7 +136,11 @@ cifs_fattr_to_inode(struct inode *inode, struct cifs_fattr *fattr)
 	    !(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DYNPERM))
 		inode->i_mode = fattr->cf_mode;
 
-	cifs_i->cifsAttrs = fattr->cf_cifsattrs;
+	if (fattr->cf_flags & CIFS_FATTR_WINATTRS_VALID) {
+		cifs_i->cifsAttrs = fattr->cf_cifsattrs;
+		cifs_i->btime = fattr->cf_btime;
+		cifs_i->btime_valid = true;
+	}
 
 	if (fattr->cf_flags & CIFS_FATTR_NEED_REVAL)
 		cifs_i->time = 0;
@@ -468,6 +472,7 @@ cifs_all_info_to_fattr(struct cifs_fattr *fattr, FILE_ALL_INFO *info,
 		       struct cifs_sb_info *cifs_sb, bool adjust_tz)
 {
 	memset(fattr, 0, sizeof(*fattr));
+	fattr->cf_flags = CIFS_FATTR_WINATTRS_VALID;
 	fattr->cf_cifsattrs = le32_to_cpu(info->Attributes);
 	if (info->DeletePending)
 		fattr->cf_flags |= CIFS_FATTR_DELETE_PENDING;
@@ -479,6 +484,7 @@ cifs_all_info_to_fattr(struct cifs_fattr *fattr, FILE_ALL_INFO *info,
 
 	fattr->cf_ctime = cifs_NTtimeToUnix(info->ChangeTime);
 	fattr->cf_mtime = cifs_NTtimeToUnix(info->LastWriteTime);
+	fattr->cf_btime = cifs_NTtimeToUnix(info->CreationTime);
 
 	if (adjust_tz) {
 		fattr->cf_ctime.tv_sec += cifs_sb->tcon->ses->server->timeAdj;
@@ -1591,7 +1597,8 @@ check_inval:
 }
 
 /* revalidate a dentry's inode attributes */
-int cifs_revalidate_dentry(struct dentry *dentry)
+int cifs_revalidate_dentry(struct dentry *dentry, bool want_extra_bits,
+			   bool force)
 {
 	int xid;
 	int rc = 0;
@@ -1604,7 +1611,7 @@ int cifs_revalidate_dentry(struct dentry *dentry)
 
 	xid = GetXid();
 
-	if (!cifs_inode_needs_reval(inode))
+	if (!force && !cifs_inode_needs_reval(inode))
 		goto check_inval;
 
 	/* can not safely grab the rename sem here if rename calls revalidate
@@ -1619,9 +1626,12 @@ int cifs_revalidate_dentry(struct dentry *dentry)
 		 "jiffies %ld", full_path, inode, inode->i_count.counter,
 		 dentry, dentry->d_time, jiffies);
 
-	if (CIFS_SB(sb)->tcon->unix_ext)
+	if (CIFS_SB(sb)->tcon->unix_ext) {
 		rc = cifs_get_inode_info_unix(&inode, full_path, sb, xid);
-	else
+		if (rc != 0)
+			goto check_inval;
+	}
+	if (!CIFS_SB(sb)->tcon->unix_ext || want_extra_bits)
 		rc = cifs_get_inode_info(&inode, full_path, NULL, sb,
 					 xid, NULL);
 
@@ -1637,13 +1647,55 @@ check_inval:
 int cifs_getattr(struct vfsmount *mnt, struct dentry *dentry,
 	struct kstat *stat)
 {
-	int err = cifs_revalidate_dentry(dentry);
-	if (!err) {
-		generic_fillattr(dentry->d_inode, stat);
-		stat->blksize = CIFS_MAX_MSGSIZE;
-		stat->ino = CIFS_I(dentry->d_inode)->uniqueid;
-	}
-	return err;
+	struct cifsInodeInfo *cifs_i = CIFS_I(dentry->d_inode);
+	struct cifs_sb_info *cifs_sb = CIFS_SB(dentry->d_sb);
+	unsigned force = stat->query_flags & AT_FORCE_ATTR_SYNC;
+	bool want_extra_bits = false;
+	u64 iflag;
+	u32 attrs;
+	int err;
+
+	if (stat->request_mask & XSTAT_REQUEST_BTIME && !cifs_i->btime_valid) {
+		want_extra_bits = true;
+		force = true;
+	}
+
+	if (stat->request_mask & XSTAT_REQUEST_INODE_FLAGS) {
+		want_extra_bits = true;
+		if (!cifs_i->cifsAttrs_valid)
+			force = true;
+	}
+
+	if (force || stat->request_mask & XSTAT_REQUEST__BASIC_STATS) {
+		err = cifs_revalidate_dentry(dentry, want_extra_bits, force);
+		if (err)
+			return err;
+	}
+
+	generic_fillattr(&cifs_i->vfs_inode, stat);
+	stat->blksize = CIFS_MAX_MSGSIZE;
+
+	/* we don't promise an inode number if we made one up */
+	stat->ino = cifs_i->uniqueid;
+	if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM))
+		stat->result_mask &= ~XSTAT_REQUEST_INO;
+	if (cifs_i->btime_valid) {
+		stat->btime = cifs_i->btime;
+		stat->result_mask |= XSTAT_REQUEST_BTIME;
+	}
+	attrs = cifs_i->cifsAttrs;
+	iflag = 0;
+	if (attrs & ATTR_READONLY)	iflag |= FS_IMMUTABLE_FL;
+	if (attrs & ATTR_HIDDEN)	iflag |= FS_HIDDEN_FL;
+	if (attrs & ATTR_SYSTEM)	iflag |= FS_SYSTEM_FL;
+	if (attrs & ATTR_ARCHIVE)	iflag |= FS_ARCHIVE_FL;
+	if (attrs & ATTR_TEMPORARY)	iflag |= FS_TEMPORARY_FL;
+	if (attrs & ATTR_REPARSE)	iflag |= FS_REPARSE_POINT_FL;
+	if (attrs & ATTR_COMPRESSED)	iflag |= FS_COMPR_FL;
+	if (attrs & ATTR_OFFLINE)	iflag |= FS_OFFLINE_FL;
+	if (attrs & ATTR_ENCRYPTED)	iflag |= FS_ENCRYPTED_FL;
+	stat->inode_flags |= iflag;
+	return 0;
 }
 
 static int cifs_truncate_page(struct address_space *mapping, loff_t from)

  parent reply	other threads:[~2010-07-15  2:17 UTC|newest]

Thread overview: 101+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-07-15  2:17 [PATCH 00/18] Extended file stat functions [ver #6] David Howells
2010-07-15  2:17 ` [PATCH 01/18] Mark arguments to certain syscalls as being const " David Howells
2010-07-15  2:17 ` [PATCH 02/18] xstat: Add a pair of system calls to make extended file stats available " David Howells
2010-07-15 20:35   ` Arnd Bergmann
     [not found]   ` <201007152235.22373.arnd-r2nGTMty4D4@public.gmane.org>
2010-07-15 21:53     ` David Howells
2010-07-16 10:24       ` David Howells
     [not found]         ` <8527.1279275842-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-07-16 11:02           ` Arnd Bergmann
     [not found]         ` <201007161302.35775.arnd-r2nGTMty4D4@public.gmane.org>
2010-07-16 12:38           ` David Howells
     [not found]             ` <10677.1279283886-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-07-16 13:32               ` Arnd Bergmann
2010-07-17  5:51               ` Mark Harris
2010-07-17  9:00                 ` Arnd Bergmann
     [not found]             ` <20100717055130.GA2053-EJgEOVOPJGBzbRFIqnYvSA@public.gmane.org>
2010-07-17  9:49               ` David Howells
     [not found]       ` <30646.1279230807-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-07-16 10:46         ` Arnd Bergmann
     [not found]       ` <201007161246.15923.arnd-r2nGTMty4D4@public.gmane.org>
2010-07-16 15:10         ` David Howells
     [not found]       ` <20100715021712.5544.44845.stgit-S6HVgzuS8uM4Awkfq6JHfwNdhmdF6hFW@public.gmane.org>
2010-07-16  6:22         ` Mark Harris
2010-07-18  8:48         ` Christoph Hellwig
2010-07-22 10:52           ` Jan Engelhardt
     [not found]           ` <alpine.LSU.2.01.1007221248050.9353-SHaQjdQMGhDmsUXKMKRlFA@public.gmane.org>
2010-07-22 12:25             ` David Howells
2010-07-22 10:35         ` Jan Engelhardt
2010-07-19 14:05   ` David Howells
2010-07-19 15:17   ` Linus Torvalds
     [not found]   ` <AANLkTikuzYqYpGHcubb7QVciZW0dNFjOG82qIwy5M4gO-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-07-19 16:15     ` David Howells
     [not found]       ` <10783.1279556132-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-07-19 16:51         ` Linus Torvalds
     [not found]       ` <AANLkTinVns77R7yCCh-lydd0eQufdAF9O2OaWmCL7uSn-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-07-19 17:26         ` David Howells
     [not found]           ` <11817.1279560400-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-07-19 17:46             ` Linus Torvalds
     [not found]               ` <AANLkTikxHJgguNn6EOK6fX53xYSRPmcNjIeGSTigQ9qu-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-07-20  8:28                 ` Andreas Dilger
2010-07-22 12:14   ` David Howells
2010-07-22 12:17     ` Volker Lendecke
     [not found]       ` <E1Obuiy-00C9jr-Al-dqLtpHMqGvUyWpdLl23E4A@public.gmane.org>
2010-07-22 13:05         ` Jan Engelhardt
2010-07-22 15:14         ` Linus Torvalds
     [not found]           ` <AANLkTikBCXK6uEwWq4f0LvpdoKCPs3jvyFa4Zw4e2J_7-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-07-22 15:36             ` Volker Lendecke
2010-07-22 15:47               ` Linus Torvalds
     [not found]                 ` <AANLkTimwIq0pBhCeOjOVjB0yeM3JHOvzVoj9M4ui6al9-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-07-22 16:06                   ` Greg Freemyer
     [not found]                     ` <AANLkTimsjARdMfnvFRSyy6gakCtVhGRBbyauVTc_Cuwt-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-07-22 16:07                       ` Greg Freemyer
2010-07-22 16:27                   ` Jeremy Allison
2010-07-22 16:40                     ` Linus Torvalds
     [not found]                       ` <AANLkTimdFCGSKLn7aGMpBMIauHTsHY7hpAAmpo6uTcnD-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-07-22 16:58                         ` Trond Myklebust
     [not found]                           ` <1279817930.3621.14.camel-rJ7iovZKK19ZJLDQqaL3InhyD016LWXt@public.gmane.org>
2010-07-22 18:02                             ` Jeremy Allison
2010-07-22 18:04                               ` Volker Lendecke
     [not found]                                 ` <E1Oc08W-00CZuz-Ns-dqLtpHMqGvUyWpdLl23E4A@public.gmane.org>
2010-07-22 18:07                                   ` Jeremy Allison
2010-07-22 18:59                                 ` Trond Myklebust
2010-07-30 17:55                                   ` Phil Pishioneri
2010-07-30 18:11                                     ` Trond Myklebust
2010-07-30 18:19                                       ` Phil Pishioneri
     [not found]                                       ` <1280513506.12852.22.camel-rJ7iovZKK19ZJLDQqaL3InhyD016LWXt@public.gmane.org>
2010-07-31 18:41                                         ` Andreas Dilger
     [not found]                                           ` <09B770A6-48DB-4296-B6C2-BF46D4DC7E57-m1MBpc4rdrD3fQ9qLvQP4Q@public.gmane.org>
2010-07-31 18:48                                             ` Jan Engelhardt
2010-07-31 19:03                                             ` Trond Myklebust
2010-07-31 21:20                                               ` Jan Engelhardt
2010-08-01 13:17                                         ` Jeff Layton
2010-07-22 18:05                               ` Jan Engelhardt
     [not found]                                 ` <alpine.LSU.2.01.1007222004430.4215-SHaQjdQMGhDmsUXKMKRlFA@public.gmane.org>
2010-07-22 18:07                                   ` Jeremy Allison
2010-07-22 19:18                               ` John Stoffel
2010-07-22 17:03                         ` Jan Engelhardt
2010-07-22 17:16                           ` Trond Myklebust
     [not found]                             ` <1279818967.3621.23.camel-rJ7iovZKK19ZJLDQqaL3InhyD016LWXt@public.gmane.org>
2010-07-22 17:36                               ` Jan Engelhardt
     [not found]                           ` <alpine.LSU.2.01.1007221859180.27496-SHaQjdQMGhDmsUXKMKRlFA@public.gmane.org>
2010-07-22 17:24                             ` Linus Torvalds
2010-07-22 18:21                               ` Benny Halevy
2010-07-22 18:45                                 ` Greg Freemyer
2010-07-22 19:53                                   ` Benny Halevy
     [not found]                               ` <AANLkTilmVdyVdO4EmVtTYi_cvMmPqNEPEnzUkJdk1XyR-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-07-22 18:15                                 ` Jeremy Allison
2010-07-22 18:41                                 ` Greg Freemyer
2010-07-28  1:15                               ` Neil Brown
2010-07-28 17:28                               ` David Howells
2010-07-28 23:04                                 ` Neil Brown
2010-07-30 18:38                                   ` J. Bruce Fields
2010-08-01 13:40                                   ` Jeff Layton
2010-08-02 14:09                                     ` Greg Freemyer
     [not found]                                       ` <AANLkTi=JvwrwpmteFcXW1f5s95+_w_iCT+04Sy7bbTtR-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-08-02 14:42                                         ` Jeff Layton
2010-07-29 16:15                                 ` David Howells
     [not found]                                   ` <319.1280420115-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-08-03  1:13                                     ` Neil Brown
2010-07-22 17:12                         ` Jim Rees
2010-07-22 17:32                           ` Linus Torvalds
2010-07-23  1:03                       ` tridge
     [not found]                         ` <19528.60019.28495.655512-eUNUBHrolfbYtjvyW6yDsg@public.gmane.org>
2010-07-23  1:21                           ` Ted Ts'o
     [not found]                             ` <20100723012130.GD16373-AKGzg7BKzIDYtjvyW6yDsg@public.gmane.org>
2010-07-23  2:12                               ` tridge-eUNUBHrolfbYtjvyW6yDsg
2010-07-23  9:14                             ` Björn Jacke
2010-07-22 16:25                 ` Jan Engelhardt
2010-07-22 15:46           ` Jan Engelhardt
     [not found]           ` <alpine.LSU.2.01.1007221740570.12308-SHaQjdQMGhDmsUXKMKRlFA@public.gmane.org>
2010-07-22 16:06             ` David Howells
2010-07-15  2:17 ` [PATCH 03/18] AFS: Use i_generation not i_version for the vnode uniquifier " David Howells
2010-07-15  2:17 ` [PATCH 04/18] xstat: AFS: Return extended attributes " David Howells
2010-07-15  2:17 ` [PATCH 05/18] xstat: eCryptFS: " David Howells
2010-07-15  2:17 ` [PATCH 06/18] xstat: Ext4: " David Howells
2010-07-15  2:17 ` [PATCH 07/18] xstat: NFS: " David Howells
2010-07-15  2:17 ` David Howells [this message]
2010-07-15  2:17 ` [PATCH 09/18] xstat: Make special system filesystems return FS_SPECIAL_FL " David Howells
2010-07-18  8:49   ` Christoph Hellwig
2010-07-19 14:09   ` David Howells
     [not found]   ` <8426.1279548573-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2010-07-27 13:41     ` David Howells
2010-07-15  2:17 ` [PATCH 10/18] xstat: Make network filesystems return FS_REMOTE_FL " David Howells
2010-07-15  2:17 ` [PATCH 11/18] xstat: Make automounter filesystems return FS_AUTOMOUNT_FL " David Howells
2010-07-15  2:17 ` [PATCH 12/18] xstat: Add a dentry op to handle automounting rather than abusing follow_link() " David Howells
     [not found]   ` <20100715021723.5544.85730.stgit-S6HVgzuS8uM4Awkfq6JHfwNdhmdF6hFW@public.gmane.org>
2010-07-18  8:50     ` Christoph Hellwig
     [not found]   ` <20100718085048.GC27794-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2010-07-19 14:10     ` David Howells
2010-07-15  2:17 ` [PATCH 13/18] xstat: AFS: Use d_automount() " David Howells
2010-07-15  2:17 ` [PATCH 14/18] xstat: NFS: " David Howells
2010-07-15  2:17 ` [PATCH 15/18] xstat: CIFS: " David Howells
2010-07-15  2:17 ` [PATCH 16/18] xstat: Remove the automount through follow_link() kludge code from pathwalk " David Howells
2010-07-15  2:17 ` [PATCH 17/18] xstat: Add an AT_NO_AUTOMOUNT flag to suppress terminal automount " David Howells
     [not found] ` <20100715021709.5544.64506.stgit-S6HVgzuS8uM4Awkfq6JHfwNdhmdF6hFW@public.gmane.org>
2010-07-15  2:17   ` [PATCH 18/18] xstat: Provide a mechanism to gather extra results for [f]xstat() " David Howells
     [not found]     ` <20100715021730.5544.68442.stgit-S6HVgzuS8uM4Awkfq6JHfwNdhmdF6hFW@public.gmane.org>
2010-07-18  8:51       ` Christoph Hellwig

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100715021719.5544.80265.stgit@warthog.procyon.org.uk \
    --to=dhowells@redhat.com \
    --cc=linux-cifs@vger.kernel.org \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=samba-technical@lists.samba.org \
    --cc=viro@ZenIV.linux.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).