|
@@ -199,6 +199,49 @@ static void fill_fake_finddataunix(FILE_UNIX_BASIC_INFO *pfnd_dat,
|
|
|
pfnd_dat->Gid = cpu_to_le64(pinode->i_gid);
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * cifs_new inode - create new inode, initialize, and hash it
|
|
|
+ * @sb - pointer to superblock
|
|
|
+ * @inum - if valid pointer and serverino is enabled, replace i_ino with val
|
|
|
+ *
|
|
|
+ * Create a new inode, initialize it for CIFS and hash it. Returns the new
|
|
|
+ * inode or NULL if one couldn't be allocated.
|
|
|
+ *
|
|
|
+ * If the share isn't mounted with "serverino" or inum is a NULL pointer then
|
|
|
+ * we'll just use the inode number assigned by new_inode(). Note that this can
|
|
|
+ * mean i_ino collisions since the i_ino assigned by new_inode is not
|
|
|
+ * guaranteed to be unique.
|
|
|
+ */
|
|
|
+struct inode *
|
|
|
+cifs_new_inode(struct super_block *sb, unsigned long *inum)
|
|
|
+{
|
|
|
+ struct inode *inode;
|
|
|
+
|
|
|
+ inode = new_inode(sb);
|
|
|
+ if (inode == NULL)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * BB: Is i_ino == 0 legal? Here, we assume that it is. If it isn't we
|
|
|
+ * stop passing inum as ptr. Are there sanity checks we can use to
|
|
|
+ * ensure that the server is really filling in that field? Also,
|
|
|
+ * if serverino is disabled, perhaps we should be using iunique()?
|
|
|
+ */
|
|
|
+ if (inum && (CIFS_SB(sb)->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM))
|
|
|
+ inode->i_ino = *inum;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * must set this here instead of cifs_alloc_inode since VFS will
|
|
|
+ * clobber i_flags
|
|
|
+ */
|
|
|
+ if (sb->s_flags & MS_NOATIME)
|
|
|
+ inode->i_flags |= S_NOATIME | S_NOCMTIME;
|
|
|
+
|
|
|
+ insert_inode_hash(inode);
|
|
|
+
|
|
|
+ return inode;
|
|
|
+}
|
|
|
+
|
|
|
int cifs_get_inode_info_unix(struct inode **pinode,
|
|
|
const unsigned char *full_path, struct super_block *sb, int xid)
|
|
|
{
|
|
@@ -233,22 +276,12 @@ int cifs_get_inode_info_unix(struct inode **pinode,
|
|
|
|
|
|
/* get new inode */
|
|
|
if (*pinode == NULL) {
|
|
|
- *pinode = new_inode(sb);
|
|
|
+ *pinode = cifs_new_inode(sb, (unsigned long *)
|
|
|
+ &find_data.UniqueId);
|
|
|
if (*pinode == NULL) {
|
|
|
rc = -ENOMEM;
|
|
|
goto cgiiu_exit;
|
|
|
}
|
|
|
- /* Is an i_ino of zero legal? */
|
|
|
- /* note ino incremented to unique num in new_inode */
|
|
|
- /* Are there sanity checks we can use to ensure that
|
|
|
- the server is really filling in that field? */
|
|
|
- if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)
|
|
|
- (*pinode)->i_ino = (unsigned long)find_data.UniqueId;
|
|
|
-
|
|
|
- if (sb->s_flags & MS_NOATIME)
|
|
|
- (*pinode)->i_flags |= S_NOATIME | S_NOCMTIME;
|
|
|
-
|
|
|
- insert_inode_hash(*pinode);
|
|
|
}
|
|
|
|
|
|
inode = *pinode;
|
|
@@ -465,11 +498,8 @@ int cifs_get_inode_info(struct inode **pinode,
|
|
|
|
|
|
/* get new inode */
|
|
|
if (*pinode == NULL) {
|
|
|
- *pinode = new_inode(sb);
|
|
|
- if (*pinode == NULL) {
|
|
|
- rc = -ENOMEM;
|
|
|
- goto cgii_exit;
|
|
|
- }
|
|
|
+ __u64 inode_num;
|
|
|
+
|
|
|
/* Is an i_ino of zero legal? Can we use that to check
|
|
|
if the server supports returning inode numbers? Are
|
|
|
there other sanity checks we can use to ensure that
|
|
@@ -486,7 +516,6 @@ int cifs_get_inode_info(struct inode **pinode,
|
|
|
|
|
|
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
|
|
|
int rc1 = 0;
|
|
|
- __u64 inode_num;
|
|
|
|
|
|
rc1 = CIFSGetSrvInodeNumber(xid, pTcon,
|
|
|
full_path, &inode_num,
|
|
@@ -496,12 +525,17 @@ int cifs_get_inode_info(struct inode **pinode,
|
|
|
if (rc1) {
|
|
|
cFYI(1, ("GetSrvInodeNum rc %d", rc1));
|
|
|
/* BB EOPNOSUPP disable SERVER_INUM? */
|
|
|
- } else /* do we need cast or hash to ino? */
|
|
|
- (*pinode)->i_ino = inode_num;
|
|
|
- } /* else ino incremented to unique num in new_inode*/
|
|
|
- if (sb->s_flags & MS_NOATIME)
|
|
|
- (*pinode)->i_flags |= S_NOATIME | S_NOCMTIME;
|
|
|
- insert_inode_hash(*pinode);
|
|
|
+ }
|
|
|
+ *pinode = cifs_new_inode(sb, (unsigned long *)
|
|
|
+ &inode_num);
|
|
|
+ } else {
|
|
|
+ *pinode = cifs_new_inode(sb, NULL);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (*pinode == NULL) {
|
|
|
+ rc = -ENOMEM;
|
|
|
+ goto cgii_exit;
|
|
|
+ }
|
|
|
}
|
|
|
inode = *pinode;
|
|
|
cifsInfo = CIFS_I(inode);
|
|
@@ -1114,24 +1148,14 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
|
|
|
else
|
|
|
direntry->d_op = &cifs_dentry_ops;
|
|
|
|
|
|
- newinode = new_inode(inode->i_sb);
|
|
|
+ newinode = cifs_new_inode(inode->i_sb, (unsigned long *)
|
|
|
+ &pInfo->UniqueId);
|
|
|
if (newinode == NULL) {
|
|
|
kfree(pInfo);
|
|
|
goto mkdir_get_info;
|
|
|
}
|
|
|
|
|
|
- /* Is an i_ino of zero legal? */
|
|
|
- /* Are there sanity checks we can use to ensure that
|
|
|
- the server is really filling in that field? */
|
|
|
- if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) {
|
|
|
- newinode->i_ino =
|
|
|
- (unsigned long)pInfo->UniqueId;
|
|
|
- } /* note ino incremented to unique num in new_inode */
|
|
|
- if (inode->i_sb->s_flags & MS_NOATIME)
|
|
|
- newinode->i_flags |= S_NOATIME | S_NOCMTIME;
|
|
|
newinode->i_nlink = 2;
|
|
|
-
|
|
|
- insert_inode_hash(newinode);
|
|
|
d_instantiate(direntry, newinode);
|
|
|
|
|
|
/* we already checked in POSIXCreate whether
|