On Fri, 2013-07-05 at 17:12 -0500, Steve French wrote:
> Yes - I noticed that too (although with David's patch at least it is
> better). For the POSIX case for readdir we are ok, but for the
> non-posix case for readdir there is are only two infolevels, one too
> big and one too small (FILE_STANDARD_INFORMATION) that seem to return
> nlinks so we should be setting them to default values if we can't get
> them from the server (ie if cf_attr->nlink is 0). This patch should
> fix it by catching it when we are about to update the inode to make
> sure we are putting a legal value in (I have not tested it yet).
> Thoughts on this minor followon patch?
>
> diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
> index 449b6cf..8329c18 100644
> --- a/fs/cifs/inode.c
> +++ b/fs/cifs/inode.c
> @@ -134,7 +134,13 @@ cifs_fattr_to_inode(struct inode *inode, struct
> cifs_fattr
> inode->i_mtime = fattr->cf_mtime;
> inode->i_ctime = fattr->cf_ctime;
> inode->i_rdev = fattr->cf_rdev;
> - set_nlink(inode, fattr->cf_nlink);
> + /* number of links on a directory is at least 2, at least 1 for file
> */
> + if ((fattr->cf_cifsattrs & ATTR_DIRECTORY) && (fattr->cf_nlink < 2))
> + set_nlink(inode, 2);
> + else if (fattr->cf_nlink < 1)
> + set_nlink(inode, 1);
> + else
> + set_nlink(inode, fattr->cf_nlink);
> inode->i_uid = fattr->cf_uid;
> inode->i_gid = fattr->cf_gid;
>
There are cases where you might see a legit i_nlink value of 0. For
instance...
client> fd = open("file", ...);
server> unlink("file");
client> fstat(file, ...);
...now the server may legitimately report a link count of 0, but with
this patch we'll end up fudging it to something higher. Hence, I'm a
little leery of doing this sort of blanket overriding of cf_nlink value,
especially in the case where POSIX extensions are in force.
I think we should only do this when we really think we can't trust this
value -- i.e. the non-POSIX case. Experience has shown that
NumberOfLinks value is not *exactly* a 1:1 match with an i_nlink value
when talking to windows-y servers.
I dunno...maybe it's time to ask dochelp for clarification on what sort
of semantics we should be expecting from this field?
--
Jeff Layton <[email protected]>
--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html