Commit 0f060936 authored by Amir Goldstein's avatar Amir Goldstein Committed by Steve French

SMB3: Backup intent flag missing from some more ops

When "backup intent" is requested on the mount (e.g. backupuid or
backupgid mount options), the corresponding flag was missing from
some of the operations.

Change all operations to use the macro cifs_create_options() to
set the backup intent flag if needed.
Signed-off-by: default avatarAmir Goldstein <amir73il@gmail.com>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 94f2630b
...@@ -1084,7 +1084,7 @@ static struct cifs_ntsd *get_cifs_acl_by_path(struct cifs_sb_info *cifs_sb, ...@@ -1084,7 +1084,7 @@ static struct cifs_ntsd *get_cifs_acl_by_path(struct cifs_sb_info *cifs_sb,
struct cifs_ntsd *pntsd = NULL; struct cifs_ntsd *pntsd = NULL;
int oplock = 0; int oplock = 0;
unsigned int xid; unsigned int xid;
int rc, create_options = 0; int rc;
struct cifs_tcon *tcon; struct cifs_tcon *tcon;
struct tcon_link *tlink = cifs_sb_tlink(cifs_sb); struct tcon_link *tlink = cifs_sb_tlink(cifs_sb);
struct cifs_fid fid; struct cifs_fid fid;
...@@ -1096,13 +1096,10 @@ static struct cifs_ntsd *get_cifs_acl_by_path(struct cifs_sb_info *cifs_sb, ...@@ -1096,13 +1096,10 @@ static struct cifs_ntsd *get_cifs_acl_by_path(struct cifs_sb_info *cifs_sb,
tcon = tlink_tcon(tlink); tcon = tlink_tcon(tlink);
xid = get_xid(); xid = get_xid();
if (backup_cred(cifs_sb))
create_options |= CREATE_OPEN_BACKUP_INTENT;
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.cifs_sb = cifs_sb; oparms.cifs_sb = cifs_sb;
oparms.desired_access = READ_CONTROL; oparms.desired_access = READ_CONTROL;
oparms.create_options = create_options; oparms.create_options = cifs_create_options(cifs_sb, 0);
oparms.disposition = FILE_OPEN; oparms.disposition = FILE_OPEN;
oparms.path = path; oparms.path = path;
oparms.fid = &fid; oparms.fid = &fid;
...@@ -1147,7 +1144,7 @@ int set_cifs_acl(struct cifs_ntsd *pnntsd, __u32 acllen, ...@@ -1147,7 +1144,7 @@ int set_cifs_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
{ {
int oplock = 0; int oplock = 0;
unsigned int xid; unsigned int xid;
int rc, access_flags, create_options = 0; int rc, access_flags;
struct cifs_tcon *tcon; struct cifs_tcon *tcon;
struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
struct tcon_link *tlink = cifs_sb_tlink(cifs_sb); struct tcon_link *tlink = cifs_sb_tlink(cifs_sb);
...@@ -1160,9 +1157,6 @@ int set_cifs_acl(struct cifs_ntsd *pnntsd, __u32 acllen, ...@@ -1160,9 +1157,6 @@ int set_cifs_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
tcon = tlink_tcon(tlink); tcon = tlink_tcon(tlink);
xid = get_xid(); xid = get_xid();
if (backup_cred(cifs_sb))
create_options |= CREATE_OPEN_BACKUP_INTENT;
if (aclflag == CIFS_ACL_OWNER || aclflag == CIFS_ACL_GROUP) if (aclflag == CIFS_ACL_OWNER || aclflag == CIFS_ACL_GROUP)
access_flags = WRITE_OWNER; access_flags = WRITE_OWNER;
else else
...@@ -1171,7 +1165,7 @@ int set_cifs_acl(struct cifs_ntsd *pnntsd, __u32 acllen, ...@@ -1171,7 +1165,7 @@ int set_cifs_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.cifs_sb = cifs_sb; oparms.cifs_sb = cifs_sb;
oparms.desired_access = access_flags; oparms.desired_access = access_flags;
oparms.create_options = create_options; oparms.create_options = cifs_create_options(cifs_sb, 0);
oparms.disposition = FILE_OPEN; oparms.disposition = FILE_OPEN;
oparms.path = path; oparms.path = path;
oparms.fid = &fid; oparms.fid = &fid;
......
...@@ -275,7 +275,7 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf) ...@@ -275,7 +275,7 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
buf->f_ffree = 0; /* unlimited */ buf->f_ffree = 0; /* unlimited */
if (server->ops->queryfs) if (server->ops->queryfs)
rc = server->ops->queryfs(xid, tcon, buf); rc = server->ops->queryfs(xid, tcon, cifs_sb, buf);
free_xid(xid); free_xid(xid);
return 0; return 0;
......
...@@ -298,7 +298,8 @@ struct smb_version_operations { ...@@ -298,7 +298,8 @@ struct smb_version_operations {
const char *, struct dfs_info3_param **, const char *, struct dfs_info3_param **,
unsigned int *, const struct nls_table *, int); unsigned int *, const struct nls_table *, int);
/* informational QFS call */ /* informational QFS call */
void (*qfs_tcon)(const unsigned int, struct cifs_tcon *); void (*qfs_tcon)(const unsigned int, struct cifs_tcon *,
struct cifs_sb_info *);
/* check if a path is accessible or not */ /* check if a path is accessible or not */
int (*is_path_accessible)(const unsigned int, struct cifs_tcon *, int (*is_path_accessible)(const unsigned int, struct cifs_tcon *,
struct cifs_sb_info *, const char *); struct cifs_sb_info *, const char *);
...@@ -409,7 +410,7 @@ struct smb_version_operations { ...@@ -409,7 +410,7 @@ struct smb_version_operations {
struct cifsInodeInfo *); struct cifsInodeInfo *);
/* query remote filesystem */ /* query remote filesystem */
int (*queryfs)(const unsigned int, struct cifs_tcon *, int (*queryfs)(const unsigned int, struct cifs_tcon *,
struct kstatfs *); struct cifs_sb_info *, struct kstatfs *);
/* send mandatory brlock to the server */ /* send mandatory brlock to the server */
int (*mand_lock)(const unsigned int, struct cifsFileInfo *, __u64, int (*mand_lock)(const unsigned int, struct cifsFileInfo *, __u64,
__u64, __u32, int, int, bool); __u64, __u32, int, int, bool);
...@@ -490,6 +491,7 @@ struct smb_version_operations { ...@@ -490,6 +491,7 @@ struct smb_version_operations {
/* ioctl passthrough for query_info */ /* ioctl passthrough for query_info */
int (*ioctl_query_info)(const unsigned int xid, int (*ioctl_query_info)(const unsigned int xid,
struct cifs_tcon *tcon, struct cifs_tcon *tcon,
struct cifs_sb_info *cifs_sb,
__le16 *path, int is_dir, __le16 *path, int is_dir,
unsigned long p); unsigned long p);
/* make unix special files (block, char, fifo, socket) */ /* make unix special files (block, char, fifo, socket) */
......
...@@ -612,4 +612,12 @@ static inline int get_dfs_path(const unsigned int xid, struct cifs_ses *ses, ...@@ -612,4 +612,12 @@ static inline int get_dfs_path(const unsigned int xid, struct cifs_ses *ses,
} }
#endif #endif
static inline int cifs_create_options(struct cifs_sb_info *cifs_sb, int options)
{
if (backup_cred(cifs_sb))
return options | CREATE_OPEN_BACKUP_INTENT;
else
return options;
}
#endif /* _CIFSPROTO_H */ #endif /* _CIFSPROTO_H */
...@@ -4365,7 +4365,7 @@ static int mount_get_conns(struct smb_vol *vol, struct cifs_sb_info *cifs_sb, ...@@ -4365,7 +4365,7 @@ static int mount_get_conns(struct smb_vol *vol, struct cifs_sb_info *cifs_sb,
/* do not care if a following call succeed - informational */ /* do not care if a following call succeed - informational */
if (!tcon->pipe && server->ops->qfs_tcon) { if (!tcon->pipe && server->ops->qfs_tcon) {
server->ops->qfs_tcon(*xid, tcon); server->ops->qfs_tcon(*xid, tcon, cifs_sb);
if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) { if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_RO_CACHE) {
if (tcon->fsDevInfo.DeviceCharacteristics & if (tcon->fsDevInfo.DeviceCharacteristics &
cpu_to_le32(FILE_READ_ONLY_DEVICE)) cpu_to_le32(FILE_READ_ONLY_DEVICE))
......
...@@ -355,13 +355,10 @@ cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned int xid, ...@@ -355,13 +355,10 @@ cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned int xid,
if (!tcon->unix_ext && (mode & S_IWUGO) == 0) if (!tcon->unix_ext && (mode & S_IWUGO) == 0)
create_options |= CREATE_OPTION_READONLY; create_options |= CREATE_OPTION_READONLY;
if (backup_cred(cifs_sb))
create_options |= CREATE_OPEN_BACKUP_INTENT;
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.cifs_sb = cifs_sb; oparms.cifs_sb = cifs_sb;
oparms.desired_access = desired_access; oparms.desired_access = desired_access;
oparms.create_options = create_options; oparms.create_options = cifs_create_options(cifs_sb, create_options);
oparms.disposition = disposition; oparms.disposition = disposition;
oparms.path = full_path; oparms.path = full_path;
oparms.fid = fid; oparms.fid = fid;
......
...@@ -222,9 +222,6 @@ cifs_nt_open(char *full_path, struct inode *inode, struct cifs_sb_info *cifs_sb, ...@@ -222,9 +222,6 @@ cifs_nt_open(char *full_path, struct inode *inode, struct cifs_sb_info *cifs_sb,
if (!buf) if (!buf)
return -ENOMEM; return -ENOMEM;
if (backup_cred(cifs_sb))
create_options |= CREATE_OPEN_BACKUP_INTENT;
/* O_SYNC also has bit for O_DSYNC so following check picks up either */ /* O_SYNC also has bit for O_DSYNC so following check picks up either */
if (f_flags & O_SYNC) if (f_flags & O_SYNC)
create_options |= CREATE_WRITE_THROUGH; create_options |= CREATE_WRITE_THROUGH;
...@@ -235,7 +232,7 @@ cifs_nt_open(char *full_path, struct inode *inode, struct cifs_sb_info *cifs_sb, ...@@ -235,7 +232,7 @@ cifs_nt_open(char *full_path, struct inode *inode, struct cifs_sb_info *cifs_sb,
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.cifs_sb = cifs_sb; oparms.cifs_sb = cifs_sb;
oparms.desired_access = desired_access; oparms.desired_access = desired_access;
oparms.create_options = create_options; oparms.create_options = cifs_create_options(cifs_sb, create_options);
oparms.disposition = disposition; oparms.disposition = disposition;
oparms.path = full_path; oparms.path = full_path;
oparms.fid = fid; oparms.fid = fid;
...@@ -752,9 +749,6 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush) ...@@ -752,9 +749,6 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush)
desired_access = cifs_convert_flags(cfile->f_flags); desired_access = cifs_convert_flags(cfile->f_flags);
if (backup_cred(cifs_sb))
create_options |= CREATE_OPEN_BACKUP_INTENT;
/* O_SYNC also has bit for O_DSYNC so following check picks up either */ /* O_SYNC also has bit for O_DSYNC so following check picks up either */
if (cfile->f_flags & O_SYNC) if (cfile->f_flags & O_SYNC)
create_options |= CREATE_WRITE_THROUGH; create_options |= CREATE_WRITE_THROUGH;
...@@ -768,7 +762,7 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush) ...@@ -768,7 +762,7 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush)
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.cifs_sb = cifs_sb; oparms.cifs_sb = cifs_sb;
oparms.desired_access = desired_access; oparms.desired_access = desired_access;
oparms.create_options = create_options; oparms.create_options = cifs_create_options(cifs_sb, create_options);
oparms.disposition = disposition; oparms.disposition = disposition;
oparms.path = full_path; oparms.path = full_path;
oparms.fid = &cfile->fid; oparms.fid = &cfile->fid;
......
...@@ -472,9 +472,7 @@ cifs_sfu_type(struct cifs_fattr *fattr, const char *path, ...@@ -472,9 +472,7 @@ cifs_sfu_type(struct cifs_fattr *fattr, const char *path,
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.cifs_sb = cifs_sb; oparms.cifs_sb = cifs_sb;
oparms.desired_access = GENERIC_READ; oparms.desired_access = GENERIC_READ;
oparms.create_options = CREATE_NOT_DIR; oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
if (backup_cred(cifs_sb))
oparms.create_options |= CREATE_OPEN_BACKUP_INTENT;
oparms.disposition = FILE_OPEN; oparms.disposition = FILE_OPEN;
oparms.path = path; oparms.path = path;
oparms.fid = &fid; oparms.fid = &fid;
...@@ -1284,7 +1282,7 @@ cifs_rename_pending_delete(const char *full_path, struct dentry *dentry, ...@@ -1284,7 +1282,7 @@ cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.cifs_sb = cifs_sb; oparms.cifs_sb = cifs_sb;
oparms.desired_access = DELETE | FILE_WRITE_ATTRIBUTES; oparms.desired_access = DELETE | FILE_WRITE_ATTRIBUTES;
oparms.create_options = CREATE_NOT_DIR; oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
oparms.disposition = FILE_OPEN; oparms.disposition = FILE_OPEN;
oparms.path = full_path; oparms.path = full_path;
oparms.fid = &fid; oparms.fid = &fid;
...@@ -1822,7 +1820,7 @@ cifs_do_rename(const unsigned int xid, struct dentry *from_dentry, ...@@ -1822,7 +1820,7 @@ cifs_do_rename(const unsigned int xid, struct dentry *from_dentry,
oparms.cifs_sb = cifs_sb; oparms.cifs_sb = cifs_sb;
/* open the file to be renamed -- we need DELETE perms */ /* open the file to be renamed -- we need DELETE perms */
oparms.desired_access = DELETE; oparms.desired_access = DELETE;
oparms.create_options = CREATE_NOT_DIR; oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
oparms.disposition = FILE_OPEN; oparms.disposition = FILE_OPEN;
oparms.path = from_path; oparms.path = from_path;
oparms.fid = &fid; oparms.fid = &fid;
......
...@@ -65,7 +65,7 @@ static long cifs_ioctl_query_info(unsigned int xid, struct file *filep, ...@@ -65,7 +65,7 @@ static long cifs_ioctl_query_info(unsigned int xid, struct file *filep,
if (tcon->ses->server->ops->ioctl_query_info) if (tcon->ses->server->ops->ioctl_query_info)
rc = tcon->ses->server->ops->ioctl_query_info( rc = tcon->ses->server->ops->ioctl_query_info(
xid, tcon, utf16_path, xid, tcon, cifs_sb, utf16_path,
filep->private_data ? 0 : 1, p); filep->private_data ? 0 : 1, p);
else else
rc = -EOPNOTSUPP; rc = -EOPNOTSUPP;
......
...@@ -315,7 +315,7 @@ cifs_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon, ...@@ -315,7 +315,7 @@ cifs_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.cifs_sb = cifs_sb; oparms.cifs_sb = cifs_sb;
oparms.desired_access = GENERIC_READ; oparms.desired_access = GENERIC_READ;
oparms.create_options = CREATE_NOT_DIR; oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
oparms.disposition = FILE_OPEN; oparms.disposition = FILE_OPEN;
oparms.path = path; oparms.path = path;
oparms.fid = &fid; oparms.fid = &fid;
...@@ -353,15 +353,11 @@ cifs_create_mf_symlink(unsigned int xid, struct cifs_tcon *tcon, ...@@ -353,15 +353,11 @@ cifs_create_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
struct cifs_fid fid; struct cifs_fid fid;
struct cifs_open_parms oparms; struct cifs_open_parms oparms;
struct cifs_io_parms io_parms; struct cifs_io_parms io_parms;
int create_options = CREATE_NOT_DIR;
if (backup_cred(cifs_sb))
create_options |= CREATE_OPEN_BACKUP_INTENT;
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.cifs_sb = cifs_sb; oparms.cifs_sb = cifs_sb;
oparms.desired_access = GENERIC_WRITE; oparms.desired_access = GENERIC_WRITE;
oparms.create_options = create_options; oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
oparms.disposition = FILE_CREATE; oparms.disposition = FILE_CREATE;
oparms.path = path; oparms.path = path;
oparms.fid = &fid; oparms.fid = &fid;
...@@ -402,9 +398,7 @@ smb3_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon, ...@@ -402,9 +398,7 @@ smb3_query_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.cifs_sb = cifs_sb; oparms.cifs_sb = cifs_sb;
oparms.desired_access = GENERIC_READ; oparms.desired_access = GENERIC_READ;
oparms.create_options = CREATE_NOT_DIR; oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
if (backup_cred(cifs_sb))
oparms.create_options |= CREATE_OPEN_BACKUP_INTENT;
oparms.disposition = FILE_OPEN; oparms.disposition = FILE_OPEN;
oparms.fid = &fid; oparms.fid = &fid;
oparms.reconnect = false; oparms.reconnect = false;
...@@ -457,14 +451,10 @@ smb3_create_mf_symlink(unsigned int xid, struct cifs_tcon *tcon, ...@@ -457,14 +451,10 @@ smb3_create_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
struct cifs_fid fid; struct cifs_fid fid;
struct cifs_open_parms oparms; struct cifs_open_parms oparms;
struct cifs_io_parms io_parms; struct cifs_io_parms io_parms;
int create_options = CREATE_NOT_DIR;
__le16 *utf16_path; __le16 *utf16_path;
__u8 oplock = SMB2_OPLOCK_LEVEL_NONE; __u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
struct kvec iov[2]; struct kvec iov[2];
if (backup_cred(cifs_sb))
create_options |= CREATE_OPEN_BACKUP_INTENT;
cifs_dbg(FYI, "%s: path: %s\n", __func__, path); cifs_dbg(FYI, "%s: path: %s\n", __func__, path);
utf16_path = cifs_convert_path_to_utf16(path, cifs_sb); utf16_path = cifs_convert_path_to_utf16(path, cifs_sb);
...@@ -474,7 +464,7 @@ smb3_create_mf_symlink(unsigned int xid, struct cifs_tcon *tcon, ...@@ -474,7 +464,7 @@ smb3_create_mf_symlink(unsigned int xid, struct cifs_tcon *tcon,
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.cifs_sb = cifs_sb; oparms.cifs_sb = cifs_sb;
oparms.desired_access = GENERIC_WRITE; oparms.desired_access = GENERIC_WRITE;
oparms.create_options = create_options; oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
oparms.disposition = FILE_CREATE; oparms.disposition = FILE_CREATE;
oparms.fid = &fid; oparms.fid = &fid;
oparms.reconnect = false; oparms.reconnect = false;
......
...@@ -504,7 +504,8 @@ cifs_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *volume_info) ...@@ -504,7 +504,8 @@ cifs_negotiate_rsize(struct cifs_tcon *tcon, struct smb_vol *volume_info)
} }
static void static void
cifs_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon) cifs_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon,
struct cifs_sb_info *cifs_sb)
{ {
CIFSSMBQFSDeviceInfo(xid, tcon); CIFSSMBQFSDeviceInfo(xid, tcon);
CIFSSMBQFSAttributeInfo(xid, tcon); CIFSSMBQFSAttributeInfo(xid, tcon);
...@@ -565,7 +566,7 @@ cifs_query_path_info(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -565,7 +566,7 @@ cifs_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.cifs_sb = cifs_sb; oparms.cifs_sb = cifs_sb;
oparms.desired_access = FILE_READ_ATTRIBUTES; oparms.desired_access = FILE_READ_ATTRIBUTES;
oparms.create_options = 0; oparms.create_options = cifs_create_options(cifs_sb, 0);
oparms.disposition = FILE_OPEN; oparms.disposition = FILE_OPEN;
oparms.path = full_path; oparms.path = full_path;
oparms.fid = &fid; oparms.fid = &fid;
...@@ -793,7 +794,7 @@ smb_set_file_info(struct inode *inode, const char *full_path, ...@@ -793,7 +794,7 @@ smb_set_file_info(struct inode *inode, const char *full_path,
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.cifs_sb = cifs_sb; oparms.cifs_sb = cifs_sb;
oparms.desired_access = SYNCHRONIZE | FILE_WRITE_ATTRIBUTES; oparms.desired_access = SYNCHRONIZE | FILE_WRITE_ATTRIBUTES;
oparms.create_options = CREATE_NOT_DIR; oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR);
oparms.disposition = FILE_OPEN; oparms.disposition = FILE_OPEN;
oparms.path = full_path; oparms.path = full_path;
oparms.fid = &fid; oparms.fid = &fid;
...@@ -872,7 +873,7 @@ cifs_oplock_response(struct cifs_tcon *tcon, struct cifs_fid *fid, ...@@ -872,7 +873,7 @@ cifs_oplock_response(struct cifs_tcon *tcon, struct cifs_fid *fid,
static int static int
cifs_queryfs(const unsigned int xid, struct cifs_tcon *tcon, cifs_queryfs(const unsigned int xid, struct cifs_tcon *tcon,
struct kstatfs *buf) struct cifs_sb_info *cifs_sb, struct kstatfs *buf)
{ {
int rc = -EOPNOTSUPP; int rc = -EOPNOTSUPP;
...@@ -970,7 +971,8 @@ cifs_query_symlink(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -970,7 +971,8 @@ cifs_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.cifs_sb = cifs_sb; oparms.cifs_sb = cifs_sb;
oparms.desired_access = FILE_READ_ATTRIBUTES; oparms.desired_access = FILE_READ_ATTRIBUTES;
oparms.create_options = OPEN_REPARSE_POINT; oparms.create_options = cifs_create_options(cifs_sb,
OPEN_REPARSE_POINT);
oparms.disposition = FILE_OPEN; oparms.disposition = FILE_OPEN;
oparms.path = full_path; oparms.path = full_path;
oparms.fid = &fid; oparms.fid = &fid;
...@@ -1029,7 +1031,6 @@ cifs_make_node(unsigned int xid, struct inode *inode, ...@@ -1029,7 +1031,6 @@ cifs_make_node(unsigned int xid, struct inode *inode,
struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
struct inode *newinode = NULL; struct inode *newinode = NULL;
int rc = -EPERM; int rc = -EPERM;
int create_options = CREATE_NOT_DIR | CREATE_OPTION_SPECIAL;
FILE_ALL_INFO *buf = NULL; FILE_ALL_INFO *buf = NULL;
struct cifs_io_parms io_parms; struct cifs_io_parms io_parms;
__u32 oplock = 0; __u32 oplock = 0;
...@@ -1090,13 +1091,11 @@ cifs_make_node(unsigned int xid, struct inode *inode, ...@@ -1090,13 +1091,11 @@ cifs_make_node(unsigned int xid, struct inode *inode,
goto out; goto out;
} }
if (backup_cred(cifs_sb))
create_options |= CREATE_OPEN_BACKUP_INTENT;
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.cifs_sb = cifs_sb; oparms.cifs_sb = cifs_sb;
oparms.desired_access = GENERIC_WRITE; oparms.desired_access = GENERIC_WRITE;
oparms.create_options = create_options; oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR |
CREATE_OPTION_SPECIAL);
oparms.disposition = FILE_CREATE; oparms.disposition = FILE_CREATE;
oparms.path = full_path; oparms.path = full_path;
oparms.fid = &fid; oparms.fid = &fid;
......
...@@ -99,9 +99,7 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -99,9 +99,7 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.desired_access = desired_access; oparms.desired_access = desired_access;
oparms.disposition = create_disposition; oparms.disposition = create_disposition;
oparms.create_options = create_options; oparms.create_options = cifs_create_options(cifs_sb, create_options);
if (backup_cred(cifs_sb))
oparms.create_options |= CREATE_OPEN_BACKUP_INTENT;
oparms.fid = &fid; oparms.fid = &fid;
oparms.reconnect = false; oparms.reconnect = false;
oparms.mode = mode; oparms.mode = mode;
...@@ -457,7 +455,7 @@ smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -457,7 +455,7 @@ smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
/* If it is a root and its handle is cached then use it */ /* If it is a root and its handle is cached then use it */
if (!strlen(full_path) && !no_cached_open) { if (!strlen(full_path) && !no_cached_open) {
rc = open_shroot(xid, tcon, &fid); rc = open_shroot(xid, tcon, cifs_sb, &fid);
if (rc) if (rc)
goto out; goto out;
...@@ -474,9 +472,6 @@ smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -474,9 +472,6 @@ smb2_query_path_info(const unsigned int xid, struct cifs_tcon *tcon,
goto out; goto out;
} }
if (backup_cred(cifs_sb))
create_options |= CREATE_OPEN_BACKUP_INTENT;
cifs_get_readable_path(tcon, full_path, &cfile); cifs_get_readable_path(tcon, full_path, &cfile);
rc = smb2_compound_op(xid, tcon, cifs_sb, full_path, rc = smb2_compound_op(xid, tcon, cifs_sb, full_path,
FILE_READ_ATTRIBUTES, FILE_OPEN, create_options, FILE_READ_ATTRIBUTES, FILE_OPEN, create_options,
......
...@@ -655,7 +655,8 @@ smb2_cached_lease_break(struct work_struct *work) ...@@ -655,7 +655,8 @@ smb2_cached_lease_break(struct work_struct *work)
/* /*
* Open the directory at the root of a share * Open the directory at the root of a share
*/ */
int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid) int open_shroot(unsigned int xid, struct cifs_tcon *tcon,
struct cifs_sb_info *cifs_sb, struct cifs_fid *pfid)
{ {
struct cifs_ses *ses = tcon->ses; struct cifs_ses *ses = tcon->ses;
struct TCP_Server_Info *server = ses->server; struct TCP_Server_Info *server = ses->server;
...@@ -702,7 +703,7 @@ int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid) ...@@ -702,7 +703,7 @@ int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid)
rqst[0].rq_nvec = SMB2_CREATE_IOV_SIZE; rqst[0].rq_nvec = SMB2_CREATE_IOV_SIZE;
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.create_options = 0; oparms.create_options = cifs_create_options(cifs_sb, 0);
oparms.desired_access = FILE_READ_ATTRIBUTES; oparms.desired_access = FILE_READ_ATTRIBUTES;
oparms.disposition = FILE_OPEN; oparms.disposition = FILE_OPEN;
oparms.fid = pfid; oparms.fid = pfid;
...@@ -818,7 +819,8 @@ int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid) ...@@ -818,7 +819,8 @@ int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid)
} }
static void static void
smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon) smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon,
struct cifs_sb_info *cifs_sb)
{ {
int rc; int rc;
__le16 srch_path = 0; /* Null - open root of share */ __le16 srch_path = 0; /* Null - open root of share */
...@@ -830,7 +832,7 @@ smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon) ...@@ -830,7 +832,7 @@ smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.desired_access = FILE_READ_ATTRIBUTES; oparms.desired_access = FILE_READ_ATTRIBUTES;
oparms.disposition = FILE_OPEN; oparms.disposition = FILE_OPEN;
oparms.create_options = 0; oparms.create_options = cifs_create_options(cifs_sb, 0);
oparms.fid = &fid; oparms.fid = &fid;
oparms.reconnect = false; oparms.reconnect = false;
...@@ -838,7 +840,7 @@ smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon) ...@@ -838,7 +840,7 @@ smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
rc = SMB2_open(xid, &oparms, &srch_path, &oplock, NULL, NULL, rc = SMB2_open(xid, &oparms, &srch_path, &oplock, NULL, NULL,
NULL); NULL);
else else
rc = open_shroot(xid, tcon, &fid); rc = open_shroot(xid, tcon, cifs_sb, &fid);
if (rc) if (rc)
return; return;
...@@ -860,7 +862,8 @@ smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon) ...@@ -860,7 +862,8 @@ smb3_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
} }
static void static void
smb2_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon) smb2_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon,
struct cifs_sb_info *cifs_sb)
{ {
int rc; int rc;
__le16 srch_path = 0; /* Null - open root of share */ __le16 srch_path = 0; /* Null - open root of share */
...@@ -871,7 +874,7 @@ smb2_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon) ...@@ -871,7 +874,7 @@ smb2_qfs_tcon(const unsigned int xid, struct cifs_tcon *tcon)
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.desired_access = FILE_READ_ATTRIBUTES; oparms.desired_access = FILE_READ_ATTRIBUTES;
oparms.disposition = FILE_OPEN; oparms.disposition = FILE_OPEN;
oparms.create_options = 0; oparms.create_options = cifs_create_options(cifs_sb, 0);
oparms.fid = &fid; oparms.fid = &fid;
oparms.reconnect = false; oparms.reconnect = false;
...@@ -906,10 +909,7 @@ smb2_is_path_accessible(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -906,10 +909,7 @@ smb2_is_path_accessible(const unsigned int xid, struct cifs_tcon *tcon,
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.desired_access = FILE_READ_ATTRIBUTES; oparms.desired_access = FILE_READ_ATTRIBUTES;
oparms.disposition = FILE_OPEN; oparms.disposition = FILE_OPEN;
if (backup_cred(cifs_sb)) oparms.create_options = cifs_create_options(cifs_sb, 0);
oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
else
oparms.create_options = 0;
oparms.fid = &fid; oparms.fid = &fid;
oparms.reconnect = false; oparms.reconnect = false;
...@@ -1151,10 +1151,7 @@ smb2_set_ea(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -1151,10 +1151,7 @@ smb2_set_ea(const unsigned int xid, struct cifs_tcon *tcon,
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.desired_access = FILE_WRITE_EA; oparms.desired_access = FILE_WRITE_EA;
oparms.disposition = FILE_OPEN; oparms.disposition = FILE_OPEN;
if (backup_cred(cifs_sb)) oparms.create_options = cifs_create_options(cifs_sb, 0);
oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
else
oparms.create_options = 0;
oparms.fid = &fid; oparms.fid = &fid;
oparms.reconnect = false; oparms.reconnect = false;
...@@ -1422,6 +1419,7 @@ SMB2_request_res_key(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -1422,6 +1419,7 @@ SMB2_request_res_key(const unsigned int xid, struct cifs_tcon *tcon,
static int static int
smb2_ioctl_query_info(const unsigned int xid, smb2_ioctl_query_info(const unsigned int xid,
struct cifs_tcon *tcon, struct cifs_tcon *tcon,
struct cifs_sb_info *cifs_sb,
__le16 *path, int is_dir, __le16 *path, int is_dir,
unsigned long p) unsigned long p)
{ {
...@@ -1447,6 +1445,7 @@ smb2_ioctl_query_info(const unsigned int xid, ...@@ -1447,6 +1445,7 @@ smb2_ioctl_query_info(const unsigned int xid,
struct kvec close_iov[1]; struct kvec close_iov[1];
unsigned int size[2]; unsigned int size[2];
void *data[2]; void *data[2];
int create_options = is_dir ? CREATE_NOT_FILE : CREATE_NOT_DIR;
memset(rqst, 0, sizeof(rqst)); memset(rqst, 0, sizeof(rqst));
resp_buftype[0] = resp_buftype[1] = resp_buftype[2] = CIFS_NO_BUFFER; resp_buftype[0] = resp_buftype[1] = resp_buftype[2] = CIFS_NO_BUFFER;
...@@ -1477,10 +1476,7 @@ smb2_ioctl_query_info(const unsigned int xid, ...@@ -1477,10 +1476,7 @@ smb2_ioctl_query_info(const unsigned int xid,
memset(&oparms, 0, sizeof(oparms)); memset(&oparms, 0, sizeof(oparms));
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.disposition = FILE_OPEN; oparms.disposition = FILE_OPEN;
if (is_dir) oparms.create_options = cifs_create_options(cifs_sb, create_options);
oparms.create_options = CREATE_NOT_FILE;
else
oparms.create_options = CREATE_NOT_DIR;
oparms.fid = &fid; oparms.fid = &fid;
oparms.reconnect = false; oparms.reconnect = false;
...@@ -2086,10 +2082,7 @@ smb2_query_dir_first(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -2086,10 +2082,7 @@ smb2_query_dir_first(const unsigned int xid, struct cifs_tcon *tcon,
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.desired_access = FILE_READ_ATTRIBUTES | FILE_READ_DATA; oparms.desired_access = FILE_READ_ATTRIBUTES | FILE_READ_DATA;
oparms.disposition = FILE_OPEN; oparms.disposition = FILE_OPEN;
if (backup_cred(cifs_sb)) oparms.create_options = cifs_create_options(cifs_sb, 0);
oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
else
oparms.create_options = 0;
oparms.fid = fid; oparms.fid = fid;
oparms.reconnect = false; oparms.reconnect = false;
...@@ -2343,10 +2336,7 @@ smb2_query_info_compound(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -2343,10 +2336,7 @@ smb2_query_info_compound(const unsigned int xid, struct cifs_tcon *tcon,
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.desired_access = desired_access; oparms.desired_access = desired_access;
oparms.disposition = FILE_OPEN; oparms.disposition = FILE_OPEN;
if (cifs_sb && backup_cred(cifs_sb)) oparms.create_options = cifs_create_options(cifs_sb, 0);
oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
else
oparms.create_options = 0;
oparms.fid = &fid; oparms.fid = &fid;
oparms.reconnect = false; oparms.reconnect = false;
...@@ -2402,7 +2392,7 @@ smb2_query_info_compound(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -2402,7 +2392,7 @@ smb2_query_info_compound(const unsigned int xid, struct cifs_tcon *tcon,
static int static int
smb2_queryfs(const unsigned int xid, struct cifs_tcon *tcon, smb2_queryfs(const unsigned int xid, struct cifs_tcon *tcon,
struct kstatfs *buf) struct cifs_sb_info *cifs_sb, struct kstatfs *buf)
{ {
struct smb2_query_info_rsp *rsp; struct smb2_query_info_rsp *rsp;
struct smb2_fs_full_size_info *info = NULL; struct smb2_fs_full_size_info *info = NULL;
...@@ -2439,7 +2429,7 @@ smb2_queryfs(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -2439,7 +2429,7 @@ smb2_queryfs(const unsigned int xid, struct cifs_tcon *tcon,
static int static int
smb311_queryfs(const unsigned int xid, struct cifs_tcon *tcon, smb311_queryfs(const unsigned int xid, struct cifs_tcon *tcon,
struct kstatfs *buf) struct cifs_sb_info *cifs_sb, struct kstatfs *buf)
{ {
int rc; int rc;
__le16 srch_path = 0; /* Null - open root of share */ __le16 srch_path = 0; /* Null - open root of share */
...@@ -2448,12 +2438,12 @@ smb311_queryfs(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -2448,12 +2438,12 @@ smb311_queryfs(const unsigned int xid, struct cifs_tcon *tcon,
struct cifs_fid fid; struct cifs_fid fid;
if (!tcon->posix_extensions) if (!tcon->posix_extensions)
return smb2_queryfs(xid, tcon, buf); return smb2_queryfs(xid, tcon, cifs_sb, buf);
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.desired_access = FILE_READ_ATTRIBUTES; oparms.desired_access = FILE_READ_ATTRIBUTES;
oparms.disposition = FILE_OPEN; oparms.disposition = FILE_OPEN;
oparms.create_options = 0; oparms.create_options = cifs_create_options(cifs_sb, 0);
oparms.fid = &fid; oparms.fid = &fid;
oparms.reconnect = false; oparms.reconnect = false;
...@@ -2722,6 +2712,7 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -2722,6 +2712,7 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
struct smb2_create_rsp *create_rsp; struct smb2_create_rsp *create_rsp;
struct smb2_ioctl_rsp *ioctl_rsp; struct smb2_ioctl_rsp *ioctl_rsp;
struct reparse_data_buffer *reparse_buf; struct reparse_data_buffer *reparse_buf;
int create_options = is_reparse_point ? OPEN_REPARSE_POINT : 0;
u32 plen; u32 plen;
cifs_dbg(FYI, "%s: path: %s\n", __func__, full_path); cifs_dbg(FYI, "%s: path: %s\n", __func__, full_path);
...@@ -2748,14 +2739,7 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon, ...@@ -2748,14 +2739,7 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.desired_access = FILE_READ_ATTRIBUTES; oparms.desired_access = FILE_READ_ATTRIBUTES;
oparms.disposition = FILE_OPEN; oparms.disposition = FILE_OPEN;
oparms.create_options = cifs_create_options(cifs_sb, create_options);
if (backup_cred(cifs_sb))
oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
else
oparms.create_options = 0;
if (is_reparse_point)
oparms.create_options = OPEN_REPARSE_POINT;
oparms.fid = &fid; oparms.fid = &fid;
oparms.reconnect = false; oparms.reconnect = false;
...@@ -2934,11 +2918,6 @@ get_smb2_acl_by_path(struct cifs_sb_info *cifs_sb, ...@@ -2934,11 +2918,6 @@ get_smb2_acl_by_path(struct cifs_sb_info *cifs_sb,
tcon = tlink_tcon(tlink); tcon = tlink_tcon(tlink);
xid = get_xid(); xid = get_xid();
if (backup_cred(cifs_sb))
oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
else
oparms.create_options = 0;
utf16_path = cifs_convert_path_to_utf16(path, cifs_sb); utf16_path = cifs_convert_path_to_utf16(path, cifs_sb);
if (!utf16_path) { if (!utf16_path) {
rc = -ENOMEM; rc = -ENOMEM;
...@@ -2949,6 +2928,7 @@ get_smb2_acl_by_path(struct cifs_sb_info *cifs_sb, ...@@ -2949,6 +2928,7 @@ get_smb2_acl_by_path(struct cifs_sb_info *cifs_sb,
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.desired_access = READ_CONTROL; oparms.desired_access = READ_CONTROL;
oparms.disposition = FILE_OPEN; oparms.disposition = FILE_OPEN;
oparms.create_options = cifs_create_options(cifs_sb, 0);
oparms.fid = &fid; oparms.fid = &fid;
oparms.reconnect = false; oparms.reconnect = false;
...@@ -2990,11 +2970,6 @@ set_smb2_acl(struct cifs_ntsd *pnntsd, __u32 acllen, ...@@ -2990,11 +2970,6 @@ set_smb2_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
tcon = tlink_tcon(tlink); tcon = tlink_tcon(tlink);
xid = get_xid(); xid = get_xid();
if (backup_cred(cifs_sb))
oparms.create_options = CREATE_OPEN_BACKUP_INTENT;
else
oparms.create_options = 0;
if (aclflag == CIFS_ACL_OWNER || aclflag == CIFS_ACL_GROUP) if (aclflag == CIFS_ACL_OWNER || aclflag == CIFS_ACL_GROUP)
access_flags = WRITE_OWNER; access_flags = WRITE_OWNER;
else else
...@@ -3009,6 +2984,7 @@ set_smb2_acl(struct cifs_ntsd *pnntsd, __u32 acllen, ...@@ -3009,6 +2984,7 @@ set_smb2_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.desired_access = access_flags; oparms.desired_access = access_flags;
oparms.create_options = cifs_create_options(cifs_sb, 0);
oparms.disposition = FILE_OPEN; oparms.disposition = FILE_OPEN;
oparms.path = path; oparms.path = path;
oparms.fid = &fid; oparms.fid = &fid;
...@@ -4491,7 +4467,6 @@ smb2_make_node(unsigned int xid, struct inode *inode, ...@@ -4491,7 +4467,6 @@ smb2_make_node(unsigned int xid, struct inode *inode,
{ {
struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
int rc = -EPERM; int rc = -EPERM;
int create_options = CREATE_NOT_DIR | CREATE_OPTION_SPECIAL;
FILE_ALL_INFO *buf = NULL; FILE_ALL_INFO *buf = NULL;
struct cifs_io_parms io_parms; struct cifs_io_parms io_parms;
__u32 oplock = 0; __u32 oplock = 0;
...@@ -4527,13 +4502,11 @@ smb2_make_node(unsigned int xid, struct inode *inode, ...@@ -4527,13 +4502,11 @@ smb2_make_node(unsigned int xid, struct inode *inode,
goto out; goto out;
} }
if (backup_cred(cifs_sb))
create_options |= CREATE_OPEN_BACKUP_INTENT;
oparms.tcon = tcon; oparms.tcon = tcon;
oparms.cifs_sb = cifs_sb; oparms.cifs_sb = cifs_sb;
oparms.desired_access = GENERIC_WRITE; oparms.desired_access = GENERIC_WRITE;
oparms.create_options = create_options; oparms.create_options = cifs_create_options(cifs_sb, CREATE_NOT_DIR |
CREATE_OPTION_SPECIAL);
oparms.disposition = FILE_CREATE; oparms.disposition = FILE_CREATE;
oparms.path = full_path; oparms.path = full_path;
oparms.fid = &fid; oparms.fid = &fid;
......
...@@ -68,7 +68,7 @@ extern int smb3_handle_read_data(struct TCP_Server_Info *server, ...@@ -68,7 +68,7 @@ extern int smb3_handle_read_data(struct TCP_Server_Info *server,
struct mid_q_entry *mid); struct mid_q_entry *mid);
extern int open_shroot(unsigned int xid, struct cifs_tcon *tcon, extern int open_shroot(unsigned int xid, struct cifs_tcon *tcon,
struct cifs_fid *pfid); struct cifs_sb_info *cifs_sb, struct cifs_fid *pfid);
extern void close_shroot(struct cached_fid *cfid); extern void close_shroot(struct cached_fid *cfid);
extern void close_shroot_lease(struct cached_fid *cfid); extern void close_shroot_lease(struct cached_fid *cfid);
extern void close_shroot_lease_locked(struct cached_fid *cfid); extern void close_shroot_lease_locked(struct cached_fid *cfid);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment