Skip to content

Commit c133204

Browse files
committed
Merge tag '6.10-rc-smb3-fixes-part2' of git://git.samba.org/sfrench/cifs-2.6
Pull smb client fixes from Steve French: - two important netfs integration fixes - including for a data corruption and also fixes for multiple xfstests - reenable swap support over SMB3 * tag '6.10-rc-smb3-fixes-part2' of git://git.samba.org/sfrench/cifs-2.6: cifs: Fix missing set of remote_i_size cifs: Fix smb3_insert_range() to move the zero_point cifs: update internal version number smb3: reenable swapfiles over SMB3 mounts
2 parents 9b62e02 + 93a4315 commit c133204

File tree

6 files changed

+34
-6
lines changed

6 files changed

+34
-6
lines changed

fs/netfs/direct_write.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ static void netfs_cleanup_dio_write(struct netfs_io_request *wreq)
2727
* Perform an unbuffered write where we may have to do an RMW operation on an
2828
* encrypted file. This can also be used for direct I/O writes.
2929
*/
30-
static ssize_t netfs_unbuffered_write_iter_locked(struct kiocb *iocb, struct iov_iter *iter,
30+
ssize_t netfs_unbuffered_write_iter_locked(struct kiocb *iocb, struct iov_iter *iter,
3131
struct netfs_group *netfs_group)
3232
{
3333
struct netfs_io_request *wreq;
@@ -117,6 +117,7 @@ static ssize_t netfs_unbuffered_write_iter_locked(struct kiocb *iocb, struct iov
117117
netfs_put_request(wreq, false, netfs_rreq_trace_put_return);
118118
return ret;
119119
}
120+
EXPORT_SYMBOL(netfs_unbuffered_write_iter_locked);
120121

121122
/**
122123
* netfs_unbuffered_write_iter - Unbuffered write to a file

fs/smb/client/cifsfs.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -1226,7 +1226,7 @@ static loff_t cifs_remap_file_range(struct file *src_file, loff_t off,
12261226
struct cifsFileInfo *smb_file_src = src_file->private_data;
12271227
struct cifsFileInfo *smb_file_target = dst_file->private_data;
12281228
struct cifs_tcon *target_tcon, *src_tcon;
1229-
unsigned long long destend, fstart, fend, new_size;
1229+
unsigned long long destend, fstart, fend, old_size, new_size;
12301230
unsigned int xid;
12311231
int rc;
12321232

@@ -1293,6 +1293,7 @@ static loff_t cifs_remap_file_range(struct file *src_file, loff_t off,
12931293
goto unlock;
12941294
if (fend > target_cifsi->netfs.zero_point)
12951295
target_cifsi->netfs.zero_point = fend + 1;
1296+
old_size = target_cifsi->netfs.remote_i_size;
12961297

12971298
/* Discard all the folios that overlap the destination region. */
12981299
cifs_dbg(FYI, "about to discard pages %llx-%llx\n", fstart, fend);
@@ -1305,9 +1306,8 @@ static loff_t cifs_remap_file_range(struct file *src_file, loff_t off,
13051306
if (target_tcon->ses->server->ops->duplicate_extents) {
13061307
rc = target_tcon->ses->server->ops->duplicate_extents(xid,
13071308
smb_file_src, smb_file_target, off, len, destoff);
1308-
if (rc == 0 && new_size > i_size_read(target_inode)) {
1309+
if (rc == 0 && new_size > old_size) {
13091310
truncate_setsize(target_inode, new_size);
1310-
netfs_resize_file(&target_cifsi->netfs, new_size, true);
13111311
fscache_resize_cookie(cifs_inode_cookie(target_inode),
13121312
new_size);
13131313
}

fs/smb/client/cifsfs.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,6 @@ extern const struct export_operations cifs_export_ops;
147147
#endif /* CONFIG_CIFS_NFSD_EXPORT */
148148

149149
/* when changing internal version - update following two lines at same time */
150-
#define SMB3_PRODUCT_BUILD 48
151-
#define CIFS_VERSION "2.48"
150+
#define SMB3_PRODUCT_BUILD 49
151+
#define CIFS_VERSION "2.49"
152152
#endif /* _CIFSFS_H */

fs/smb/client/file.c

+23
Original file line numberDiff line numberDiff line change
@@ -3189,6 +3189,28 @@ static void cifs_swap_deactivate(struct file *file)
31893189
/* do we need to unpin (or unlock) the file */
31903190
}
31913191

3192+
/**
3193+
* cifs_swap_rw - SMB3 address space operation for swap I/O
3194+
* @iocb: target I/O control block
3195+
* @iter: I/O buffer
3196+
*
3197+
* Perform IO to the swap-file. This is much like direct IO.
3198+
*/
3199+
static int cifs_swap_rw(struct kiocb *iocb, struct iov_iter *iter)
3200+
{
3201+
ssize_t ret;
3202+
3203+
WARN_ON_ONCE(iov_iter_count(iter) != PAGE_SIZE);
3204+
3205+
if (iov_iter_rw(iter) == READ)
3206+
ret = netfs_unbuffered_read_iter_locked(iocb, iter);
3207+
else
3208+
ret = netfs_unbuffered_write_iter_locked(iocb, iter, NULL);
3209+
if (ret < 0)
3210+
return ret;
3211+
return 0;
3212+
}
3213+
31923214
const struct address_space_operations cifs_addr_ops = {
31933215
.read_folio = netfs_read_folio,
31943216
.readahead = netfs_readahead,
@@ -3204,6 +3226,7 @@ const struct address_space_operations cifs_addr_ops = {
32043226
*/
32053227
.swap_activate = cifs_swap_activate,
32063228
.swap_deactivate = cifs_swap_deactivate,
3229+
.swap_rw = cifs_swap_rw,
32073230
};
32083231

32093232
/*

fs/smb/client/smb2ops.c

+2
Original file line numberDiff line numberDiff line change
@@ -2028,6 +2028,7 @@ smb2_duplicate_extents(const unsigned int xid,
20282028
* size will be queried on next revalidate, but it is important
20292029
* to make sure that file's cached size is updated immediately
20302030
*/
2031+
netfs_resize_file(netfs_inode(inode), dest_off + len, true);
20312032
cifs_setsize(inode, dest_off + len);
20322033
}
20332034
rc = SMB2_ioctl(xid, tcon, trgtfile->fid.persistent_fid,
@@ -3636,6 +3637,7 @@ static long smb3_insert_range(struct file *file, struct cifs_tcon *tcon,
36363637
rc = smb2_copychunk_range(xid, cfile, cfile, off, count, off + len);
36373638
if (rc < 0)
36383639
goto out_2;
3640+
cifsi->netfs.zero_point = new_eof;
36393641

36403642
rc = smb3_zero_data(file, tcon, off, len, xid);
36413643
if (rc < 0)

include/linux/netfs.h

+2
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,8 @@ ssize_t netfs_perform_write(struct kiocb *iocb, struct iov_iter *iter,
400400
ssize_t netfs_buffered_write_iter_locked(struct kiocb *iocb, struct iov_iter *from,
401401
struct netfs_group *netfs_group);
402402
ssize_t netfs_unbuffered_write_iter(struct kiocb *iocb, struct iov_iter *from);
403+
ssize_t netfs_unbuffered_write_iter_locked(struct kiocb *iocb, struct iov_iter *iter,
404+
struct netfs_group *netfs_group);
403405
ssize_t netfs_file_write_iter(struct kiocb *iocb, struct iov_iter *from);
404406

405407
/* Address operations API */

0 commit comments

Comments
 (0)