xfs
[Top] [All Lists]

Re: detecting case-insensitivity

To: Vyacheslav Dubeyko <slava@xxxxxxxxxxx>
Subject: Re: detecting case-insensitivity
From: "J. Bruce Fields" <bfields@xxxxxxxxxxxx>
Date: Mon, 9 Apr 2012 17:28:33 -0400
Cc: Dave Chinner <david@xxxxxxxxxxxxx>, xfs@xxxxxxxxxxx
In-reply-to: <LBVkglc6jtb7.r3bLKBnl@xxxxxxxxxxxxxxxxxxxxxxx>
References: <LBVkglc6jtb7.r3bLKBnl@xxxxxxxxxxxxxxxxxxxxxxx>
User-agent: Mutt/1.5.20 (2009-06-14)
> > From: Dave Chinner <david@xxxxxxxxxxxxx>
> > Date: 09.04.2012 03.30
> > 
> > On Sat, Apr 07, 2012 at 10:00:29AM -0400, J. Bruce Fields wrote:
> > > Is there a generic way to detect whether a given filesystem is
> > > case-insensitive?  If not, how should it be done?  (A bit in s_flags?)
> > 
> > I don't think there is a generic flag for it. We could trivially add
> > one, I think, as it is generally a fixed property for the entire
> > filesystem....

So, I assume the following is totally wrong, but the basic idea (create
a new flag, set it based on xfs_sb_version_hasasciici, check it in nfsd)
would work?

On Mon, Apr 09, 2012 at 09:01:11AM +0400, Vyacheslav Dubeyko wrote:
> But why does it need to detect that filesystem case-insensitive or not? In 
> what use-case does it need to make such detection?

To be honest, I have no idea--it's not a mandatory attribute, so I think
I'll instead just ceasing to support the attribute and seeing if anyone
complains....

--b.

diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index bcd8904..53f3044 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -2233,7 +2233,7 @@ out_acl:
        if (bmval0 & FATTR4_WORD0_CASE_INSENSITIVE) {
                if ((buflen -= 4) < 0)
                        goto out_resource;
-               WRITE32(1);
+               WRITE32(__IS_FLG(dentry->d_inode, MS_CASE_INSENSITIVE) ? 1 : 0);
        }
        if (bmval0 & FATTR4_WORD0_CASE_PRESERVING) {
                if ((buflen -= 4) < 0)
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
index 7423d71..890f439 100644
--- a/fs/nfsd/vfs.c
+++ b/fs/nfsd/vfs.c
@@ -1458,7 +1458,7 @@ do_nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp,
                switch (createmode) {
                case NFS3_CREATE_UNCHECKED:
                        if (! S_ISREG(dchild->d_inode->i_mode))
-                               err = nfserr_exist;
+                               goto out;
                        else if (truncp) {
                                /* in nfsv4, we need to treat this case a little
                                 * differently.  we don't want to truncate the
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
index ee5b695..6367817 100644
--- a/fs/xfs/xfs_super.c
+++ b/fs/xfs/xfs_super.c
@@ -1343,6 +1343,8 @@ xfs_fs_fill_super(
        sb->s_maxbytes = xfs_max_file_offset(sb->s_blocksize_bits);
        sb->s_time_gran = 1;
        set_posix_acl_flag(sb);
+       if (xfs_sb_version_hasasciici(&mp->m_sb))
+               sb->s_flags |= MS_CASE_INSENSITIVE;
 
        error = xfs_mountfs(mp);
        if (error)
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 8975a56..0ee6614 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -218,6 +218,8 @@ struct inodes_stat_t {
 #define MS_BORN                (1<<29)
 #define MS_ACTIVE      (1<<30)
 #define MS_NOUSER      (1<<31)
+#define MS_CASE_INSENSITIVE (1<<32)
+
 
 /*
  * Superblock flags that can be altered by MS_REMOUNT
@@ -1421,7 +1423,7 @@ struct super_block {
        const struct dquot_operations   *dq_op;
        const struct quotactl_ops       *s_qcop;
        const struct export_operations *s_export_op;
-       unsigned long           s_flags;
+       unsigned long long      s_flags;
        unsigned long           s_magic;
        struct dentry           *s_root;
        struct rw_semaphore     s_umount;

<Prev in Thread] Current Thread [Next in Thread>