Commit 1feeaac753e0a9b3864740556b7840643642abdb
Committed by
Steve French
1 parent
6bdf6dbd66
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
CIFS: Add set_file_info support for SMB2
Signed-off-by: Pavel Shilovsky <pshilovsky@samba.org> Signed-off-by: Steve French <smfrench@gmail.com>
Showing 4 changed files with 39 additions and 0 deletions Side-by-side Diff
fs/cifs/smb2inode.c
... | ... | @@ -86,6 +86,10 @@ |
86 | 86 | tmprc = SMB2_set_eof(xid, tcon, persistent_fid, volatile_fid, |
87 | 87 | current->tgid, (__le64 *)data); |
88 | 88 | break; |
89 | + case SMB2_OP_SET_INFO: | |
90 | + tmprc = SMB2_set_info(xid, tcon, persistent_fid, volatile_fid, | |
91 | + (FILE_BASIC_INFO *)data); | |
92 | + break; | |
89 | 93 | default: |
90 | 94 | cERROR(1, "Invalid command"); |
91 | 95 | break; |
... | ... | @@ -231,5 +235,23 @@ |
231 | 235 | return smb2_open_op_close(xid, tcon, cifs_sb, full_path, |
232 | 236 | FILE_WRITE_DATA, FILE_OPEN, 0, 0, &eof, |
233 | 237 | SMB2_OP_SET_EOF); |
238 | +} | |
239 | + | |
240 | +int | |
241 | +smb2_set_file_info(struct inode *inode, const char *full_path, | |
242 | + FILE_BASIC_INFO *buf, const unsigned int xid) | |
243 | +{ | |
244 | + struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); | |
245 | + struct tcon_link *tlink; | |
246 | + int rc; | |
247 | + | |
248 | + tlink = cifs_sb_tlink(cifs_sb); | |
249 | + if (IS_ERR(tlink)) | |
250 | + return PTR_ERR(tlink); | |
251 | + rc = smb2_open_op_close(xid, tlink_tcon(tlink), cifs_sb, full_path, | |
252 | + FILE_WRITE_ATTRIBUTES, FILE_OPEN, 0, 0, buf, | |
253 | + SMB2_OP_SET_INFO); | |
254 | + cifs_put_tlink(tlink); | |
255 | + return rc; | |
234 | 256 | } |
fs/cifs/smb2ops.c
... | ... | @@ -457,6 +457,7 @@ |
457 | 457 | .query_file_info = smb2_query_file_info, |
458 | 458 | .set_path_size = smb2_set_path_size, |
459 | 459 | .set_file_size = smb2_set_file_size, |
460 | + .set_file_info = smb2_set_file_info, | |
460 | 461 | .build_path_to_root = smb2_build_path_to_root, |
461 | 462 | .mkdir = smb2_mkdir, |
462 | 463 | .mkdir_setinfo = smb2_mkdir_setinfo, |
fs/cifs/smb2pdu.c
... | ... | @@ -1760,4 +1760,15 @@ |
1760 | 1760 | return send_set_info(xid, tcon, persistent_fid, volatile_fid, pid, |
1761 | 1761 | FILE_END_OF_FILE_INFORMATION, 1, &data, &size); |
1762 | 1762 | } |
1763 | + | |
1764 | +int | |
1765 | +SMB2_set_info(const unsigned int xid, struct cifs_tcon *tcon, | |
1766 | + u64 persistent_fid, u64 volatile_fid, FILE_BASIC_INFO *buf) | |
1767 | +{ | |
1768 | + unsigned int size; | |
1769 | + size = sizeof(FILE_BASIC_INFO); | |
1770 | + return send_set_info(xid, tcon, persistent_fid, volatile_fid, | |
1771 | + current->tgid, FILE_BASIC_INFORMATION, 1, | |
1772 | + (void **)&buf, &size); | |
1773 | +} |
fs/cifs/smb2proto.h
... | ... | @@ -59,6 +59,8 @@ |
59 | 59 | extern int smb2_set_path_size(const unsigned int xid, struct cifs_tcon *tcon, |
60 | 60 | const char *full_path, __u64 size, |
61 | 61 | struct cifs_sb_info *cifs_sb, bool set_alloc); |
62 | +extern int smb2_set_file_info(struct inode *inode, const char *full_path, | |
63 | + FILE_BASIC_INFO *buf, const unsigned int xid); | |
62 | 64 | extern int smb2_mkdir(const unsigned int xid, struct cifs_tcon *tcon, |
63 | 65 | const char *name, struct cifs_sb_info *cifs_sb); |
64 | 66 | extern void smb2_mkdir_setinfo(struct inode *inode, const char *full_path, |
... | ... | @@ -124,6 +126,9 @@ |
124 | 126 | extern int SMB2_set_eof(const unsigned int xid, struct cifs_tcon *tcon, |
125 | 127 | u64 persistent_fid, u64 volatile_fid, u32 pid, |
126 | 128 | __le64 *eof); |
129 | +extern int SMB2_set_info(const unsigned int xid, struct cifs_tcon *tcon, | |
130 | + u64 persistent_fid, u64 volatile_fid, | |
131 | + FILE_BASIC_INFO *buf); | |
127 | 132 | |
128 | 133 | #endif /* _SMB2PROTO_H */ |