Skip to content

Commit 16e0068

Browse files
author
Steve French
committed
smb3: reenable swapfiles over SMB3 mounts
With the changes to folios/netfs it is now easier to reenable swapfile support over SMB3 which fixes various xfstests Reviewed-by: David Howells <dhowells@redhat.com> Suggested-by: David Howells <dhowells@redhat.com> Fixes: e1209d3 ("mm: introduce ->swap_rw and use it for reads from SWP_FS_OPS swap-space") Signed-off-by: Steve French <stfrench@microsoft.com>
1 parent 0450d20 commit 16e0068

File tree

3 files changed

+27
-1
lines changed

3 files changed

+27
-1
lines changed

fs/netfs/direct_write.c

Lines changed: 2 additions & 1 deletion
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/file.c

Lines changed: 23 additions & 0 deletions
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
/*

include/linux/netfs.h

Lines changed: 2 additions & 0 deletions
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)